在 ListView 中实现多个布局的 ListView,通常涉及到以下几个步骤:

1. 创建数据模型类: 为每种布局创建对应的数据模型类。
2. 创建适配器类: 继承自 BaseAdapter,实现多布局的适配器。
3. 重写 getViewTypeCount 和 getItemViewType 方法: 用于告诉适配器有多少种布局类型以及每个项对应的布局类型。
4. 在 getView 方法中处理不同的布局: 根据布局类型选择合适的布局进行绑定数据。

以下是一个简单的示例,演示如何在 ListView 中实现多个布局的 ListView:

1. 创建数据模型类:
public class TextItem {
    private String text;

    public TextItem(String text) {
        this.text = text;
    }

    public String getText() {
        return text;
    }
}

public class ImageItem {
    private int imageResId;

    public ImageItem(int imageResId) {
        this.imageResId = imageResId;
    }

    public int getImageResId() {
        return imageResId;
    }
}

2. 创建适配器类:
public class MultiLayoutAdapter extends BaseAdapter {

    private Context context;
    private List<Object> dataList;

    // 布局类型
    private static final int TYPE_TEXT = 0;
    private static final int TYPE_IMAGE = 1;

    public MultiLayoutAdapter(Context context, List<Object> dataList) {
        this.context = context;
        this.dataList = dataList;
    }

    @Override
    public int getCount() {
        return dataList.size();
    }

    @Override
    public Object getItem(int position) {
        return dataList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public int getViewTypeCount() {
        return 2; // 布局类型的数量
    }

    @Override
    public int getItemViewType(int position) {
        // 根据数据的类型返回对应的布局类型
        if (dataList.get(position) instanceof TextItem) {
            return TYPE_TEXT;
        } else if (dataList.get(position) instanceof ImageItem) {
            return TYPE_IMAGE;
        }
        return -1; // 返回默认类型
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        int itemType = getItemViewType(position);

        if (convertView == null) {
            LayoutInflater inflater = LayoutInflater.from(context);
            switch (itemType) {
                case TYPE_TEXT:
                    convertView = inflater.inflate(R.layout.text_item_layout, parent, false);
                    TextViewHolder textViewHolder = new TextViewHolder();
                    textViewHolder.textView = convertView.findViewById(R.id.textView);
                    convertView.setTag(textViewHolder);
                    break;
                case TYPE_IMAGE:
                    convertView = inflater.inflate(R.layout.image_item_layout, parent, false);
                    ImageViewHolder imageViewHolder = new ImageViewHolder();
                    imageViewHolder.imageView = convertView.findViewById(R.id.imageView);
                    convertView.setTag(imageViewHolder);
                    break;
            }
        }

        // 绑定数据
        switch (itemType) {
            case TYPE_TEXT:
                TextItem textItem = (TextItem) getItem(position);
                TextViewHolder textViewHolder = (TextViewHolder) convertView.getTag();
                textViewHolder.textView.setText(textItem.getText());
                break;
            case TYPE_IMAGE:
                ImageItem imageItem = (ImageItem) getItem(position);
                ImageViewHolder imageViewHolder = (ImageViewHolder) convertView.getTag();
                imageViewHolder.imageView.setImageResource(imageItem.getImageResId());
                break;
        }

        return convertView;
    }

    // ViewHolder 类型
    static class TextViewHolder {
        TextView textView;
    }

    static class ImageViewHolder {
        ImageView imageView;
    }
}

3. 创建列表项的布局文件:

例如,创建两个不同布局的布局文件,分别为 text_item_layout.xml 和 image_item_layout.xml:

text_item_layout.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="16dp">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:textStyle="bold" />

</LinearLayout>

image_item_layout.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="16dp">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:scaleType="centerCrop" />

</LinearLayout>

4. 使用示例:
public class MainActivity extends AppCompatActivity {

    private List<Object> dataList;
    private MultiLayoutAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化数据源
        dataList = new ArrayList<>();
        dataList.add(new TextItem("Text Item 1"));
        dataList.add(new ImageItem(R.drawable.ic_launcher_foreground));
        dataList.add(new TextItem("Text Item 2"));
        dataList.add(new ImageItem(R.drawable.ic_launcher_foreground));

        // 初始化适配器
        adapter = new MultiLayoutAdapter(this, dataList);

        // 初始化 ListView
        ListView listView = findViewById(R.id.listView);
        listView.setAdapter(adapter);
    }
}

上述示例演示了如何使用 BaseAdapter 实现 ListView 的多布局效果。通过在适配器中使用 getViewTypeCount 和 getItemViewType 方法,以及在 getView 方法中根据不同的布局类型选择对应的布局进行数据绑定,可以轻松实现多布局的 ListView。


转载请注明出处:http://www.pingtaimeng.com/article/detail/15147/Android