猿问

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

我有一个 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);

            }

}


森林海
浏览 174回答 1
1回答

呼啦一阵风

所以我终于能够在自己的项目中尝试这一点。回答 在 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) {&nbsp; &nbsp; itemList = list;}@Overridepublic void onClick(View v) {}/* ViewHolder for each item */class ItemHolder extends RecyclerView.ViewHolder {&nbsp; &nbsp; //title&nbsp; &nbsp; @BindView(R.id.selector_title)&nbsp; &nbsp; TextView title;&nbsp; &nbsp; @BindView(R.id.selector_layout)&nbsp; &nbsp; LinearLayout selector;&nbsp; &nbsp; ItemHolder(View itemView) {&nbsp; &nbsp; &nbsp; &nbsp; super(itemView);&nbsp; &nbsp; &nbsp; &nbsp; ButterKnife.bind(this, itemView);&nbsp; &nbsp; }}@Overridepublic ItemHolder onCreateViewHolder(ViewGroup parent, int viewType) {&nbsp; &nbsp; View itemView = LayoutInflater.from(parent.getContext())&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .inflate(R.layout.item_layout_selector, parent, false);&nbsp; &nbsp; return new ItemHolder(itemView);}@Overridepublic void onBindViewHolder(ItemHolder holder, int position) {&nbsp; &nbsp; String title = (String) itemList.get(position);&nbsp; &nbsp; holder.title.setText(title);&nbsp; &nbsp; if (position != selectedKey) {&nbsp; &nbsp; &nbsp; &nbsp; holder.title.setBackgroundResource(R.drawable.selector);&nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; holder.title.setBackgroundResource(R.drawable.selector_selected);&nbsp; &nbsp; }&nbsp; &nbsp; holder.itemView.setOnClickListener(v -> {&nbsp; &nbsp; &nbsp; &nbsp; Timber.e("selected item: %s", position);&nbsp; &nbsp; &nbsp; &nbsp; selectedKey = position;&nbsp; &nbsp; &nbsp; &nbsp; notifyDataSetChanged();&nbsp; &nbsp; });}@Overridepublic int getItemCount() {&nbsp; &nbsp; Timber.e("itemCount: %s", itemList.size());&nbsp; &nbsp; return itemList.size();}}这是我自己的项目,当我选择一个项目时,它会将背景资源更改为选定状态,然后其余部分返回到默认状态。
随时随地看视频慕课网APP

相关分类

Java
我要回答