我会使用带有自定义适配器的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);