思路:
首先数据获取到时各式各样,这个时候我们在适配器给予不同类型的数据展示不同类型条目,具体看数据定义。
重写两个方法即:getTtemViewType()和getViewTypeCount()方法,在getTtemViewType方法中有几种布局就分几种情况然后返回,然后是getView方法中通过getTtemViewType()方法获得类型type,然后就是根据布局去找空间,去赋值就好了。
换想一下以最常见的新闻App,有的一个图片,有的俩图片,还有的仨图片,这些都可以作为参考,只需要在该方法内添加判断条件,返回对应的常量即可;而这个判断条件的数据需从 传入的数据中获取
根据个人所需去判断:
if (list.get(position).getThumbnail_pic_s03() == null) { return TYPE_ONE; } else { return TYPE_TWO; }
效果图:
下面就是适配器里面的代码了
public class MyAdapter extends BaseAdapter {
//定义条目类型 必须从0开始
private static final int TYPE_ONE = 0;
private static final int TYPE_TWO = 1;
private Context context;
private ArrayList<Data> list;
public MyAdapter(Context context, ArrayList<Data> list) {
this.context = context;
this.list = list;
}
//条目类型
@Override
public int getItemViewType(int position) {
if (list.get(position).getThumbnail_pic_s03() == null) {
return TYPE_ONE;
} else {
return TYPE_TWO;
}
}
//条目类型数量
@Override
public int getViewTypeCount() {
return 2;
}
//条目总数量
@Override
public int getCount() {
return list.size();
}
//条目
@Override
public Object getItem(int position) {
return null;
}
//条目id
@Override
public long getItemId(int position) {
return 0;
}
//条目视图
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
if (convertView == null) {
int itemViewType = getItemViewType(position);
//根据当前条目类型来判定所该展示的布局
switch (itemViewType) {
case TYPE_ONE:
convertView = View.inflate(context, R.layout.item_one, null);
//控件赋值
viewHolder = new ViewHolder();
viewHolder.title1 = convertView.findViewById(R.id.title1);
viewHolder.date1 = convertView.findViewById(R.id.date1);
viewHolder.img1 = convertView.findViewById(R.id.img1);
//返回视图
convertView.setTag(viewHolder);
break;
case TYPE_TWO:
convertView = View.inflate(context, R.layout.item_three, null);
//控件赋值
viewHolder = new ViewHolder();
viewHolder.title2 = convertView.findViewById(R.id.title2);
viewHolder.date2 = convertView.findViewById(R.id.date2);
viewHolder.img2_1 = convertView.findViewById(R.id.img2_1);
viewHolder.img2_2 = convertView.findViewById(R.id.img2_2);
viewHolder.img2_3 = convertView.findViewById(R.id.img2_3);
//返回视图
convertView.setTag(viewHolder);
break;
}
} else {
int itemViewType = getItemViewType(position);
//根据当前条目类型来判定所该展示的视图
switch (itemViewType) {
case TYPE_ONE:
viewHolder = (ViewHolder) convertView.getTag();
break;
case TYPE_TWO:
viewHolder = (ViewHolder) convertView.getTag();
break;
}
}
//根据类型展示数据
int itemViewType = getItemViewType(position);
Data data = list.get(position);
switch (itemViewType) {
case TYPE_ONE:
//给第一种条目的控件赋值
viewHolder.title1.setText(data.getTitle());
viewHolder.date1.setText(data.getDate());
ImageLoader.getInstance().displayImage(data.getThumbnail_pic_s(), viewHolder.img1);
break;
case TYPE_TWO:
//给第二种条目的控件赋值
viewHolder.title2.setText(data.getTitle());
viewHolder.date2.setText(data.getDate());
ImageLoader.getInstance().displayImage(data.getThumbnail_pic_s(), viewHolder.img2_1);
ImageLoader.getInstance().displayImage(data.getThumbnail_pic_s(), viewHolder.img2_2);
ImageLoader.getInstance().displayImage(data.getThumbnail_pic_s(), viewHolder.img2_3);
break;
}
return convertView;
}
class ViewHolder {
TextView title1, date1;
ImageView img1;
TextView title2, date2;
ImageView img2_1, img2_2, img2_3;
}
}
第一种类型的布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/img1"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_alignParentRight="true"
android:src="@mipmap/ic_launcher" />
<TextView
android:id="@+id/title1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@id/img1"
android:layout_alignParentLeft="true"
android:layout_toLeftOf="@id/img1"
android:text="哈哈哈"
android:textSize="20sp" />
<TextView
android:id="@+id/date1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@id/img1"
android:layout_alignParentLeft="true"
android:layout_marginRight="20dp"
android:text="哈哈哈"
android:textColor="#beba96" />
</RelativeLayout>
第二种类型的布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/title2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="哈哈哈"
android:textSize="20sp" />
<LinearLayout
android:id="@+id/l"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/title2"
android:orientation="horizontal">
<ImageView
android:id="@+id/img2_1"
android:layout_width="0dp"
android:layout_height="100dp"
android:layout_margin="0dp"
android:layout_weight="1"
android:src="@mipmap/ic_launcher" />
<ImageView
android:id="@+id/img2_2"
android:layout_width="0dp"
android:layout_height="100dp"
android:layout_margin="0dp"
android:layout_weight="1"
android:src="@mipmap/ic_launcher" />
<ImageView
android:id="@+id/img2_3"
android:layout_width="0dp"
android:layout_height="100dp"
android:layout_margin="0dp"
android:layout_weight="1"
android:src="@mipmap/ic_launcher" />
</LinearLayout>
<TextView
android:id="@+id/date2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/l"
android:text="哈哈哈"
android:textColor="#beba96" />
</RelativeLayout>