如何将一个 Cursor 实例从一个片段发送到一个片段,该片段包含一个在 kotlin 中具有相同活动的回收视图

问题描述

我仍在做应用程序开发的第一步,所以我很感激对我的代码的任何反馈。 我的问题。我得到了两个片段,“ListFragment.kt”和“SetListFilters.kt”。我的目的是在 SetListFilters 中创建一个游标实例,然后当我按下“应用”按钮时,我在将游标实例发送到 ListFrament 的同时执行 popBackStack。据我了解,ListFragment 将调用 OnCreateView() 并且我想将新光标传递给我的适配器,以便对 Recyclerview 进行过滤。我尝试了很多东西,但没有任何效果对我有用。我希望你能帮助我。这是我的代码:

class SetListFilters(var transactionDB: SQLiteDatabase,var adapter: TransactionAdapter):Fragment(R.layout.fragment_set_list_filters),DataPassListener {

private lateinit var gridView           : GridView
private lateinit var btnYearFilter      : Button
private lateinit var btnMonthFilter     : Button
private lateinit var btnWeekFilter      : Button
private lateinit var btnRevenueFilter   : Button
private lateinit var btnExpeneseFilter  : Button
private lateinit var btnNeutralFilter   : Button
private lateinit var btnSbmtFilter      : Button
private lateinit var tvShowAmountFilter : TextView
private lateinit var sbAmountFilters    : SeekBar

private val viewModel: ListViewModel by activityViewModels()

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
}

override fun onCreateView(inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?
): View? {
    val view = inflater.inflate(R.layout.fragment_set_list_filters,container,false)

    setUpViews(view)
    setUpButtonOnclick()
    setUpSeekbar()

    val arrayAdapter: ArrayAdapter<CategoryEnum> = ArrayAdapter<CategoryEnum>(activity!!,android.R.layout.simple_list_item_multiple_choice,CategoryEnum.values())

    gridView.setAdapter(arrayAdapter)

    // When the user clicks on the GridItem
    /*gridView.setOnItemClickListener(OnItemClickListener { a,v,position,id ->
        val o: Any = gridView.getItemAtPosition(position)
    })*/


    return view
}

override fun onViewCreated(view: View,savedInstanceState: Bundle?) {
    super.onViewCreated(view,savedInstanceState)
    viewModel.filters.observe(viewLifecycleOwner,Observer { set ->
        // Update the selected filters UI
    }
}
fun onFilterSelected(filter: Filter) = viewModel.addFilter(filter)

fun onFilterDeselected(filter: Filter) = viewModel.removeFilter(filter)

private fun upDateQueryForDB(){

}

private fun getAllItemsNeu(): Cursor {
    val selArgs = arrayOf("r")
    return transactionDB!!.query(
            TransactionList.TransactionEntry.TABLE_NAME,null,"type = ?",selArgs,TransactionList.TransactionEntry.COLUMN_CREATEDAT + " DESC")
}

private fun setUpViews(view: View){
    gridView            = view.findViewById(R.id.gvCategoryFilter )
    btnExpeneseFilter   = view.findViewById(R.id.btnExpenseFilter)
    btnMonthFilter      = view.findViewById(R.id.btnMonthFilter)
    btnWeekFilter       = view.findViewById(R.id.btnWeekFilter)
    btnNeutralFilter    = view.findViewById(R.id.btnNeutralFilter)
    btnRevenueFilter    = view.findViewById(R.id.btnRevenueFilter)
    btnSbmtFilter       = view.findViewById(R.id.btnSbmtFilter)
    btnYearFilter       = view.findViewById(R.id.btnYearFilter)
    sbAmountFilters     = view.findViewById(R.id.seekBar)
    tvShowAmountFilter  = view.findViewById(R.id.tvFilterAmount)
}

private fun setUpButtonOnclick(){
    btnExpeneseFilter.setOnClickListener { changeButtonAppearance(btnExpeneseFilter) }
    btnMonthFilter.setOnClickListener { changeButtonAppearance(btnMonthFilter) }
    btnWeekFilter.setOnClickListener { changeButtonAppearance(btnWeekFilter) }
    btnNeutralFilter.setOnClickListener { changeButtonAppearance(btnNeutralFilter) }
    btnRevenueFilter.setOnClickListener { changeButtonAppearance(btnRevenueFilter) }
    btnYearFilter.setOnClickListener { changeButtonAppearance(btnYearFilter) }
    btnSbmtFilter.setOnClickListener{
        mainActivity.passDataCom(getAllItemsNeu())
        activity!!.supportFragmentManager.popBackStack()
    }
}

private fun changeButtonAppearance(button:Button) {
    if(button.tag == "notPressed"){
        button.setBackgroundResource(R.drawable.rounded_select_button_pressed)
        button.setTextColor(Color.WHITE)
        button.tag = "pressed"
    }else{
        button.setBackgroundResource(R.drawable.rounded_select_button)
        button.setTextColor(ContextCompat.getColor(context!!,R.color.mainBlue))
        button.tag  ="notPressed"
    }
}

private fun setUpSeekbar(){
    sbAmountFilters.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {

        override fun onProgressChanged(seekBar: SeekBar,i: Int,b: Boolean) {
            // Display the current progress of SeekBar
            tvShowAmountFilter.text = "< $i"
        }
        override fun onStartTrackingTouch(seekBar: SeekBar) {
            // Do something
            //Toast.makeText(context!!,"start tracking",Toast.LENGTH_SHORT).show()
        }

        override fun onStopTrackingTouch(seekBar: SeekBar) {
            // Do something
            //Toast.makeText(context!!,"stop tracking",Toast.LENGTH_SHORT).show()
            if(tvShowAmountFilter.text.toString()=="< 0"){
                tvShowAmountFilter.text = "none"
            }
        }
    })
}

override fun onAttach(context: Context) {
    super.onAttach(context)

    try{
        mCallback = (OnImageClickListener) //folled the tutorial,dont know what to replace it with
    }
}

}

class ListFragment:Fragment(R.layout.fragment_list) {

lateinit var transactionDB      : SQLiteDatabase
lateinit var adapter            : TransactionAdapter
private lateinit var filterBtn  : ImageButton
private lateinit var flActBtn   : FloatingActionButton
var mCursorFilter               : Cursor?    = null

private val viewModel: ListViewModel by activityViewModels()


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    val dbHelper = TransactionDBHelper(activity)
    transactionDB = dbHelper.writableDatabase

    adapter = TransactionAdapter(activity!!,getAllItems())

}

override fun onViewCreated(view: View,savedInstanceState)
    viewModel.filteredList.observe(viewLifecycleOwner,Observer { list ->
        //TODO
    }
}
private fun addRandomTransactionItem() {
    var a = 1234.56
    for (i in 0..10) {
        if(i%2==0){
        transactionDB.execSQL("INSERT INTO transactionList (type,amount,category,createdAt) VALUES('r',${a},'K',CURRENT_TIMESTAMP)")
        adapter.swapCursor(getAllItems())
        }else if(i%5==0){
            transactionDB.execSQL("INSERT INTO transactionList (type,createdAt) VALUES('ne',CURRENT_TIMESTAMP)")
            adapter.swapCursor(getAllItems())
        }else if(i%6==0){
            transactionDB.execSQL("INSERT INTO transactionList (type,CURRENT_TIMESTAMP)")
            adapter.swapCursor(getAllItems())
        }else{
            transactionDB.execSQL("INSERT INTO transactionList (type,createdAt) VALUES('e',CURRENT_TIMESTAMP)")
            adapter.swapCursor(getAllItems())
        }
    }
}

private fun getAllItems(): Cursor {
    return transactionDB!!.query(
            TransactionList.TransactionEntry.TABLE_NAME,TransactionList.TransactionEntry.COLUMN_CREATEDAT + " DESC")
}

override fun onCreateView(inflater: LayoutInflater,savedInstanceState: Bundle?
): View? {

    val view = inflater.inflate(R.layout.fragment_list,false)
    val rvRecyclerView = view.findViewById<RecyclerView>(R.id.rvRecyclerView)

    rvRecyclerView.layoutManager = LinearLayoutManager(activity)

    if(mCursorFilter!=null){
        adapter.swapCursor(mCursorFilter!!)
    }
    rvRecyclerView.adapter = this.adapter

    rvRecyclerView.addItemDecoration(MarginItemDecoration(10))

    flActBtn = view.findViewById(R.id.floatingActionButton)
    flActBtn.setOnClickListener {
        var ft:FragmentTransaction = activity!!.supportFragmentManager.beginTransaction()
            ft.replace(R.id.flFrameLayout,AddItemFragment(transactionDB,adapter))
            ft.addToBackStack(null)
            ft.commit()
    }

    filterBtn=view.findViewById(R.id.ibFilterBtn)
    filterBtn.setOnClickListener {
        var ft:FragmentTransaction = activity!!.supportFragmentManager.beginTransaction()
        ft.replace(R.id.flFrameLayout,SetListFilters(transactionDB,adapter))
        ft.addToBackStack(null)
        ft.commit()
    }
    addRandomTransactionItem()
    return view
}
}

class MainActivity() : AppCompatActivity() {

var mCursorFilters: Cursor? = null

private val viewModel: ItemViewModel by viewModels()

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    viewModel.selectedItem.observe(this,Observer { item ->
        // TODO
    })

    val homeFragment = HomeFragment()
    val listFragment = ListFragment()
    val profileFragment = ProfileFragment()

    setCurrentFragment(homeFragment)

    val bottomNavigationView = findViewById<BottomNavigationView>(R.id.bottomNavigationView)
    bottomNavigationView.setOnNavigationItemSelectedListener {
        var ft: FragmentTransaction = this.supportFragmentManager.beginTransaction()

        when (it.itemId) {
            R.id.pageHome -> ft.replace(R.id.flFrameLayout,homeFragment) // setCurrentFragment(homeFragment)
            R.id.pageList -> ft.replace(R.id.flFrameLayout,listFragment) //setCurrentFragment(listFragment)
            R.id.pageProfile -> ft.replace(R.id.flFrameLayout,profileFragment) //setCurrentFragment(profileFragment)
        }
        // ft.replace(R.id.flFrameLayout,AddItemFragment())
        ft.addToBackStack(null)
        ft.commit()
        true
    }
}

private fun setCurrentFragment(fragment: Fragment){
    supportFragmentManager.beginTransaction().apply {
        replace(R.id.flFrameLayout,fragment)
        commit()
    }
}
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...