Как изменить видимость кнопок в других элементах Recyclerview?

У меня есть ресайклер с кнопками внутри предметов. Когда я нажимаю одну кнопку в одной из них, я хочу скрыть кнопки в других элементах. Я знаю, как сделать это в том же пункте, где я нажал кнопку, но я понятия не имею, как сделать это в других вещах, не касаясь их. Как это сделать? Я попытался с логическим значением в ViewHolder, но это не работает.

public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ListViewHolder> {

private List<Task> tasks;
private boolean visible;

public class ListViewHolder extends RecyclerView.ViewHolder {
    private TextView nameTextView, idTextView;
    private Button travelButton, travellingButton, workButton, stopButton;

    public ListViewHolder(@NonNull View itemView) {
        super(itemView);
        nameTextView = itemView.findViewById(R.id.name_text_view);
        idTextView = itemView.findViewById(R.id.id_text_view);
        travelButton = itemView.findViewById(R.id.travel_button);
        travellingButton = itemView.findViewById(R.id.travelling_button);
        workButton = itemView.findViewById(R.id.work_button);
        stopButton = itemView.findViewById(R.id.stop_button);

        if (visible == true) {
            travelButton.setVisibility(View.GONE);
        }
        else {
            travelButton.setVisibility(View.VISIBLE);
        }
    }
}

@NonNull
@Override
public ListViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list, parent, false);
    return new ListViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull final ListAdapter.ListViewHolder holder, final int position) {
    Task task = tasks.get(position);

    holder.nameTextView.setText(task.getName());
    holder.idTextView.setText(String.valueOf(task.getId()));
    holder.travelButton.setVisibility(View.VISIBLE);
    holder.travelButton.setText(R.string.start_travel);
    holder.travellingButton.setText(R.string.travelling);

    holder.travelButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            holder.travelButton.setVisibility(View.GONE);
            holder.travellingButton.setVisibility(View.VISIBLE);
            holder.workButton.setVisibility(View.VISIBLE);
            holder.itemView.setBackgroundColor(Color.parseColor("#FFECB3"));
            visible = true;
        }
    });
    holder.workButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            holder.workButton.setText(R.string.working);
            holder.travelButton.setVisibility(View.GONE);
            holder.travellingButton.setVisibility(View.GONE);
            holder.stopButton.setVisibility(View.VISIBLE);
            holder.itemView.setBackgroundColor(Color.parseColor("#FFCDD2"));
        }
    });
    holder.stopButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            holder.travelButton.setText(R.string.start_travel);
            holder.travelButton.setVisibility(View.VISIBLE);
            holder.travellingButton.setVisibility(View.GONE);
            holder.workButton.setText(R.string.work);
            holder.workButton.setVisibility(View.GONE);
            holder.stopButton.setVisibility(View.GONE);
            holder.itemView.setBackgroundColor(Color.TRANSPARENT);
            visible = false;
        }
    });

}

@Override
public int getItemCount() {
    return tasks == null ? 0 : tasks.size();
}

public void setTasks(List<Task> tasks) {
    this.tasks = tasks;
    notifyDataSetChanged();
}
}

Всего 4 ответа


добавьте это в onBindViewHolder:

holder.travellingButton.setVisibility(visible? View.VISIBLE : View.GONE);

и после смены "видимого" звонка

notifyItemRangeChanged(0, getItemCount())

Попробуйте что-то вроде этого:

public class ListViewHolder extends RecyclerView.ViewHolder {
    private optionSelected = 0

    public ListViewHolder(@NonNull View itemView) {
        super(itemView);
        nameTextView = itemView.findViewById(R.id.name_text_view);
        idTextView = itemView.findViewById(R.id.id_text_view);
        travelButton = itemView.findViewById(R.id.travel_button);
        travellingButton = itemView.findViewById(R.id.travelling_button);
        workButton = itemView.findViewById(R.id.work_button);
        stopButton = itemView.findViewById(R.id.stop_button);

        if (visible == true) {
            travelButton.setVisibility(View.GONE);
        }
        else {
            travelButton.setVisibility(View.VISIBLE);
        }
    }
}

@NonNull
@Override
public ListViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list, parent, false);
    return new ListViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull final ListAdapter.ListViewHolder holder, final int position) {
    Task task = tasks.get(position);

    if(option == 0 && position == 0){
    holder.nameTextView.setText(task.getName());
holder.idTextView.setText(String.valueOf(task.getId()));
    holder.travelButton.setVisibility(View.VISIBLE);
    holder.travelButton.setText(R.string.start_travel);
   holder.travellingButton.setText(R.string.travelling);
} else if(option == 1 && position == 1){
   // do Something with your view
} else {
     // do something with your view
}


    holder.travelButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            option = 1
            notifyDataChanged()

        }
    });
    holder.workButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            option = 2
            notifyDataChanged()
        }
    });
    holder.stopButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            option = 3
            notifyDataChanged()
        }
    });

}

@Override
public int getItemCount() {
    return tasks == null ? 0 : tasks.size();
}

public void setTasks(List<Task> tasks) {
    this.tasks = tasks;
    notifyDataSetChanged();
}
}

Вы устанавливаете различную видимость в зависимости от того, какая кнопка нажата. Я рекомендую использовать enum вместо логического значения для сохранения состояния вашего списка и обновления состояния при каждом нажатии кнопки.

Определите перечисление в вашем адаптере и создайте переменную-член, используя его:

private List<Task> task;
private ListState state = ListState.showButton1; // Set a default value

// I used "showButton" but this can be any set a values that represent your various states
private enum ListState{
    showButton1, showButton2, showButton3
}

Внутри вашего onBindViewHolder:

// Set the state of the view holder
switch(state){
    case showButton1:
        // Set your corresponding visibility changes on your view holder here
        break;
    case showButton2:
        // Set your corresponding visibility changes on your view holder here
        break;
    case showButton3:
        // Set your corresponding visibility changes on your view holder here
        break;
}

// Make sure to update the adapter whenever a button is clicked
holder.button1.setOnClickListener(new View.OnClickListener(){
    @Override
    public void onClick(View v){
        // Set the state and notify the adapter
        state = ListState.showButton2;
        notifyDataSetChanged();
    }
})

// Add click listeners for your remaining buttons
// ... 

Пожалуйста, попробуйте следующий код, он будет первоначально отображать все travelllingButton, и когда вы нажимаете кнопку travelllingButton одного из элементов списка, кнопка travelllingButton других элементов будет скрыта.

public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ListViewHolder> {

private List<Task> tasks;
private int travelButtonVisibility=-1; 

public class ListViewHolder extends RecyclerView.ViewHolder {
    private TextView nameTextView, idTextView;
    private Button travelButton, travellingButton, workButton, stopButton;

    public ListViewHolder(@NonNull View itemView) {
        super(itemView);
        nameTextView = itemView.findViewById(R.id.name_text_view);
        idTextView = itemView.findViewById(R.id.id_text_view);
        travelButton = itemView.findViewById(R.id.travel_button);
        travellingButton = itemView.findViewById(R.id.travelling_button);
        workButton = itemView.findViewById(R.id.work_button);
        stopButton = itemView.findViewById(R.id.stop_button);


    }
}

@NonNull
@Override
public ListViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list, parent, false);
    return new ListViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull final ListAdapter.ListViewHolder holder, final int position) {
    Task task = tasks.get(position);

    holder.nameTextView.setText(task.getName());
    holder.idTextView.setText(String.valueOf(task.getId()));

    holder.travelButton.setText(R.string.start_travel);
    holder.travellingButton.setText(R.string.travelling);
    if(travelButtonVisibility==-1 || travelButtonVisibility==position){
    {

     holder.travelButton.setVisibility(View.VISIBLE);
    }else{
     holder.travelButton.setVisibility(View.GONE);
    }

    holder.travelButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            holder.travelButton.setVisibility(View.GONE);
            holder.travellingButton.setVisibility(View.VISIBLE);
            holder.workButton.setVisibility(View.VISIBLE);
            holder.itemView.setBackgroundColor(Color.parseColor("#FFECB3"));
            travelButtonVisibility=position
        }
    });
    holder.workButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            holder.workButton.setText(R.string.working);
            holder.travelButton.setVisibility(View.GONE);
            holder.travellingButton.setVisibility(View.GONE);
            holder.stopButton.setVisibility(View.VISIBLE);
            holder.itemView.setBackgroundColor(Color.parseColor("#FFCDD2"));
        }
    });
    holder.stopButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            holder.travelButton.setText(R.string.start_travel);
            holder.travelButton.setVisibility(View.VISIBLE);
            holder.travellingButton.setVisibility(View.GONE);
            holder.workButton.setText(R.string.work);
            holder.workButton.setVisibility(View.GONE);
            holder.stopButton.setVisibility(View.GONE);
            holder.itemView.setBackgroundColor(Color.TRANSPARENT);
            visible = false;
        }
    });

}

@Override
public int getItemCount() {
    return tasks == null ? 0 : tasks.size();
}

public void setTasks(List<Task> tasks) {
    this.tasks = tasks;
    notifyDataSetChanged();
}
}

Надеюсь, это поможет.


Есть идеи?

10000