Android 在“回收器”视图中滚动时,为什么会自动选择另一个位置的按钮
我使用recycler视图显示包含12项的列表。3到4个项目将可同时查看。我在每一排卡片上都显示了更多的按钮。如果我单击第一行的“显示更多”按钮,当我向下滚动时,将自动选择另一行的“显示更多”按钮。为什么会发生这种情况,我如何解决这个问题 下面是如何设置适配器的代码:Android 在“回收器”视图中滚动时,为什么会自动选择另一个位置的按钮,android,android-recyclerview,Android,Android Recyclerview,我使用recycler视图显示包含12项的列表。3到4个项目将可同时查看。我在每一排卡片上都显示了更多的按钮。如果我单击第一行的“显示更多”按钮,当我向下滚动时,将自动选择另一行的“显示更多”按钮。为什么会发生这种情况,我如何解决这个问题 下面是如何设置适配器的代码: ToadlineAdapter toadlineAdapter = new ToadlineAdapter(mContext, getData1()); recyclerView.setAdapter(toadlineAdapt
ToadlineAdapter toadlineAdapter = new ToadlineAdapter(mContext, getData1());
recyclerView.setAdapter(toadlineAdapter);
toadlineAdapter.setClickListener(this);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
我的适配器代码:
public class ToadlineAdapter extends RecyclerView.Adapter<ToadlineAdapter.MyViewHolder> implements ToadlineCommentAdapter.ClickListener {
private ClickListener clickListener;
private SwipeRefreshLayout.OnRefreshListener clickListener1;
private LayoutInflater inflater;
Context mContext;
List<TimelineDataStore> data = Collections.EMPTY_LIST;
public ToadlineAdapter(Context context, List<TimelineDataStore> data) {
inflater = LayoutInflater.from(context);
this.data = data;
mContext = context;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.single_card_row, parent, false);
MyViewHolder viewHolder = new MyViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
TimelineDataStore current = data.get(position);
if (clickedPosition.equals("post")) {
holder.postHeader.setText(current.postHeader);
holder.postDescription.setText(current.postDescription);
}
}
@Override
public int getItemCount() {
return data.size();
}
public void setClickListener(ClickListener clickListener) {
this.clickListener = clickListener;
}
public void setClickListener1(SwipeRefreshLayout.OnRefreshListener clickListener1) {
this.clickListener1 = clickListener1;
}
@Override
public void itemClicked(View view, int position) {
}
// View Holder object for Recycler View
class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, SwipeRefreshLayout.OnRefreshListener, ToadlineCommentAdapter.ClickListener {
TextView postHeader, postDescription;
public MyViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener((View.OnClickListener) this);
postHeader = (TextView) itemView.findViewById(R.id.textViewTitle);
postDescription = (TextView) itemView.findViewById(R.id.textViewPostDescription);
mCardView = (CardView) itemView.findViewById(R.id.card_view);
mShowMore = (ImageButton) itemView.findViewById(R.id.buttonSeeMore);
mShowLess = (ImageButton) itemView.findViewById(R.id.buttonSeeLess);
mShowMore.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int clickedPosition = getAdapterPosition();
TimelineDataStore current = data.get(clickedPosition);
current.postDescription = data.get(clickedPosition).postDescription;
postDescription.setVisibility(View.VISIBLE);
pollPostImages.setVisibility(View.VISIBLE);
mShowMore.setVisibility(View.GONE);
mShowLess.setVisibility(View.VISIBLE);
}
});
mShowLess.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
postDescription.setVisibility(View.GONE);
pollPostImages.setVisibility(View.GONE);
mShowMore.setVisibility(View.VISIBLE);
mShowLess.setVisibility(View.GONE);
}
});
}
公共类ToadlineAdapter扩展了RecyclerView。适配器实现ToadlineCommentAdapter.ClickListener{
私有ClickListener ClickListener;
私有SwipeRefreshLayout.on刷新侦听器clickListener1;
私人充气机;
语境;
列表数据=集合。空列表;
公共ToadlineAdapter(上下文、列表数据){
充气器=充气器。从(上下文);
这个数据=数据;
mContext=上下文;
}
@凌驾
公共MyViewHolder onCreateViewHolder(视图组父级,int-viewType){
视图=充气机。充气(R.layout.single_card_row,parent,false);
MyViewHolder viewHolder=新的MyViewHolder(视图);
返回视图持有者;
}
@凌驾
公共无效onBindViewHolder(MyViewHolder,int位置){
TimelineDataStore当前=data.get(位置);
如果(单击Position.equals(“post”)){
holder.postHeader.setText(当前.postHeader);
holder.postDescription.setText(当前.postDescription);
}
}
@凌驾
public int getItemCount(){
返回data.size();
}
公共无效设置ClickListener(ClickListener ClickListener){
this.clickListener=clickListener;
}
公共无效设置clickListener1(SwiperFreshLayout.OnRefreshListener clickListener1){
this.clickListener1=clickListener1;
}
@凌驾
已单击公共无效项(视图,整数位置){
}
//回收器视图的视图支架对象
类MyViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener、SwiperFreshLayout.OnRefreshListener、ToadlineCommentAdapter.ClickListener{
TextView postHeader,postDescription;
公共MyViewHolder(查看项目视图){
超级(项目视图);
setOnClickListener((View.OnClickListener)this);
postHeader=(TextView)itemView.findViewById(R.id.textViewTitle);
postDescription=(TextView)itemView.findViewById(R.id.textViewPostDescription);
mCardView=(cardwiew)itemView.findviewbyd(R.id.card_视图);
mShowMore=(ImageButton)itemView.findViewById(R.id.ButtonSemore);
mShowLess=(ImageButton)itemView.findViewById(R.id.Buttonseless);
mShowMore.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
int clickedPosition=getAdapterPosition();
TimelineDataStore当前=data.get(单击位置);
current.postDescription=data.get(单击位置).postDescription;
postDescription.setVisibility(View.VISIBLE);
pollPostImages.setVisibility(View.VISIBLE);
mShowMore.setVisibility(View.GONE);
mShowLess.setVisibility(View.VISIBLE);
}
});
mShowLess.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
postDescription.setVisibility(View.GONE);
pollPostImages.setVisibility(View.GONE);
mShowMore.setVisibility(View.VISIBLE);
mShowLess.setVisibility(View.GONE);
}
});
}
每一行都有相同的OnClickListener
,因为您在ViewHolder
类中设置了它。
实现所需行为的一种方法是在OnBindViewHolder
方法中设置OnClickListener
:
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
TimelineDataStore current = data.get(position);
holder.mShowMore.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int clickedPosition = getAdapterPosition();
TimelineDataStore current = data.get(clickedPosition);
current.postDescription = data.get(clickedPosition).postDescription;
postDescription.setVisibility(View.VISIBLE);
pollPostImages.setVisibility(View.VISIBLE);
mShowMore.setVisibility(View.GONE);
mShowLess.setVisibility(View.VISIBLE);
}
holder.mShowLess.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
postDescription.setVisibility(View.GONE);
pollPostImages.setVisibility(View.GONE);
mShowMore.setVisibility(View.VISIBLE);
mShowLess.setVisibility(View.GONE);
}
}
如果我们不知道您是如何扩展卡牌的,我们应该如何帮助您?:/还可以通过“选定”你的意思是点击、激活、聚焦..?这是因为ListView/RecyclerView中的视图被循环使用。请参阅答案@Keshav1234显示适配器代码。@KNeerajLal我的适配器代码太大。我将用所需代码更新帖子。我的意思是未点击的卡片,它们是“自动选择”的。然后尝试Desdroid评论中的链接答案。