Как изменить видимость кнопок в других элементах Recyclerview? - PullRequest
1 голос
/ 16 января 2020

У меня есть утилита просмотра с кнопками внутри предметов. Когда я нажимаю одну кнопку в одной из них, я хочу скрыть кнопки в других элементах. Я знаю, как сделать это в том же пункте, где я нажал кнопку, но я понятия не имею, как сделать это в других вещах, не касаясь их. Как это сделать? Я пытался с логическим значением в 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();
}
}

Ответы [ 5 ]

1 голос
/ 17 января 2020

Хорошо, я нашел ответ на свой вопрос. Я только что сделал интерфейс, который сообщает деятельности о необходимости обновить sh адаптер, и он работает.

ListAdapter:

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

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

public void setOnButtonClickListener(OnButtonClickListener onButtonClickListener) {
    mOnButtonClickListener = onButtonClickListener;
}

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) {
    final 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 <= 0) {
        holder.travelButton.setVisibility(View.VISIBLE);
    }
    else if (position == travelButtonVisibility){
        holder.travelButton.setVisibility(View.GONE);
        holder.travellingButton.setVisibility(View.VISIBLE);
        holder.workButton.setVisibility(View.VISIBLE);
        holder.itemView.setBackgroundColor(Color.parseColor("#FFECB3"));
    }

    holder.travelButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mOnButtonClickListener.onTravelButtonClick();
            travelButtonVisibility = position;
            holder.travelButton.setVisibility(View.GONE);

        }
    });
    holder.workButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            holder.workButton.setText(R.string.working);
            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.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);
            travelButtonVisibility = -1;
            notifyDataSetChanged();
        }
    });

}

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

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

public interface OnButtonClickListener {
    void onTravelButtonClick();
}
}

MainActvity:

private void initList() {
    listAdapter = new ListAdapter();

    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerView.setAdapter(listAdapter);
    recyclerView.setHasFixedSize(true);
    listAdapter.setTasks(tasks);

    listAdapter.setOnButtonClickListener(new ListAdapter.OnButtonClickListener() {
        @Override
        public void onTravelButtonClick() {
            recyclerView.setAdapter(listAdapter);
            Log.e("MainActivity", "Travel Button");
        }
    });

}
0 голосов
/ 17 января 2020

Пожалуйста, попробуйте ниже код, он будет первоначально отображать все 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
            notifyDataSetChanged();
        }
    });
    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();
}
}

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

0 голосов
/ 17 января 2020

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

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();
}
}
0 голосов
/ 17 января 2020

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

Определите 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
// ... 
0 голосов
/ 17 января 2020

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

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

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

notifyItemRangeChanged(0, getItemCount())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...