UI控件--ListView补充:包含多个子项布局的列表
来源:互联网 发布:19级研究所升级数据 编辑:程序博客网 时间:2024/04/30 22:09
效果图
首先分别定义三个不同的子项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来判断加载哪一个子项布局,在设置监听事件等思路就非常清晰了。
- 基本思路就是这样的,大概代码还需要自行尝试。
0 0
- UI控件--ListView补充:包含多个子项布局的列表
- 可以自由选择多个子项的列表控件,CSortListCtrl加强版
- 【Android 开发】:UI控件之 ListView 列表控件的使用
- 【Android-UI】包含多个子View时触发父节点的焦点事件
- ListView控件演示04:查找列表中包含指定字符串的项
- ListView控件演示03:如何在列表添加项的时候减少UI的刷新
- android listview第一个子项内部控件的单击事件阻塞。。
- Android控件ListView自定义列表布局
- 【Android 开发】:UI控件之 ListView 列表控件的使用(二)
- 列表ListView控件的使用
- ListView列表控件的使用
- Listview 控件的头尾布局
- listview多个子样式的回收复用问题
- listview 添加多个子项(带图标)
- 解决ListView的item监听事件个子控件监听事件冲突问题
- Adapter类型控件之ListView Item多布局的实现
- 美化 含有多个子控件的 一般方法
- 给recycleview添加头布局并能点击item多个子控件
- 项目启动时,提示spring配置文件未知的utf-8编码
- Pyhon中set,get,方法深入了解
- EL表达式取Map,List值的总结
- 利用手机gps获取经纬信息定位
- leetcode_118 Pascal Triangle
- UI控件--ListView补充:包含多个子项布局的列表
- 【日常吐槽 · 第二期】向cocos的更新速度致敬
- 套接字相关
- 学习java前七天的总结
- MVC- View和Controller之间的传值
- 深入理解Java变量
- 三极管当开关的注意事项
- 寻找第1500个丑数
- zoj 3930 Dice Notation