如何保持RecyclerView';s按钮恭敬地点击-Android

如何保持RecyclerView';s按钮恭敬地点击-Android,android,android-button,android-recyclerview,Android,Android Button,Android Recyclerview,我有一个由CardView填充的RecyclerView。在每个CardView上都有一个按钮,用于向上投票 这是按钮未按下时的外观 这是按钮按下时的外观 我的代码可以实现这一点,但我有一个问题,因为它是一个回收视图。当我向下滚动帖子时,RecyclerView会回收以前投票过的帖子。因此,即使用户从未对其进行过投票,帖子也会显示其投票率已提高 如何保持每个CardView的按钮都被恭敬地按下 这是我的适配器 public class DiscoverRecyclerAdapter

我有一个由CardView填充的RecyclerView。在每个CardView上都有一个按钮,用于向上投票

这是按钮未按下时的外观

这是按钮按下时的外观

我的代码可以实现这一点,但我有一个问题,因为它是一个回收视图。当我向下滚动帖子时,RecyclerView会回收以前投票过的帖子。因此,即使用户从未对其进行过投票,帖子也会显示其投票率已提高

如何保持每个CardView的按钮都被恭敬地按下

这是我的适配器

public class DiscoverRecyclerAdapter
        extends RecyclerView.Adapter<DiscoverRecyclerAdapter.ViewHolder> {

    private String[] mDataset;

    Typeface customFont;

    // 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 {
        public TextView mTitle;
        public TextView mVoterCounter;
        public ImageButton mVoterButton;
        public ViewHolder(android.support.v7.widget.CardView v) {
            super(v);
            mTitle = (TextView) v.findViewById(R.id.title);
            mVoterCounter = (TextView) v.findViewById(R.id.voter_counter);

            //Initialize voter button
            mVoterButton = (ImageButton)v.findViewById(R.id.voter);

            mVoterButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mVoterButton.setImageResource(R.drawable.ic_voter_pressed);
                }
            });
        }
    }

    // Provide a suitable constructor (depends on the kind of dataset)
    public DiscoverRecyclerAdapter(String[] myDataset, Typeface passedFont) {
        mDataset = myDataset;
        customFont = passedFont;
    }

    // Create new views (invoked by the layout manager)
    @Override
    public DiscoverRecyclerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                   int viewType) {
        // create a new view
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_discover, parent, false);
        // set the view's size, margins, paddings and layout parameters
        return new ViewHolder((android.support.v7.widget.CardView)v);
    }

    // Replace the contents of a view (invoked by the layout manager)
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.mTitle.setText(mDataset[position]);
        holder.mTitle.setTypeface(customFont);
        holder.mVoterCounter.setTypeface(customFont);
    }

    // Return the size of your dataset (invoked by the layout manager)
    @Override
    public int getItemCount() {
        return mDataset.length;
    }
}
公共类DiscoveryRecyclerAdapter
扩展RecyclerView.Adapter{
私有字符串[]mDataset;
字体自定义字体;
//提供对每个数据项的视图的引用
//复杂数据项可能需要每个项有多个视图,并且
//您可以访问视图持有者中数据项的所有视图
公共静态类ViewHolder扩展了RecyclerView.ViewHolder{
公共文本视图mTitle;
公共文本视图mVoterCounter;
公共图像按钮mVoterButton;
公共视图持有者(android.support.v7.widget.cardwiew v){
超级(五);
mTitle=(文本视图)v.findViewById(R.id.title);
mVoterCounter=(TextView)v.findViewById(R.id.voter\u计数器);
//初始化投票按钮
mVoterButton=(ImageButton)v.findViewById(R.id.voter);
mVoterButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
mVoterButton.setImageResource(R.drawable.ic_-voter_按下);
}
});
}
}
//提供合适的构造函数(取决于数据集的类型)
public DiscoveryRecyclerAdapter(字符串[]myDataset,字体为passedFont){
mDataset=myDataset;
customFont=passedFont;
}
//创建新视图(由布局管理器调用)
@凌驾
public DiscoveryRecyclerAdapter.ViewHolder onCreateViewHolder(视图组父级、,
int视图类型){
//创建新视图
视图v=LayoutInflater.from(parent.getContext())
.充气(R.layout.item_discover,parent,false);
//设置视图的大小、边距、填充和布局参数
返回新的ViewHolder((android.support.v7.widget.CardView)v);
}
//替换视图的内容(由布局管理器调用)
@凌驾
公共无效onBindViewHolder(ViewHolder,int位置){
holder.mTitle.setText(mDataset[position]);
holder.mTitle.setTypeface(自定义字体);
holder.mVoterCounter.setTypeface(自定义字体);
}
//返回数据集的大小(由布局管理器调用)
@凌驾
public int getItemCount(){
返回mDataset.length;
}
}

您需要清除onBindViewHolder开头所有先前数据的“上一行”视图

在您的情况下,似乎需要将视图组件的所有可见性参数清除为默认值。之后,继续使用数据填充卡

由于传入的数据集只是一个字符串,因此您需要调用自己的API来获取投票计数/状态。或者将数据集更改为自定义对象数组,该数组跟踪设置和记录每张卡的数据所需的所有不同组件


简言之:随着视图被回收,您需要在重新使用之前对其进行清理。

与mDataset一起,您还需要一个布尔数组,比如mIsSelected 现在,它的大小将等于数组mDataSet的大小,若需要,可以创建类

然后在onBindViewHolder中执行以下操作

 if(mIsSelected[position]
  mVoterButton.setImageResource(R.drawable.ic_voter_pressed);
else
 mVoterButton.setImageResource(R.drawable.ic_voter_unpressed);
并按如下所示在BindViewHolder内单击“移动”按钮

 holder.mVoterButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
              mVoterButton.setImageResource(R.drawable.ic_voter_pressed);
              mIsSelected[position] = true;
            }
        });

这种方法对我有效。当我从数据库中检索数据时,我不确定它的工作情况如何,但是对于布尔数组的硬编码,它工作得很好。