效果图
首先分别定义三个不同的子项item布局
- 布局一
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="右边的消息"
android:textColor="#000000"
android:layout_toLeftOf="@+id/imageView_right"
android:id="@+id/textView_right" />
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:id="@+id/imageView_right"
android:layout_alignParentRight="true" />
</RelativeLayout>
- 对应的bean文件
public class MessageRight implements Type{
private String msg;
private int picId;
public MessageRight(String msg, int picId) {
this.msg = msg;
this.picId = picId;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public int getPicId() {
return picId;
}
public void setPicId(int picId) {
this.picId = picId;
}
@Override
public int getType() {
return MyManyAdapter.TYPE_RIGHT;
}
}
- 布局二、三于此基本一致,就不再赘述。
-请注意一点,这里每一个bean类,都实现了一个接口,接口的代码如下
public interface Type {
public int getType();
}
- 可以看到接口中只有一个方法getType()
这个接口的方法实现在自定义Adapter中用处很大
对应的自定义Adapter
public class MyManyAdapter extends BaseAdapter {
public static final int TYPE_TIME = 0;
public static final int TYPE_LEFT = 1;
public static final int TYPE_RIGHT =2;
private Context context;
//注意这里接收的是Type类型的数据
private List<Type> dataList;
public MyManyAdapter(Context context, List<Type> dataList) {
this.context = context;
this.dataList = dataList;
}
@Override
public int getViewTypeCount() {
return 3;
}
@Override
public int getItemViewType(int position) {
return dataList.get(position).getType();
}
@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 View getView(int position, View convertView, ViewGroup parent) {
ViewHolderLeft viewHolderLeft=null;
ViewHolderRight viewHolderRight=null;
ViewHolderTime viewHolderTime=null;
int type = dataList.get(position).getType();
if (convertView==null){
switch (type){
case TYPE_TIME:
viewHolderTime=new ViewHolderTime();
convertView= LayoutInflater.from(context).inflate(R.layout.layout_time,null);
viewHolderTime.textView= (TextView) convertView.findViewById(R.id.textView_time);
convertView.setTag(viewHolderTime);
break;
case TYPE_LEFT:
viewHolderLeft=new ViewHolderLeft();
convertView=LayoutInflater.from(context).inflate(R.layout.layout_left,null);
viewHolderLeft.imageView= (ImageView) convertView.findViewById(R.id.imageView_left);
viewHolderLeft.textView= (TextView) convertView.findViewById(R.id.textView_left);
viewHolderLeft.button_left= (Button) convertView.findViewById(R.id.button_left);
convertView.setTag(viewHolderLeft);
break;
case TYPE_RIGHT:
viewHolderRight=new ViewHolderRight();
convertView=LayoutInflater.from(context).inflate(R.layout.layout_right,null);
viewHolderRight.imageView= (ImageView) convertView.findViewById(R.id.imageView_right);
viewHolderRight.textView= (TextView) convertView.findViewById(R.id.textView_right);
convertView.setTag(viewHolderRight);
break;
}
}else{
switch (type){
case TYPE_TIME:
viewHolderTime= (ViewHolderTime) convertView.getTag();
break;
case TYPE_LEFT:
viewHolderLeft= (ViewHolderLeft) convertView.getTag();
break;
case TYPE_RIGHT:
viewHolderRight= (ViewHolderRight) convertView.getTag();
break;
}
}
switch (type){
case TYPE_TIME:
MessageTime time= (MessageTime) dataList.get(position);
viewHolderTime.textView.setText(time.getTime());
viewHolderTime.textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, "时间被点击了", Toast.LENGTH_SHORT).show();
}
});
break;
case TYPE_LEFT:
MessageLeft messageLeft= (MessageLeft) dataList.get(position);
viewHolderLeft.imageView.setImageResource(messageLeft.getPicId());
viewHolderLeft.textView.setText(messageLeft.getMsg());
viewHolderLeft.button_left.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, "左边的按钮被点击了", Toast.LENGTH_SHORT).show();
}
});
viewHolderLeft.imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, "左边的图片被点击", Toast.LENGTH_SHORT).show();
}
});
break;
case TYPE_RIGHT:
MessageRight messageRight= (MessageRight) dataList.get(position);
viewHolderRight.imageView.setImageResource(messageRight.getPicId());
viewHolderRight.textView.setText(messageRight.getMsg());
viewHolderRight.imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, "右边的图片被点击", Toast.LENGTH_SHORT).show();
}
});
break;
}
return convertView;
}
class ViewHolderLeft {
ImageView imageView;
TextView textView;
Button button_left;
}
class ViewHolderRight {
ImageView imageView;
TextView textView;
}
class ViewHolderTime {
TextView textView;
}
}
- 注意这里新增加的两个复写的方法
@Override
public int getViewTypeCount() {
return 3;
}
@Override
public int getItemViewType(int position) {
return dataList.get(position).getType();
}
- getViewTypeCount() ,用于返回自定义子项不同布局的数目,有几种不同的子项布局,就返回几
getItemViewType(),用于效率优化的时候,判断内存中是否有你正要加载的子项的布局缓存,因为当前划出屏幕的item布局不一定与正在生成的子项是同一个布局,这里就需要这个方法来判断一下,内存中是否有可以复用的布局。
还有一个小细节
@Override- 在getView()方法中,获取type的设置很巧妙
- private List dataList;
- 首先我们定义的存储数据的list泛型是Type,这样就可以讲三种实现Type接口的bean类实例都放进去
- int type = dataList.get(position).getType();
- 然后再getView()方法应用了向下转型,来获取Type
- 最后,格局获取到的type来判断加载哪一个子项布局,在设置监听事件等思路就非常清晰了。
- 基本思路就是这样的,大概代码还需要自行尝试。