Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在“回收器”视图中滚动时,为什么会自动选择另一个位置的按钮_Android_Android Recyclerview - Fatal编程技术网

Android 在“回收器”视图中滚动时,为什么会自动选择另一个位置的按钮

Android 在“回收器”视图中滚动时,为什么会自动选择另一个位置的按钮,android,android-recyclerview,Android,Android Recyclerview,我使用recycler视图显示包含12项的列表。3到4个项目将可同时查看。我在每一排卡片上都显示了更多的按钮。如果我单击第一行的“显示更多”按钮,当我向下滚动时,将自动选择另一行的“显示更多”按钮。为什么会发生这种情况,我如何解决这个问题 下面是如何设置适配器的代码: ToadlineAdapter toadlineAdapter = new ToadlineAdapter(mContext, getData1()); recyclerView.setAdapter(toadlineAdapt

我使用recycler视图显示包含12项的列表。3到4个项目将可同时查看。我在每一排卡片上都显示了更多的按钮。如果我单击第一行的“显示更多”按钮,当我向下滚动时,将自动选择另一行的“显示更多”按钮。为什么会发生这种情况,我如何解决这个问题

下面是如何设置适配器的代码:

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评论中的链接答案。