【问题标题】:RecyclerView Adapter change selected position in List ScrollingRecyclerView 适配器更改列表滚动中的选定位置
【发布时间】:2016-05-08 19:18:28
【问题描述】:

RecyclerView.Adapter 中,我需要在每个行列表中更改favIcon,在选择每个位置后,只需指定行favIcon 更改。

一切正常,但是当滚动 RecyclerView 时,所选行的位置会自动改变!

这是我的适配器类:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private ItemData[] itemsData;
Activity activity;

public MyAdapter(Activity activity, ItemData[] itemsData) {
    this.activity=activity;
    this.itemsData = itemsData;
}

@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                               int viewType) {
    View itemLayoutView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.item_layout, null);

    ViewHolder viewHolder = new ViewHolder(itemLayoutView);
    return viewHolder;
}

@Override
public void onBindViewHolder(final ViewHolder viewHolder, final int position) {

    viewHolder.txtViewTitle.setText(itemsData[position].getTitle());
    viewHolder.imgViewIcon.setImageResource(itemsData[position].getImageUrl());
    viewHolder.imgViewIcon.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (!viewHolder.isFav) {
                Toast.makeText(activity,"Selected Row : "+position,Toast.LENGTH_SHORT).show();
                viewHolder.isFav = true;
                viewHolder.imgViewIcon.setImageResource(R.drawable.icon_fav);
            } else {
                viewHolder.imgViewIcon.setImageResource(R.drawable.pre_ic_ab_drawer);
                viewHolder.isFav = false;
            }
        }
    });


    if (viewHolder.isFav)
        viewHolder.imgViewIcon.setImageResource(R.drawable.icon_fav);

}

public static class ViewHolder extends RecyclerView.ViewHolder {

    public TextView txtViewTitle;
    public ImageView imgViewIcon;
    public Boolean isFav=false;

    public ViewHolder(View itemLayoutView) {
        super(itemLayoutView);
        txtViewTitle = (TextView) itemLayoutView.findViewById(R.id.item_title);
        imgViewIcon = (ImageView) itemLayoutView.findViewById(R.id.item_icon);
    }
}

@Override
public int getItemCount() {
    return itemsData.length;
}
 } 

我在输出中看到的:

如我所见,我选择了第一行图标,但在滚动 RecyclerView 之后,选择的位置发生了变化。

然后尝试使用将favIconimgViewIcon.setOnClickListener更改为onCreateViewHolder再次错误的位置!

我也尝试将位置存储在 sharedPreferences 或 modelClass 中,但这在滚动时返回错误的位置

有没有办法避免这个问题?

我也看到了这个解决方案:Get clicked item and its position in RecyclerView

【问题讨论】:

    标签: android android-recyclerview


    【解决方案1】:

    如果元素被选中,请尝试使用您的模型ItemData[] itemsData; 保存。

    例如。

            if (itemsData[position].isFav){
    
                    viewHolder.imgViewIcon.setImageResource(R.drawable.icon_fav);
             }else{
    
                    viewHolder.imgViewIcon.setImageResource(R.drawable.pre_ic_ab_drawer);
             }
    
    
    viewHolder.imgViewIcon.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            if (!itemsData[position].isFav) {
                                Toast.makeText(activity,"Selected Row : "+position,Toast.LENGTH_SHORT).show();
                                itemsData[position].isFav = true;
                                viewHolder.imgViewIcon.setImageResource(R.drawable.icon_fav);
                            } else {
                                viewHolder.imgViewIcon.setImageResource(R.drawable.pre_ic_ab_drawer);
                                itemsData[position].isFav = false;
                            }
                        }
                    });
    

    【讨论】:

    • 正如我在问题中所说的那样,我以前尝试过这种方式,但我的适配器有问题
    • 我不知道为什么,但我以前用过这种方式,但不工作,但现在它工作了! - 谢谢
    【解决方案2】:
    public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    private ItemData[] itemsData;
    Activity activity;
    
    public MyAdapter(Activity activity, ItemData[] itemsData) {
        this.activity=activity;
        this.itemsData = itemsData;
    }
    
    @Override
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                   int viewType) {
        View itemLayoutView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_layout, null);
    
        ViewHolder viewHolder = new ViewHolder(itemLayoutView);
        return viewHolder;
    }
    
    @Override
    public void onBindViewHolder(final ViewHolder viewHolder, final int position) {
    
        viewHolder.txtViewTitle.setText(itemsData[position].getTitle());
        viewHolder.imgViewIcon.setImageResource(itemsData[position].getImageUrl());
        viewHolder.imgViewIcon.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!viewHolder.isFav) {
                    Toast.makeText(activity,"Selected Row : "+position,Toast.LENGTH_SHORT).show();
                    viewHolder.isFav = true;
                    viewHolder.imgViewIcon.setImageResource(R.drawable.icon_fav);
                } else {
                    viewHolder.imgViewIcon.setImageResource(R.drawable.pre_ic_ab_drawer);
                    viewHolder.isFav = false;
                }
            }
        });
    
    
        if (viewHolder.isFav)
            viewHolder.imgViewIcon.setImageResource(R.drawable.icon_fav);
        else
            // The change 
            viewHolder.imgViewIcon.setImageResource(R.drawable.pre_ic_ab_drawer);
    
    }
    

    当你绑定 ViewHolder 时,如果不是 fav,你应该重置 ImageView 图标。

    【讨论】:

    • 我以前尝试过这种方式,它也不起作用 - 我的问题是点击图标然后滚动列表时
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 2021-11-06
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多