Я бы использовал RecyclerView
с настраиваемым адаптером для достижения этого результата, в зависимости от того, насколько продвинутым может быть каждый элемент. Если это простое взаимодействие и дизайн, например, icon
, text
и, возможно, click listener
, то этого достаточно.
Если это что-то более продвинутое, много разных типов действий, которые могут быть выполнены каждой кнопкой, то, возможно, вы могли бы просто пойти с LinearLayout
и сгенерировать каждую кнопку с их определенным действием.
Если вы хотите сгенерировать кнопки, прокрутите вниз до примера
Предполагая, что вы хотите использовать RecyclerView
, тогда это может выглядеть примерно так:
У вас может быть элемент адаптера, похожий на этот:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/padding_view_small">
<ImageView
android:id="@+id/icon"
android:layout_width="25dp"
android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_person_black_24dp"/>
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="@string/placeholder"
android:textColor="@color/black"
android:layout_marginStart="@dimen/padding_view_small"
android:layout_marginLeft="@dimen/padding_view_small"/>
</LinearLayout>
Ваш адаптер
public class MyAdapter extends RecyclerView.Adapter
{
private Context _context;
private List<MyObject> _items;
public void setItems(List<MyObject> items)
{
this._items = items;
notifyDataSetChanged();
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
{
_context = parent.getContext();
return new MyAdapter.ItemViewHolder(parent);
}
@Override
public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, int position)
{
final MyAdapter.ItemViewHolder viewHolder = (MyAdapter.ItemViewHolder) holder;
final MyObject item = _items.get(position);
viewHolder._icon.setImageResource(item.getIcon());
viewHolder._name.setText(item.getText());
}
@Override
public int getItemCount()
{
return _items != null ? _items.size() : 0;
}
private static class ItemViewHolder extends RecyclerView.ViewHolder
{
private ImageView _icon;
private TextView _text;
private ItemViewHolder(ViewGroup parent)
{
super(LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_layout, parent, false));
this._icon = itemView.findViewById(R.id.icon);
this._text = itemView.findViewById(R.id.text);
}
}
}
Класс MyObject для хранения информации о каждой кнопке
public class MyObject
{
private int _icon;
private String _text;
public MyObject(int icon, String text)
{
this._icon = icon;
this._text = text;
}
public int getIcon()
{
return this._icon;
}
public int getText()
{
return this._text;
}
}
Тогда вы можете также напрямую передать ClickListener
в MyObject
или добавить дополнительную переменную с именем Type
, чтобы вы знали, что делать, когда пользователь нажимает на определенный тип.
Создание кнопок без RecyclerView
Вы можете иметь базовый LinearLayout
держатель вида, который будет содержать все виды.
<LinearLayout
android:id="@+id/action_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"/>
Способ генерации просмотров
private View generateView(int icon, String text)
{
LayoutInflater inflater = LayoutInflater.from(_context);
View view = inflater.inflate(R.layout.adapter_layout, null);
ImageView icon = view.findViewById(R.id.icon);
icon.setImageResource(icon);
TextView text = view.findViewById(R.id.text);
text.setText(text);
return view;
}
Динамическое добавление новых видов
View showDialogView = generateView(ContextCompat.getDrawable(_context, R.drawable.test), "Show dialog");
//Here you can set a click listener to what should happen when you click the item
showDialogView.setOnClickListener....
linearLayout.addView(showDialogView);