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