如果我在RecyclerView项目中选择一个按钮,则会自动单击按钮

时间:2018-10-22 16:49:27

标签: java android android-recyclerview android-button

在我的print(h.persons.Name) 项目中,有一个按钮以及其他视图。单击按钮时,我隐藏了该按钮。问题是,如果我单击第一个项目上的按钮,则会自动单击第8个项目上的按钮,如果我单击第二个项目上的按钮,则会自动单击第9个项目上的按钮,依此类推。如何解决这个问题?

适配器类:

RecyclerView

3 个答案:

答案 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);
            }
        });

        ...
    }

}

这是一个经过测试和验证的解决方案,因此,如果您遵循此方法仍然无法正常工作,则可能是问题的其他原因。