📌  相关文章
📜  android 动态创建包含项目和形状的图层列表 site:stackoverflow.com - Java (1)

📅  最后修改于: 2023-12-03 15:29:21.755000             🧑  作者: Mango

Android 动态创建包含项目和形状的图层列表

在 Android 中,我们经常需要创建包含项目和形状的图层列表,以展示某些信息或者用户选择。本文将介绍如何动态创建这样的图层列表,在列表中展示项目和形状,并支持用户选择操作。

1. 创建布局文件

首先,我们需要创建一个包含项目和形状的布局文件。在这个布局文件中,我们使用列表视图 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>

2. 创建 Model 类

我们需要一个数据类来表示每个列表项的数据,包括文本和对应的形状。我们称这个数据类为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;
    }
}
3. 实现 Adapter 类

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;
    }

}
4. 绑定数据到列表

在我们的 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);
    }
}
5. 支持用户选择操作

最后一步,我们需要支持用户选择操作,当用户点击列表项时,我们需要相应地更新列表项的样式或者点击状态。

我们可以在 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 中查看。