Android ViewGroup для ViewHolder
Я создаю простое приложение Todolist для Android, используя Retrofit2. Я получил класс-адаптер для создания Recyclerview с Todos из списка. Это работает без проблем (здесь идет код):
public class TodolistAdapter extends RecyclerView.Adapter<TodolistAdapter.TodoViewHolder> {
private ArrayList<Todolist> todoData;
public static class TodoViewHolder extends RecyclerView.ViewHolder {
public TextView todoView;
public TodoViewHolder(TextView textView) {
super(textView);
todoView = textView;
}
}
public TodolistAdapter(ArrayList<Todolist> dataset) {
todoData = dataset;
}
@Override
public TodolistAdapter.TodoViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// create a new view
TextView v = (TextView) LayoutInflater.from(parent.getContext())
.inflate(R.layout.todolist_text_view, parent, false);
TodoViewHolder vh = new TodoViewHolder(v);
return vh;
}
// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(final TodoViewHolder holder, final int position) {
// - get element from your dataset at this position
// - replace the contents of the view with that element
holder.todoView.setText(todoData.get(position).getList_name());
holder.todoView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String listID = todoData.get(position).getList_id();
Intent intent = new Intent(holder.todoView.getContext(), TodoActivity.class);
intent.putExtra("list_id", listID);
holder.todoView.getContext().startActivity(intent);
}
});
}
// Return the size of your dataset (invoked by the layout manager)
@Override
public int getItemCount() {
return todoData.size();
}
}
То, что я получаю, это список с Todos как TextViews. Теперь я хочу добавить флажок слева от TextViews, чтобы отметить / снять галочку с одной задачи.
Но я не знаю, как передать TextView и флажок ViewHolder. Нужно ли создавать Viewgroup внутри соответствующего xml и передавать его в конструктор ViewHolder? Как может выглядеть возможный xml? Я немного застрял здесь, потому что я новичок в мире Android View.
3 ответа
Вам нужна разметка, например, с помощью Constraint Layout, которая будет включать в себя как TextView, так и CheckBox.
Для добавления CheckBox слева от textview вы должны добавить флажок в свой макет R.layout.todolist_text_view и инициализировать его так же, как вы инициализируете textview.
Ниже код для флажка:
<android.support.v7.widget.AppCompatCheckBox
android:id="@+id/chkboxId"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/some_text"
/>
Вам нужно изменить todolist_text_view.xml
макет как включить флажок.
Затем измените onCreateViewHolder
следующее:-
@Override
public TodolistAdapter.TodoViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// create a new view
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.todolist_text_view, parent, false);
TodoViewHolder vh = new TodoViewHolder(v);
return vh;
}
Теперь измените TodoViewHolder
как показано ниже:
public static class TodoViewHolder extends RecyclerView.ViewHolder {
public TextView todoView;
public Checkbox checkbox;
public TodoViewHolder(View view) {
super(textView);
todoView = view.findViewById(R.id.textViewId);
checkbox = view.findViewById(R.id.checkboxId);
}
}
Обратитесь к этому для полного понимания того, как эти методы работают вместе.