📅  最后修改于: 2023-12-03 15:29:21.755000             🧑  作者: Mango
在 Android 中,我们经常需要创建包含项目和形状的图层列表,以展示某些信息或者用户选择。本文将介绍如何动态创建这样的图层列表,在列表中展示项目和形状,并支持用户选择操作。
首先,我们需要创建一个包含项目和形状的布局文件。在这个布局文件中,我们使用列表视图 ListView 显示所有的项目和形状,并使用自定义视图 ItemView 来显示每一个列表项中的内容。
<!-- layout/list_view.xml -->
<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@null"
android:dividerHeight="0dp" />
<!-- layout/item_view.xml -->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/item_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/item_text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:padding="16dp"/>
<ImageView
android:id="@+id/item_shape"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_gravity="center_vertical"/>
</LinearLayout>
我们需要一个数据类来表示每个列表项的数据,包括文本和对应的形状。我们称这个数据类为ItemModel
。
public class ItemModel {
private String text;
private int shapeResId;
public ItemModel(String text, int shapeResId) {
this.text = text;
this.shapeResId = shapeResId;
}
public String getText() {
return text;
}
public int getShapeResId() {
return shapeResId;
}
}
Android 中的 Adapter 类负责将数据源中的数据转换成视图,并提供给 ListView 显示。我们需要编写一个自定义的 Adapter 类来实现将 ItemModel 类中的数据转换成我们在布局文件中定义的 ItemView 视图。
public class ItemAdapter extends BaseAdapter {
private List<ItemModel> mItems = new ArrayList<>();
private LayoutInflater mInflater;
public ItemAdapter(Context context) {
mInflater = LayoutInflater.from(context);
}
public void setItems(List<ItemModel> items) {
mItems.clear();
mItems.addAll(items);
notifyDataSetChanged();
}
@Override
public int getCount() {
return mItems.size();
}
@Override
public Object getItem(int position) {
return mItems.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.item_view, parent, false);
}
ItemModel item = (ItemModel) getItem(position);
TextView textView = convertView.findViewById(R.id.item_text);
ImageView imageView = convertView.findViewById(R.id.item_shape);
textView.setText(item.getText());
imageView.setImageResource(item.getShapeResId());
return convertView;
}
}
在我们的 Activity 或 Fragment 中,我们需要创建 ListView 类型的控件,并将 Adapter 类实例绑定到列表中,同时将 ItemModel 中的数据添加到 Adapter 中。
public class MainActivity extends AppCompatActivity {
private ListView mListView;
private ItemAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView = findViewById(R.id.list_view);
mAdapter = new ItemAdapter(this);
mListView.setAdapter(mAdapter);
// Add some sample data
List<ItemModel> items = new ArrayList<>();
items.add(new ItemModel("Item 1", R.drawable.shape_1));
items.add(new ItemModel("Item 2", R.drawable.shape_2));
items.add(new ItemModel("Item 3", R.drawable.shape_3));
items.add(new ItemModel("Item 4", R.drawable.shape_4));
items.add(new ItemModel("Item 5", R.drawable.shape_5));
items.add(new ItemModel("Item 6", R.drawable.shape_6));
mAdapter.setItems(items);
}
}
最后一步,我们需要支持用户选择操作,当用户点击列表项时,我们需要相应地更新列表项的样式或者点击状态。
我们可以在 Adapter 类的 getView() 方法中设置 item view 的点击事件,当用户点击某个列表项时,我们将该项的样式或者点击状态更新并通知列表进行更新。
public class ItemAdapter extends BaseAdapter {
...
private int mSelectedItem = -1;
...
@Override
public View getView(int position, View convertView, ViewGroup parent) {
...
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mSelectedItem = position;
notifyDataSetChanged();
}
});
if (position == mSelectedItem) {
textView.setTextColor(Color.RED);
imageView.setBackgroundColor(Color.YELLOW);
} else {
textView.setTextColor(Color.BLACK);
imageView.setBackgroundColor(Color.WHITE);
}
return convertView;
}
...
}
这样,我们就完成了一个动态创建包含项目和形状的图层列表的操作。
本文介绍了如何使用 ListView、ItemView 和 Adapter 类来动态创建包含项目和形状的图层列表,并支持用户选择操作。
完整的示例代码可以在 Github 中查看。