ListView数据的展示主要依靠是Adapter数据适配器
- ArrayAdapter:支持泛型操作,最简单的一个Adapter,只能展现一行文字
public ArrayAdapter(Context context, @LayoutRes int resource, @IdRes int textViewResourceId,@NonNull T[] objects)
//例如
ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, new String[]{"item1","item2"});
- SimpleAdapter:同样具有良好扩展性的一个Adapter,可以自定义多种效果
public SimpleAdapter(Context context, List<? extends Map<String, ?>> data,
@LayoutRes int resource, String[] from, @IdRes int[] to) ;
//例如
SimpleAdapter adapter = new SimpleAdapter(this, getData(),R.layout.list_2,
new String[]{"img","text1", "text2"}, new int[]{R.id.imv, R.id.text1, R.id.text2});
R.layout.list_2 //自定义布局包含img以及两个textview
如下布局
AEBDF573-0D95-40EE-9235-332737650B3A.png
- BaseAdapter:抽象类,实际开发中我们会继承这个类并且重写相关方法,用得最多的一个Adapter
1、继承BaseAdapter之后,需要重写以下四个方法:getCount,getItem,getItemId,getView。
2、其中getView方法最为重要,在这里会根据实现定义好的布局确定显示的效果,并返回一个view对象在item中展示出来。
3、关于listview的优化也在getView里展现。如下代码,其实ViewHolder和contentView可以不用,直接导入布局显示内容就可以了就像下面这样,意味着有多少行就绘制多少行,如若是几千行,性能消耗就不止是一点了
public View getView(int position, View convertView, ViewGroup parent) {
//加载布局为一个视图
View view=inflater.inflate(R.layout.layout_student_item,null);
Student student=getItem(position);
//在view视图中查找id为image_photo的控件
ImageView imageViewIcon= (ImageView) (ImageView)convertView.findViewById(R.id.imv);
....
imageViewIcon.setImageResource...
...
return view;
}
//优化后的代码
//一个是防止重绘view,二是借助tag来寻找view,这样就避免了findViewById对控件的层层查询。值得考究
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (null == convertView) {
convertView = mInflater.inflate(R.layout.list_2, null);
holder.imageViewIcon = (ImageView)convertView.findViewById(R.id.imv);
holder.textViewTitle = (TextView)convertView.findViewById(R.id.text1);
holder.textViewDesc = (TextView)convertView.findViewById(R.id.text2);
convertView.setTag(holder);
}else {
holder = (ViewHolder) convertView.getTag();
}
DataModule dataModule = mListModule.get(position);
if (dataModule.iconResId > 0) {
holder.imageViewIcon.setImageResource(dataModule.iconResId);
} else {
holder.imageViewIcon.setImageResource(R.drawable.icon_user);
}
....
}
网友评论