如何保持 RecyclerView 的按钮被恭敬地点击 - Android
How to Keep RecyclerView's Buttons Clicked Respectfully - Android
我有一个填充了 CardView 的 RecyclerView。在每个 CardView 上都有一个按钮,该按钮对 post 投赞成票。
这是未按下按钮时的样子,
这是按下按钮时的样子,
我的代码可以实现这一点,但我遇到了一个问题,因为它是一个 RecyclerView。当我向下滚动 posts 时,RecyclerView 会回收之前投票的 posts。因此 post 将显示它已被投票,即使用户从未投票过。
如何让每个 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;
}
}
您需要在onBindViewHolder 的开头清除所有先前数据的先前行视图。
在您的情况下,您似乎需要将视图组件的所有可见性参数清除为您认为的默认值。之后继续用数据填充卡片。
由于您传入的数据集只是一个字符串,因此您需要调用自己的 API 来获取赞成票数/状态。或者将您的数据集更改为自定义对象数组,该数组跟踪您设置和记录每张卡片数据所需的所有不同组件。
简而言之:随着视图被回收,您需要在重新使用之前清理它们。
除了 mDataset,您还需要一个布尔数组,比如 mIsSelected
现在它的大小将等于数组 mDataSet 的大小,或者如果需要,可以创建 class。
然后在onBindViewHolder中做
if(mIsSelected[position]
mVoterButton.setImageResource(R.drawable.ic_voter_pressed);
else
mVoterButton.setImageResource(R.drawable.ic_voter_unpressed);
并将按钮 onclick 移动到 onBindViewHolder 中,如下所示
holder.mVoterButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mVoterButton.setImageResource(R.drawable.ic_voter_pressed);
mIsSelected[position] = true;
}
});
我有一个填充了 CardView 的 RecyclerView。在每个 CardView 上都有一个按钮,该按钮对 post 投赞成票。
这是未按下按钮时的样子,
这是按下按钮时的样子,
我的代码可以实现这一点,但我遇到了一个问题,因为它是一个 RecyclerView。当我向下滚动 posts 时,RecyclerView 会回收之前投票的 posts。因此 post 将显示它已被投票,即使用户从未投票过。
如何让每个 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;
}
}
您需要在onBindViewHolder 的开头清除所有先前数据的先前行视图。
在您的情况下,您似乎需要将视图组件的所有可见性参数清除为您认为的默认值。之后继续用数据填充卡片。
由于您传入的数据集只是一个字符串,因此您需要调用自己的 API 来获取赞成票数/状态。或者将您的数据集更改为自定义对象数组,该数组跟踪您设置和记录每张卡片数据所需的所有不同组件。
简而言之:随着视图被回收,您需要在重新使用之前清理它们。
除了 mDataset,您还需要一个布尔数组,比如 mIsSelected 现在它的大小将等于数组 mDataSet 的大小,或者如果需要,可以创建 class。
然后在onBindViewHolder中做
if(mIsSelected[position]
mVoterButton.setImageResource(R.drawable.ic_voter_pressed);
else
mVoterButton.setImageResource(R.drawable.ic_voter_unpressed);
并将按钮 onclick 移动到 onBindViewHolder 中,如下所示
holder.mVoterButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mVoterButton.setImageResource(R.drawable.ic_voter_pressed);
mIsSelected[position] = true;
}
});