ListView不同type加载数据
来源:互联网 发布:windows 网络发现 编辑:程序博客网 时间:2024/06/11 00:41
1、listView加载不同类型的数据的要点有几个地方:
(1)要重写两个方法:
@Override
public int getViewTypeCount() {
return 4;
}
@Override
public int getItemViewType(int position) {
return stus.get(position).getType();
}
(2)在getView哪里加载布局和数据的复用的时候,记住先判断type再进行convertView是否为空的判断
(3)复用的时候还是用同一个ViewHolder,只不过字段不一样而已。
我把所有代码都写在MainActivity里面了,因为我的几个类型的布局没什么特色,所以就不上传了,只上传代:
public class MainActivity extends AppCompatActivity {
/**
* 造假数据
*
* @param savedInstanceState
*/
List<Student> stus = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView listView = (ListView) findViewById(R.id.listView);
initData();
listView.setAdapter(new MyAdapter());
}
private void initData() {
stus.add(new Student(1, 16, "一般陈1", R.mipmap.stu1));
stus.add(new Student(1, 17, "一般陈2", R.mipmap.stu2));
stus.add(new Student(1, 18, "一般陈3", R.mipmap.stu3));
stus.add(new Student(1, 19, "一般陈4", R.mipmap.stu4));
stus.add(new Student(1, 15, "一般陈5", R.mipmap.stu5));
stus.add(new Student(2, 16, "二般菜1", R.mipmap.stu6));
stus.add(new Student(2, 18, "二般菜2", R.mipmap.stu7));
stus.add(new Student(2, 20, "二般菜3", R.mipmap.stu8));
stus.add(new Student(2, 18, "二般菜4", R.mipmap.stu9));
stus.add(new Student(3, 18, "三般李1", R.mipmap.stu10));
stus.add(new Student(3, 18, "三般李2", R.mipmap.stu11));
stus.add(new Student(3, 17, "三般李3", R.mipmap.stu12));
stus.add(new Student(3, 18, "三般李4", R.mipmap.stu13));
stus.add(new Student(3, 16, "三般李5", R.mipmap.stu14));
stus.add(new Student(3, 18, "三般李6", R.mipmap.stu15));
stus.add(new Student(3, 16, "三般李7", R.mipmap.stu16));
stus.add(new Student(3, 18, "三般李8", R.mipmap.stu17));
stus.add(new Student(3, 17, "三般李9", R.mipmap.stu18));
stus.add(new Student(3, 18, "三般李10", R.mipmap.stu19));
stus.add(new Student(3, 19, "三般李11", R.mipmap.stu20));
stus.add(new Student(3, 19, "三般李12", R.mipmap.stu21));
stus.add(new Student(3, 18, "三般李13", R.mipmap.stu22));
}
private class MyAdapter extends BaseAdapter {
@Override
public int getCount() {
return stus == null ? 0 : stus.size();
}
// 告诉Listview 一共有几种类型的条目 , ListView就会准备几个 convertView的复用池
@Override
public int getViewTypeCount() {
return 4;
}
//根据position返回每个Item的type值,这个值不是你自己的那个type值,而是你告诉listView,你
//将这个类型的数据在listView中的type定义为那个值,后面getView会根据这个值来加载不同条目
//当然你也可以将这两个值写成一样,但是你不能把概念弄混了
@Override
public int getItemViewType(int position) {
return stus.get(position).getType();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
/**
* @param position
* @param convertView
* @param parent
* @return
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
switch (getItemViewType(position)) {
case 1:
if (convertView == null) {
convertView = View.inflate(parent.getContext(), R.layout.item_1, null);
holder = new ViewHolder();
holder.img = (ImageView) convertView.findViewById(R.id.item1_iv);
holder.name = (TextView) convertView.findViewById(R.id.item1_name);
holder.age = (TextView) convertView.findViewById(R.id.item1_age);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.name.setText(stus.get(position).getName());
holder.img.setImageResource(stus.get(position).getImg());
holder.age.setText(stus.get(position).getAge() + "");
break;
case 2:
if (convertView == null) {
convertView = View.inflate(parent.getContext(), R.layout.item_2, null);
holder = new ViewHolder();
holder.img = (ImageView) convertView.findViewById(R.id.item2_iv);
holder.name = (TextView) convertView.findViewById(R.id.item2_name);
holder.age = (TextView) convertView.findViewById(R.id.item2_age);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.name.setText(stus.get(position).getName());
holder.img.setImageResource(stus.get(position).getImg());
holder.age.setText(stus.get(position).getAge() + "");
break;
case 3:
if (convertView == null) {
convertView = View.inflate(parent.getContext(), R.layout.item_3, null);
holder = new ViewHolder();
holder.img = (ImageView) convertView.findViewById(R.id.item3_iv);
holder.name = (TextView) convertView.findViewById(R.id.item3_name);
holder.age = (TextView) convertView.findViewById(R.id.item3_age);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.name.setText(stus.get(position).getName());
holder.img.setImageResource(stus.get(position).getImg());
holder.age.setText(stus.get(position).getAge() + "");
break;
}
return convertView;
}
}
//虽然type不一样,加载的布局不一样,但是还是要讲究复用,如果几个布局的只是界面不一样,而数据类型就算不一样
//也用同一个viewHoler,只是多加几个字段而已
class ViewHolder {
TextView name;
TextView age;
ImageView img;
}
}
- ListView不同type加载数据
- listview不同的type
- listView加载不同布局
- ListView加载不同布局
- ListView加载不同布局
- Listview加载不同布局
- listview加载不同布局
- ListView 加载不同布局
- ListView中加载不同布局
- ListView加载不同的布局
- listView 加载不同布局item
- android ListView加载不同布局
- android ListView加载不同布局
- listview加载不同的样式
- ListView加载不同的条目
- Android Listview加载不同布局
- ListView的不同item加载不同Layout
- ListView的不同item加载不同Layout
- 文本数据的机器学习自动分类方法(上)
- lite-server工具使用
- EditText的富媒体开发(Edittext显示网络图片) 一
- C语言与C++编译连接的不同点(从程序中看)
- 串口打印设置
- ListView不同type加载数据
- OkHttp3简单使用说明
- Sql基础语句3
- 蓝图职业规划
- supervise系统进程监控
- 使用ngrok工具映射本地项目到外网地址
- UIGraphicsGetCurrentContext 和CGBitmapContextCreate 使用CGContextAddArc的奇怪处
- iOS9之后 字符串转utf8格式
- 【mysql】Linux基础知识:如何解决mysql数据库自动关闭