【问题标题】:How to add new items to recyclerview from custom dialog fragment如何从自定义对话框片段将新项目添加到 recyclerview
【发布时间】:2021-12-23 18:40:43
【问题描述】:

我在片段中有一个 RecyclerView。我需要通过自定义对话框初始化添加新项目的片段。在对话框中,我需要获取图像的文本和 uri(在这种情况下,首先,只有文本以使其更易于理解)。我在从对话框片段中的编辑文本传递数据时遇到问题。

带有回收站视图的我的活动:

类 AddExerciseActivity : AppCompatActivity(),NoticeDialogFragment.NoticeDialogListener {

private lateinit var recyclerAdapter: RecyclerViewAdapter
private lateinit var exercisesList: ArrayList<ExercisesModel>
private lateinit var recyclerview: RecyclerView
private lateinit var addNewExerciseButton : ImageButton


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_add_new_exercise)
    init()
    addNewExerciseButton = findViewById(R.id.ib_addNewExercise)
    addNewExerciseButton.setOnClickListener {
        addNewExercise()
    }

}

private fun init(){
    exercisesList = ArrayList(ExercisesModel.createBaseList(20))
    setupRecyclerView()
}

private fun setupRecyclerView() {
    recyclerAdapter = RecyclerViewAdapter(this, exercisesList)
    recyclerview = findViewById(R.id.recycler_view)
    recyclerview.layoutManager = LinearLayoutManager(this)
    recyclerview.adapter = recyclerAdapter
    recyclerview.setHasFixedSize(true)
}

private fun addNewExercise(){
    val dialog = NoticeDialogFragment()
    dialog.show(supportFragmentManager, "NoticeDialogFragment")
    //Todo how to add new items from dialog 
    recyclerAdapter.notifyDataSetChanged()
}

override fun onDialogPositiveClick(dialog: DialogFragment) {
    TODO("Not yet implemented")
}

override fun onDialogNegativeClick(dialog: DialogFragment) {
    TODO("Not yet implemented")
}

}

我的对话片段:

类 NoticeDialogFragment : DialogFragment() {

internal lateinit var listener: NoticeDialogListener

interface NoticeDialogListener {
    fun onDialogPositiveClick(dialog: DialogFragment)
    fun onDialogNegativeClick(dialog: DialogFragment)
}

// Override the Fragment.onAttach() method to instantiate the NoticeDialogListener
override fun onAttach(context: Context) {
    super.onAttach(context)
    // Verify that the host activity implements the callback interface
    try {
        // Instantiate the NoticeDialogListener so we can send events to the host
        listener = context as NoticeDialogListener
    } catch (e: ClassCastException) {
        // The activity doesn't implement the interface, throw exception
        throw ClassCastException((context.toString() +
                " must implement NoticeDialogListener"))
    }
}

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {

    return activity?.let {
        val builder = AlertDialog.Builder(it)
        val inflater = requireActivity().layoutInflater;

        builder.setView(inflater.inflate(R.layout.dialog_signin, null))
            // Add action buttons
            .setPositiveButton(R.string.addExercise,
                DialogInterface.OnClickListener { dialog, id ->

                })
            .setNegativeButton(R.string.cancel,
                DialogInterface.OnClickListener { dialog, id ->
                    getDialog()?.cancel()
                })
        builder.create()
    } ?: throw IllegalStateException("Activity cannot be null")
}

}

【问题讨论】:

    标签: android android-recyclerview android-dialogfragment


    【解决方案1】:

    您需要将FragmentResultListener 添加到FragmentManager。这将允许DialogFragment 与创建它的Fragment/Activity 通信。

    这是一篇关于分解的精彩文章https://proandroiddev.com/android-fragments-fragment-result-805a6b2522ea

    如果您这样做,您将能够摆脱NoticeDialogListener

    一旦您设置了FragmentResultListener,那么您需要设置ExercisesModel Parcelable(如果尚未设置)。在对话框中,用户提供了构建ExercisesModel 所需的所有信息。当他们点击确认/确定时,你就打电话

        val bundle = bundleOf(
             "RESPONSE" to RESPONSE_OK, //Let the listener know ok/confirm was clicked.
             "EXERCISE_MODEL" to createdExerciseModel
        )
        parentFragmentManager.setFragmentResult("CREATE_EXERCISE_MODEL", bundle)
    

    里面原来的Fragment/Activity

    FragmentResultListener { requestKey: String, result: Bundle -> {
            if ("CREATE_EXERCISE_MODEL".equals(requestKey)) {
                var response = result.getCharSequence("RESPONSE")
                if (response.equals(RESPONSE_OK)) {
                    var exerciseModel = result.getParcelable("EXERCISE_MODEL")
                    // You will need to add an add method to the
                    // adapter to allow adding to it internal list.
                    // Notify the changes to the adapter.
                    recyclerAdapter.add(exerciseModel)
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-07-06
      • 1970-01-01
      • 1970-01-01
      • 2014-04-08
      • 2016-03-05
      • 2011-09-02
      • 1970-01-01
      • 2015-08-07
      • 1970-01-01
      相关资源
      最近更新 更多