Eht*_*Ali 2 java android android-recyclerview
我有一个 RecyclerView,它在单击某些项目时播放录音。我希望当用户单击正在播放特定录音的 item1 并且更改按钮 View 时的行为,这可以正常工作。
但同时当 item1 录音正在播放并且用户点击 item2 然后 item1 行按钮回到其原始位置。
下图显示了单击 item1(第 1 行)时的视图。(这工作正常)
我还测试了这个以控制 inBindViewHolder 方法中的视图。但是它不起作用,因为每当我单击持有者对象时,它只控制当前选定行的视图。
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);
}
}
}
});
Run Code Online (Sandbox Code Playgroud)
我也在 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);
}
}
所以我终于能够在我自己的项目中尝试这个。
回答 在 BindViewHolder 中,单击某个项目后,保存该项目的位置值。然后在 click 事件中调用 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();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我自己的项目,当我选择一个项目时,它会将后台资源更改为已选中,然后其余部分返回到默认状态。
| 归档时间: |
|
| 查看次数: |
2638 次 |
| 最近记录: |