从recyclerview中删除项目(viewholder具有onClick但适配器具有数据集)

问题描述 投票:3回答:2

我想在按下项目中的视图时从recyclerview中删除项目。

情况:使用带有数据集的RecyclerView制作一个列表,并且ViewHolder在视图上有onClick用于从列表中删除项目,我需要知道ViewHolder上点击了哪个项目并将其发送到适配器,因为适配器具有数据集。在ViewHolder中我可以知道用这个方法按下了哪个项目:getAdapterPosition(),所以似乎很容易知道要删除哪个项目。

问题:ViewHolderRecyclerView.Adapter中的一个子类,而Adapter有数据集,所以我试图了解哪个是查看者通信必须删除已被点击的项的适配器的最佳方式。

最新技术:我可以在stackoverflow中看到一些问题,其中一些是旧的,其中一些更新,例如:Android RecyclerView addition & removal of items但解决方案没有说明如何通信必须删除项目的适配器。用户可能正在使用静态字段或其他东西,但它不是实现这一目标的好方法。我无法看到其他问题中解释的其他方式。

这是来自官方Recycler指南的示例,您可以在其中看到ViewHolder嵌套在Adapter中并且无法访问它:qazxsw poi

https://developer.android.com/guide/topics/ui/layout/recyclerview.html

谢谢您的帮助。

android android-recyclerview recycler-adapter android-viewholder
2个回答
1
投票

我喜欢public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private String[] mDataset; // Provide a reference to the views for each data item // Complex data items may need more than one view per item, and // you provide access to all the views for a data item in a view holder public static class ViewHolder extends RecyclerView.ViewHolder { // each data item is just a string in this case public TextView mTextView; public ViewHolder(TextView v) { super(v); mTextView = v; } } // Provide a suitable constructor (depends on the kind of dataset) public MyAdapter(String[] myDataset) { mDataset = myDataset; } // Create new views (invoked by the layout manager) @Override public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { // create a new view TextView v = (TextView) LayoutInflater.from(parent.getContext()) .inflate(R.layout.my_text_view, parent, false); ... ViewHolder vh = new ViewHolder(v); return vh; } // Replace the contents of a view (invoked by the layout manager) @Override public void onBindViewHolder(ViewHolder holder, int position) { // - get element from your dataset at this position // - replace the contents of the view with that element holder.mTextView.setText(mDataset[position]); } // Return the size of your dataset (invoked by the layout manager) @Override public int getItemCount() { return mDataset.length; } } ,因为他们有一个定制的RecyclerView example by BigNerdRanch和一个方法(在示例中为ViewHolder),它是从bindCrime()调用的。此方法从数据列表中获取项目,并根据项目的内容设置所有onBindViewHolder()s。

您可以使用类似的方法,让我们称之为View,不仅传入数据列表中的项目,还传递自定义回调的[匿名实例],我们称之为bindData(),实际上只是一些接口:

ViewHolderCallback

然后interface ViewHolderCallback{ void itemWasClicked(int position); } 看起来像这样:

onBindViewHolder()

...和bindData()这样:

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    // - get element from your dataset at this position
    // - replace the contents of the view with that element
    holder.bindData(mDataset[position], new ViewHolderCallback(){

        @Override
        public void itemWasClicked(int position){
             // remove the item 
        }
    });
}

0
投票

最后我通过更简单的方式解决了它,我刚刚添加了用于删除适配器的onBindViewHolder方法中的项的侦听器:

void bindData(String text, ViewHolderCallback callback){
    mTextView.setText(text);
    itemView.setOnClickListener(new View.OnClickListener(){

        @Override
        public void onClick(View view){
             callback.itemWasClicked(getAdapterPosition()); 
        }
    });
}

像魅力一样工作

© www.soinside.com 2019 - 2024. All rights reserved.