为了账号安全,请及时绑定邮箱和手机立即绑定

更改RecyclerView所有项目的View可见性

更改RecyclerView所有项目的View可见性

森林海 2023-06-21 15:04:35
我有一个 RecyclerView,它在单击某些项目时播放录音。我希望当用户单击正在播放特定录音的 item1 时的行为,并且按钮视图发生更改,这工作正常。但同时,当 item1 录音正在播放并且用户单击 item2 时,item1 行按钮将返回到其原始位置。下图显示了单击 item1(第 1 行)时的视图。(这工作正常)我还测试了它以控制 inBindViewHolder 方法中的视图。但它不起作用,因为每当我单击 holder 对象时,仅控制当前选定行的视图。下面的代码部分放在 ViewHolder 中mPlayAudio.setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View view)                 {                    Log.d(TAG, "onClick: Present in onClick mPlayAudio");                    if (listener != null)                     {                        final int position = getAdapterPosition();                        if (position != RecyclerView.NO_POSITION)                         {                           // This section contain the code to play and stop                               the audio                          // Using below line I only able to change selected                           // row button View not other row Button View                            mPlayAudio.setImageResource(R.drawable.play);                          }                     }                 }});我也在 onBindViewHolder 方法中尝试过此操作,但仍然不起作用。下面的代码添加到onBindViewHolder中holder.mPlayAudio.setOnClickListener(new View.OnClickListener(){            @Override            public void onClick(View view)             {               // This section contain code to play and stop audio               //Using below statement I only able to change the               //visibility of current selected row View not others               holder.mPlayAudio.setImageResource(R.drawable.play);            }}
查看完整描述

1 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

所以我终于能够在自己的项目中尝试这一点。


回答 在 BindViewHolder 中,单击某个项目后,保存该项目的位置值。然后在单击事件中调用notifyDataSetChanged,这将刷新适配器。现在它获取您的结果,BindViewHolder 内部有一个 if 语句检查该值是否应相应设置(或不可见),否则显示为可见。


示例代码


public class SelectorAdapter extends RecyclerView.Adapter<SelectorAdapter.ItemHolder> implements View.OnClickListener {


private List itemList;

private int selectedKey;


public SelectorAdapter(List list) {

    itemList = list;

}


@Override

public void onClick(View v) {


}



/* ViewHolder for each item */

class ItemHolder extends RecyclerView.ViewHolder {


    //title

    @BindView(R.id.selector_title)

    TextView title;


    @BindView(R.id.selector_layout)

    LinearLayout selector;


    ItemHolder(View itemView) {

        super(itemView);

        ButterKnife.bind(this, itemView);


    }

}



@Override

public ItemHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View itemView = LayoutInflater.from(parent.getContext())

            .inflate(R.layout.item_layout_selector, parent, false);


    return new ItemHolder(itemView);

}



@Override

public void onBindViewHolder(ItemHolder holder, int position) {


    String title = (String) itemList.get(position);


    holder.title.setText(title);


    if (position != selectedKey) {

        holder.title.setBackgroundResource(R.drawable.selector);

    } else {

        holder.title.setBackgroundResource(R.drawable.selector_selected);

    }



    holder.itemView.setOnClickListener(v -> {

        Timber.e("selected item: %s", position);

        selectedKey = position;

        notifyDataSetChanged();

    });


}



@Override

public int getItemCount() {

    Timber.e("itemCount: %s", itemList.size());

    return itemList.size();

}



}

这是我自己的项目,当我选择一个项目时,它会将背景资源更改为选定状态,然后其余部分返回到默认状态。


查看完整回答
反对 回复 2023-06-21
  • 1 回答
  • 0 关注
  • 168 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信