如何保持RecyclerView';s按钮恭敬地点击-Android
我有一个由CardView填充的RecyclerView。在每个CardView上都有一个按钮,用于向上投票 这是按钮未按下时的外观 这是按钮按下时的外观 我的代码可以实现这一点,但我有一个问题,因为它是一个回收视图。当我向下滚动帖子时,RecyclerView会回收以前投票过的帖子。因此,即使用户从未对其进行过投票,帖子也会显示其投票率已提高 如何保持每个CardView的按钮都被恭敬地按下 这是我的适配器如何保持RecyclerView';s按钮恭敬地点击-Android,android,android-button,android-recyclerview,Android,Android Button,Android Recyclerview,我有一个由CardView填充的RecyclerView。在每个CardView上都有一个按钮,用于向上投票 这是按钮未按下时的外观 这是按钮按下时的外观 我的代码可以实现这一点,但我有一个问题,因为它是一个回收视图。当我向下滚动帖子时,RecyclerView会回收以前投票过的帖子。因此,即使用户从未对其进行过投票,帖子也会显示其投票率已提高 如何保持每个CardView的按钮都被恭敬地按下 这是我的适配器 public class DiscoverRecyclerAdapter
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;
}
});
这种方法对我有效。当我从数据库中检索数据时,我不确定它的工作情况如何,但是对于布尔数组的硬编码,它工作得很好。