Столкнулся с двумя вопросами в рамках одной задачи.
- Как можно заполнить список значениями из БД (использую ROOM, если это важно);
- Как добавить обработчики нажатий на каждый элемент карточки? Сейчас у меня один общий обработчик, а в идеале для каждого элемента карточки должен быть свой. При этом не просто клик, с этим проблем, с возвращением номера элемента, так как это действие ведет к удалению записи из БД или записи в другую таблицу.
по п.1 самое простое, но не самое логичное, вносить сразу записи по ID, в таком случае карточка может содержать null, что не есть хорошо. Все же хочется, что бы карточка отображалась только в том случае, если в таблице есть данная строка. Таблица может увеличиваться от 1 записи до 20-30.
Макет
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/img"
android:layout_width="70dp"
android:layout_height="50dp"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
android:layout_marginStart="16dp"
android:layout_centerVertical="true"
android:layout_alignParentStart="true" />
<TextView
android:id="@+id/name"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:layout_marginTop="16dp"
android:text="Название"
android:layout_toEndOf="@+id/img"
android:layout_centerVertical="true"/>
<Button
android:id="@+id/desc"
android:layout_width="100dp"
android:layout_height="40dp"
android:layout_marginLeft="16dp"
android:layout_marginTop="16dp"
android:layout_marginBottom="5dp"
android:layout_below="@id/name"
android:text="Удалить"
android:textSize="10sp"
android:layout_toEndOf="@+id/name" />
</RelativeLayout>
Адаптер
public class DescAdapter extends RecyclerView.Adapter<DescAdapter.ViewHolder>{
interface OnStateClickListener{
void onStateClick(Desc desc, int position);
}
private final OnStateClickListener onClickListener;
private final LayoutInflater inflater;
private final List<Desc> descs;
DescAdapter(Context context, List<Desc> descs, OnStateClickListener onClickListener) {
this.onClickListener = onClickListener;
this.descs = descs;
this.inflater = LayoutInflater.from(context);
}
@Override
public DescAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.list_item, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(DescAdapter.ViewHolder holder, int position) {
Desc desc = descs.get(position);
holder.imgView.setImageResource(desc.getFlagResource());
holder.nameView.setText(desc.getName());
holder.descView.setText(desc.getCapital());
holder.itemView.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v)
{
onClickListener.onStateClick(desc, position);
}
});
}
@Override
public int getItemCount() {
return descs.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
final ImageView imgView;
final TextView nameView, descView;
ViewHolder(View view){
super(view);
imgView = view.findViewById(R.id.img);
nameView = view.findViewById(R.id.name);
descView = view.findViewById(R.id.desc);
}
}
}
Основной класс
public class Items extends AppCompatActivity {
ArrayList<Desc> descs = new ArrayList<Desc>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_items);
/// начальная инициализация списка
setInitialData();
RecyclerView recyclerView = findViewById(R.id.list);
// определяем слушателя нажатия элемента в списке
DescAdapter.OnStateClickListener stateClickListener = new DescAdapter.OnStateClickListener() {
@Override
public void onStateClick(Desc desc, int position) {
if (desc.getName() !="пусто") {
Toast.makeText(getApplicationContext(), "Открыто___" + desc.getName() + "__" + position,
Toast.LENGTH_SHORT).show();
}
}
};
DescAdapter adapter = new DescAdapter(this, descs, stateClickListener);
recyclerView.setAdapter(adapter);
}
private void setInitialData(){
descs.add(new Desc("Первый", "+2", R.drawable.flag));
descs.add(new Desc("Второй", "+4", R.drawable.flag));
descs.add(new Desc("Третий", "+3", R.drawable.flag));
}
Конструктор
public class Desc {
private String name; // название
private String capital; // столица
private int flagResource; // ресурс флага
public Desc(String name, String capital, int flag){
this.name=name;
this.capital=capital;
this.flagResource=flag;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public String getCapital() {
return this.capital;
}
public void setCapital(String capital) {
this.capital = capital;
}
public int getFlagResource() {
return this.flagResource;
}
public void setFlagResource(int flagResource) {
this.flagResource = flagResource;
}
}