簡體   English   中英

如何刪除 kotlin 中的第一個視圖尋呼機項目?

[英]How to remove first view pager item in kotlin?

我在我的應用程序中使用 View-Pager2,它顯示了幾個相同的片段。 我還有一個對話框片段,在其中,我管理視圖尋呼機項目(添加和刪除項目)。 view-pager 中的每個片段都有一個保存在 SQLite 數據庫中的 id。

所以,我的問題是,當我刪除 view-pager 的第一項時,它不會刪除並且仍然保留,但刪除了另一個項,當我再次啟動應用程序時,我看到第一項已被刪除並且一切正常。

錄像

主要活動 Class:

class MainActivity : AppCompatActivity() {

private lateinit var databaseHelper: DatabaseHelper
private lateinit var myPagerAdapter: MyPagerAdapter

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    databaseHelper = DatabaseHelper(this)
    myPagerAdapter = MyPagerAdapter(supportFragmentManager, lifecycle)
    view_pager.adapter = myPagerAdapter

    if (databaseHelper.getCount().toInt() == 0) {
        //red
        databaseHelper.insertData(0, Color.argb(255, 244, 67, 54))
        //blue
        databaseHelper.insertData(1, Color.argb(255, 33, 150, 243))
        //green
        databaseHelper.insertData(2, Color.argb(255, 76, 175, 80))
    }

    btn_show.setOnClickListener {
        val ft = supportFragmentManager.beginTransaction()
        ft.add(FragmentTwo(), "Dialog")
        ft.addToBackStack(null)
        ft.commit()
    }

}

private inner class MyPagerAdapter(fragmentManager: FragmentManager, lifecycle: Lifecycle) :
    FragmentStateAdapter(fragmentManager, lifecycle) {

    override fun getItemCount(): Int {
        return databaseHelper.getCount().toInt()
    }

    override fun createFragment(position: Int): Fragment {
        return FragmentOne.newInstance(position)
    }

}

fun setViewPagerPosition(position: Int) {
    view_pager.currentItem = position
}

fun setViewPagerChanged() {
    myPagerAdapter.notifyDataSetChanged()
}
}

FragmentOne class:

class FragmentOne : Fragment() {

companion object {
    fun newInstance(position: Int): FragmentOne {
        val fragment = FragmentOne()
        val bundle = Bundle()
        bundle.putInt("id", position)
        fragment.arguments = bundle
        return fragment
    }
}

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    return inflater.inflate(R.layout.fragment_one, container, false)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    val databaseHelper = DatabaseHelper(context)
    val id = arguments?.getInt("id")
    frame_frag1?.setBackgroundColor(databaseHelper.getColor(id))
}

}

FragmentTwo class(對話片段):

class FragmentTwo : DialogFragment() {

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_dialog, container, false)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    val databaseHelper = DatabaseHelper(context)
    btn_remove?.setOnClickListener {
        (context as MainActivity).setViewPagerPosition(2)
        databaseHelper.deleteData("0")
        databaseHelper.updateRowsRemoveTab(id)
        (context as MainActivity).setViewPagerChanged()
    }
}

}

及其DatabaseHelper class:

class DatabaseHelper(context: Context?) : SQLiteOpenHelper(context, "tabs.db", null, 1) {

private val TBL_NAME: String = "tabs"

override fun onCreate(db: SQLiteDatabase?) {
    db?.execSQL("CREATE TABLE $TBL_NAME (ID INTEGER , COLOR INTEGER)")
}

override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
    db?.execSQL("DROP TABLE IF EXISTS $TBL_NAME")
    onCreate(db)
}

fun insertData(id: Int, color: Int) {
    val db = this.writableDatabase
    val cv = ContentValues()
    cv.put("ID", id)
    cv.put("COLOR", color)
    db.insert(TBL_NAME, null, cv)
}

fun getColor(id: Int?): Int {
    val db = this.readableDatabase
    var color = 0
    val cursor = db.rawQuery("select COLOR from $TBL_NAME where ID = $id", null)
    if (cursor.moveToFirst())
        do {
            color = (cursor.getInt(0))
        } while (cursor.moveToNext())
    return color
}

fun updateRowsRemoveTab(id: Int) {
    val db = this.writableDatabase
    db.execSQL("update tabs set ID = ID-1 where ID > $id")
}

fun deleteData(id: String) {
    val db = this.writableDatabase
    db.delete(TBL_NAME, "ID = ?", arrayOf(id)).toLong()
}

fun getCount(): Long {
    val db = this.readableDatabase
    val count = DatabaseUtils.queryNumEntries(db, TBL_NAME)
    db.close()
    return count
}

}

你能幫助我嗎?

我在沒有 viewpager2 的情況下做你的事,沒關系。 我復制您的代碼,然后將您的視圖尋呼機適配器編輯為:

    private inner class MyPagerAdapter(fragmentManager: FragmentManager) :
    FragmentPagerAdapter(fragmentManager) {

    override fun getItem(position: Int): Fragment {
        return FragmentOne.newInstance(position)
    }

    override fun getCount(): Int {
        return databaseHelper.getCount().toInt()
    }

    override fun getItemPosition(`object`: Any): Int {
        return PagerAdapter.POSITION_NONE
    }
}

不要忘記將PagerAdapter.POSITION_NONE添加到getItemPosition方法。

這種方式是正確的,但我不知道如何用 viewpager2 做到這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM