listview加载不同布局
来源:互联网 发布:沸点网络电视官网 编辑:程序博客网 时间:2024/05/21 11:14
今天面试问到了这个,回家来做一下笔记, 顺便实现一下效果。
我的做法是:
1、定义一个类,在这个类里有不同布局所需要的所有字段。
2、在自定义adapter里根据当前数据的字段来判断应该加载哪个布局
3、在自定义adapter里实现了不同布局的ViewHolder,根据不同的布局实例化不同的ViewHolder类
注意:
1、getViewTypeCount方法返回一共有几种不同类型的布局,我这里是3种,所以返回3
2、getItemViewType,通过自己的逻辑判断,返回当前的item应该加载哪个布局,这个返回值是一个int值,我们在getView方法里就根据这个int值来判断加载哪个布局,并且这个数不能大于getViewTypeCount返回的数
效果图:
当然如果我们愿意也可以用把不同的布局数据写在不同的类里,如果是这样就要在每个类里增加一个type的字段来标识它应该加载的布局,而且这个时候我们的数据源可以使用ArrayList
/** * Created by LHD on 2016/7/1. */public class MyListviewAdapter extends BaseAdapter { //定义常用的参数 private Context ctx; private int resourceId; private List<User> users; private LayoutInflater inflater; //为三种布局定义一个标识 private final int TYPE1 = 0; private final int TYPE2 = 1; private final int TYPE3 = 2; public MyListviewAdapter(Context context, List<User> objects) { this.ctx = context; this.users = objects; //别忘了初始化inflater inflater = LayoutInflater.from(ctx); } @Override public int getCount() { return users.size(); } @Override public User getItem(int position) { return users.get(position); } @Override public long getItemId(int position) { return position; } //这个方法必须重写,它返回了有几种不同的布局 @Override public int getViewTypeCount() { return 3; } // 每个convertView都会调用此方法,获得当前应该加载的布局样式 @Override public int getItemViewType(int position) { //获取当前布局的数据 User u = users.get(position); //哪个字段不为空就说明这是哪个布局 //比如第一个布局只有item1_str这个字段,那么就判断这个字段是不是为空, //如果不为空就表明这是第一个布局的数据 //根据字段是不是为空,判断当前应该加载的布局 Log.i("LHD", u.toString()); Log.i("LHD", "第一个返回值" + u.getItem1_str()); Log.i("LHD", "第二个返回值" + u.getItem2_str()); Log.i("LHD", "第三个返回值" + u.getItem3_str()); if (u.getItem1_str() != null) { return TYPE1; } else if (u.getItem2_str() != null) { return TYPE2; } else {//如果前两个字段都为空,那就一定是加载第三个布局啦。 return TYPE3; } } @Override public View getView(int position, View convertView, ViewGroup parent) { //初始化每个holder ViewHolder1 holder1 = null; ViewHolder2 holder2 = null; ViewHolder3 holder3 = null; int type = getItemViewType(position); if (convertView == null) { switch (type) { case TYPE1: convertView = inflater.inflate(R.layout.itemlayout1, null, false); holder1 = new ViewHolder1(); holder1.item1_tv = (TextView) convertView.findViewById(R.id.item1_tv); convertView.setTag(holder1); break; case TYPE2: convertView = inflater.inflate(R.layout.itemlayout2, null, false); holder2 = new ViewHolder2(); holder2.item2_tv = (TextView) convertView.findViewById(R.id.item2_tv); convertView.setTag(holder2); break; case TYPE3: convertView = inflater.inflate(R.layout.itemlayout3, null, false); holder3 = new ViewHolder3(); holder3.item3_btn = (Button) convertView.findViewById(R.id.item3_btn); convertView.setTag(holder3); break; default: break; } } else { switch (type) { case TYPE1: holder1 = (ViewHolder1) convertView.getTag(); break; case TYPE2: holder2 = (ViewHolder2) convertView.getTag(); break; case TYPE3: holder3 = (ViewHolder3) convertView.getTag(); break; } } //为布局设置数据 switch (type) { case TYPE1: holder1.item1_tv.setText(users.get(position).getItem1_str()); break; case TYPE2: holder2.item2_tv.setText(users.get(position).getItem2_str()); break; case TYPE3: holder3.item3_btn.setText(users.get(position).getItem3_str()); break; } return convertView; } //为每种布局定义自己的ViewHolder public class ViewHolder1 { TextView item1_tv; } public class ViewHolder2 { TextView item2_tv; } public class ViewHolder3 { Button item3_btn; }}
User.java
package com.example.eventbus.listviewitemtype;/** * Created by LHD on 2016/7/1. */public class User { //第一种布局的字段 private String item1_str; //第二种布局的字段 private String item2_str; //第三种布局的字段 private String item3_str; public User(String item1_str, String item2_str, String item3_str) { this.item1_str = item1_str; this.item2_str = item2_str; this.item3_str = item3_str; } public String getItem1_str() { return item1_str; } public String getItem2_str() { return item2_str; } public String getItem3_str() { return item3_str; } public void setItem1_str(String item1_str) { this.item1_str = item1_str; } public void setItem2_str(String item2_str) { this.item2_str = item2_str; } public void setItem3_str(String item3_str) { this.item3_str = item3_str; } @Override public String toString() { return "User{" + "item1_str='" + item1_str + '\'' + ", item2_str='" + item2_str + '\'' + ", item3_str='" + item3_str + '\'' + '}'; }}
MainActivity.java
package com.example.eventbus.listviewitemtype;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.widget.ListView;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity { private ListView listView; private MyListviewAdapter adapter; private List<User> users; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = (ListView) findViewById(R.id.listview); initdata(); adapter = new MyListviewAdapter(this, users); listView.setAdapter(adapter); } //为了测试,特地将不同的布局的数据混乱的添加到list里 private void initdata() { users = new ArrayList<User>(); users.add(new User("第一个布局", null, null)); users.add(new User("第一个布局", null, null)); users.add(new User(null, "第二个布局", null)); users.add(new User("第一个布局", null, null)); users.add(new User(null, null, "第三个布局")); users.add(new User(null, "第二个布局", null)); users.add(new User(null, null, "第三个布局")); }}
布局非常简单,就不贴了。
代码下载:
http://dl.download.csdn.net/down11/20160702/597ee639c1a3fec26e0c320e72c72b96.zip?response-content-disposition=attachment%3Bfilename%3D%22ListViewItemType.zip%22&OSSAccessKeyId=9q6nvzoJGowBj4q1&Expires=1467393027&Signature=KxZjdTS26WE40ZaZhxW7b9ctH5g%3D
- listView加载不同布局
- ListView加载不同布局
- ListView加载不同布局
- Listview加载不同布局
- listview加载不同布局
- ListView 加载不同布局
- ListView中加载不同布局
- ListView加载不同的布局
- listView 加载不同布局item
- android ListView加载不同布局
- android ListView加载不同布局
- Android Listview加载不同布局
- ListView不同行加载不同布局
- Android listview 加载不同的布局实现
- ListView不同行加载不同布局
- ListView item加载不同的布局
- ListView加载不同Item布局的问题
- Android ListView使用不同对象加载不同布局
- Android 基础之创建一个实用,适用范围广的万能Adapter
- KMP模板
- 【Leetcode】234 Palindrome Linked List
- Python命令行工具集——pycli
- sublime Text3 安装错误PyV8
- listview加载不同布局
- Objective-C编程之——发送消息Send Message
- ui-router & ngRoute 学习笔记
- 练习5-10 编写程序expr,以计算从命令行输入的逆波兰表达式的值,其中每个运算符或操作数用一个单独的参数表示
- 控制ListView快速滑动不加载图片
- redis有哪些常用的操作
- [仙人掌最短路] BZOJ 2125 最短路
- 九宫格手机解锁有多少种情况?
- strong区别于retain