在我的print(h.persons.Name)
项目中,有一个按钮以及其他视图。单击按钮时,我隐藏了该按钮。问题是,如果我单击第一个项目上的按钮,则会自动单击第8个项目上的按钮,如果我单击第二个项目上的按钮,则会自动单击第9个项目上的按钮,依此类推。如何解决这个问题?
适配器类:
RecyclerView
答案 0 :(得分:1)
问题似乎是您没有正确初始化Button
的状态。 RecyclerView
中的单元格在屏幕上显示或隐藏时将被重用。这意味着,如果您隐藏第一个位置,然后回收此视图以创建第8个位置,则Button
保持其状态,在这种情况下为INVISIBLE
尝试在所有情况下分配值或将值初始化为VISIBLE
。
希望有帮助。
答案 1 :(得分:1)
之所以会发生这种情况,通常是因为您忘记了Button的状态,以防它被回收。您可以使用SparseBooleanArray
来存储状态。像这样:
public class YourAdapter ... {
// variable to save the state of buttons.
// we use state true as hidden, false as visible
SparseBooleanArray mStateButtons = new SparseBooleanArray();
...
@Override
public void onBindViewHolder(ContactsAdapter.ViewHolder viewHolder, int position) {
final int currentPosition = viewHolder.getAdapterPosition();
// assume this is your button
Button button = viewHolder.yourButton;
// set the previous state to button
if(mStateButtons.valueAt(currentPosition)) {
// state is true, so the button need to be hide.
button.setVisibility(View.GONE);
} else {
// default value is valse, which is we set as visible.
button.setVisibility(View.VISIBLE);
}
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// save the state when clicked
mStateButtons.put(currentPosition, true);
}
});
}
}
更新
尝试在ViewHolder上移动点击处理,如下所示:
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
...
Button seeAnswer;
public ViewHolder(View itemView) {
super(itemView);
...
seeAnswer = (Button) itemView.findViewById(R.id.btnSeeAnswer);
itemView.setOnClickListener(this);
}
// Handles the row being being clicked
@Override
public void onClick(View view) {
mStateButtons.put(getAdapterPosition(), true);
view.setVisibility(View.GONE);
}
}
然后删除button.setOnClickListener(new View.OnClickListener()
中的onBindViewHolder
。
答案 2 :(得分:1)
您需要某种方式来跟踪应该隐藏哪些按钮,哪些不应该隐藏。这是适配器的职责,因此您需要添加某种形式的数组来跟踪那里的按钮状态。 SparseBooleanArray
是一种有效且适当的选择:
private SparseBooleanArray hideButtons = new SparseBooleanArray();
在onBindView
中,您需要为绑定的当前项目更新视图,包括更新按钮的可见性:
@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) {
holder.seeAnswer.setVisibility( hideButtons.get(position, false) ? View.GONE : View.VISIBLE );
...
}
当然,您需要实际设置可见性-单击按钮时,将其存储在SparseBooleanArray
中。将此事件处理程序放在ViewHolder
中是一个不错的选择:
class ViewHolder extends RecyclerView.ViewHolder{
Button seeAnswer;
...
ViewHolder(View itemView) {
super(itemView);
seeAnswer = (Button) itemView.findViewById(R.id.btnSeeAnswer);
seeAnswer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
seeAnswer.setVisibility(View.GONE);
hideButtons.put(getAdapterPosition(), true);
}
});
...
}
}
这是一个经过测试和验证的解决方案,因此,如果您遵循此方法仍然无法正常工作,则可能是问题的其他原因。