【问题标题】:how to remove the exact item from recyclerview in android studio?如何从 android studio 的 recyclerview 中删除确切的项目?
【发布时间】:2023-02-23 06:39:59
【问题描述】:

我试图从 recyclerview 中删除该项目,但在删除它后总是删除最后一个位置,我不明白为什么它没有删除我删除的确切位置

如果有人能帮我解决这个问题

这是我的代码

  holder.items_image.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            item_card.setVisibility(View.VISIBLE);
            item_delete_layer.setVisibility(View.VISIBLE);
            final String path = imageList.get(position).getPath();
                SharedPreferences sharedPreferences = context.getSharedPreferences("path", Context.MODE_PRIVATE);
                SharedPreferences.Editor editor = sharedPreferences.edit();
                editor.putString("filePath", path);
                editor.apply();
        }
    });


item_delete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            item_card.setVisibility(View.GONE);
            item_delete_layer.setVisibility(View.GONE);
            SharedPreferences sharedPreferences = context.getSharedPreferences("path", Context.MODE_PRIVATE);
            String path = sharedPreferences.getString("filePath","");
            File fdelete = new File(path);
            if (fdelete.delete()){
                imageList.remove(position);
                notifyDataSetChanged();
                Toast.makeText(context, "File deleted", Toast.LENGTH_SHORT).show();
            }else {
                Toast.makeText(context, "Can't delete file", Toast.LENGTH_SHORT).show();
            }
        }
    });


 item_cancel.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            item_card.setVisibility(View.GONE);
            item_delete_layer.setVisibility(View.GONE);
            SharedPreferences sharedPreferences = context.getSharedPreferences("path",Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = sharedPreferences.edit();
            editor.clear();
            editor.apply();


        }
    });

【问题讨论】:

  • 您只需要从在 recyclerview 中传递的列表中删除项目,然后使用 notify 方法刷新 recyclerview。
  • 使用 notifyItemRemoved 而不是 notifyDatasetChanged
  • @HaseebHassanAsif 它显示了同样的问题
  • @AishaKumari 请分享您的适配器代码,以便我们进一步了解问题。

标签: java android android-recyclerview


【解决方案1】:

通过将点击侦听器放在 RecyclerView.Adapter 中,您将引用该项目的过时位置。

而是将点击侦听器放在 ViewHolder 中。您可以使用 layoutPosition 或 absoluteAdapterPosition 适配器

override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        val item = items[position]
        Log.d(tag, "onBindViewHolder - item at $position is ${item.content}")

        val listener = object : ItemDeleteListener {
            override fun delete(position: Int) {
                items.removeAt(position)
                notifyItemRemoved(position)
            }
        }
        
        holder.bind(item, listener)
    }

ViewHolder

fun bind(item: DummyData, listener: ItemDeleteListener) {
        binding.title.text = "${item.content}"

        binding.cta.setOnClickListener {
            listener.delete(layoutPosition)
        }
    }

提示:尽量不要使用notifyDataSetChanged(),因为它很贵

关于如何处理删除的更多细节,你可以看看我的这个教程 (您也可以使用示例 GitHub 存储库) https://medium.com/@ericntd/recyclerview-how-to-handle-insertion-and-deletion-334a38104de8

【讨论】:

    猜你喜欢
    • 2018-04-25
    • 2017-12-15
    • 2018-06-11
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多