地址
http://blog.csdn.net/xiangyong_1521/article/details/78653538
目录
- 以ListView为例的工作原理
- ViewHolder的作用
- getItemViewType和getViewTypeCount
- 实现
- 实现步骤
- ListView针对List中每个item, adapter都会调用一个getView的方法获得布局视图
- 我们一般会Inflate一个新的View,填充数据并返回显示
如果我们的Item很多话,Android中有个叫做Recycler的构件,无论数据中是多少个item,在显示上Recycler只存储其中可见的View在内存中:
Recycler工作原理
Adapter中常见的getView方法的调用:
public View getView(int position, View convertView, ViewGroupparent){
if (convertView ==null) {
convertView =LayoutInflater.from(mContext).inflate(R.layout.item_view, null);
}
//dosomething…
return converView;
}
ViewHolder的作用
Recycler模式是为了解决重复inflate时候造成的View资源浪费,ViewHolder则是进一步进行性能优化,我们拿到convertView的时候,每次都会根据这个布局去findViewById,如果没加载一次的话,还是很吃力,所以就有ViewHolder的概念:
使用一个静态类,保存xml中的各个子View的引用关系,这样就不必要每次都去解析xml了
class ViewHolder_a{
TextView textView;
ImageView imageView;
Button button;
}
这才得出一个刚到及格线的getView:
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.item_view, null);
holder = new ViewHolder();
holder.titleTextView = (TextView) convertView.findViewById(R.id.text);
holder.iconImageView = (ImageView) convertView.findViewById(R.id.icon);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.titleTextView.setText(DATA[pos].title);
holder.iconImageView.setImageBitmap(DATA[pos].bitmap);
return convertView;
}
static class ViewHolder {
TextView titleTextView;
ImageView iconImageView;
}
getItemViewType和getViewTypeCount
前一篇中实现了各种样式的Adapter,从简单的单字符类型,到多字符类型,再到有button的类型,当一个listview需要加载各种不同的item时,就需要getItemViewType和getViewTypeCount这两个adapter内部方法。
//返回由getView创建的视图类型的数量。每种类型都表示可以在getView中转换的一组视图。
@Override
public int getViewTypeCount() {
return super.getViewTypeCount();
}
和
//获取将由getView为指定项目创建的视图类型。
@Override
public int getItemViewType(int position) {
return position;
实现
Main:
public class FrameLyout4 extends Fragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = LayoutInflater.from(getActivity()).inflate(R.layout.fragment4, container , false);
mDate = getDate();
initView(view);
return view;
}
public List<Map<String, Object>> getDate(){
List<Map<String, Object>> list = new ArrayList<Map<String,Object>>();
Map<String, Object> map = new HashMap<String, Object>();
map.put("tv", "京东"); //0
map.put("im", R.drawable.jingdong);
list.add(map);
map = new HashMap<String, Object>(); //1
map.put("title", "摩托罗拉");
map.put("jia", "价格:2000");
map.put("img", R.drawable.moto);
list.add(map);
map = new HashMap<String, Object>();//2
map.put("ti", "丰田");
list.add(map);
map = new HashMap<String, Object>();//3
map.put("tv", "阿里");
map.put("im", R.drawable.ali);
list.add(map);
map = new HashMap<String, Object>();//4
map.put("title", "诺基亚");
map.put("jia", "价格:3000");
map.put("img", R.drawable.nuojiya);
list.add(map);
map = new HashMap<String, Object>();//5
map.put("ti", "本田");
list.add(map);
map = new HashMap<String, Object>();//6
map.put("tv", "腾讯");
map.put("im", R.drawable.tx);
list.add(map);
map = new HashMap<String, Object>();//7
map.put("title", "三星");
map.put("jia", "价格:4000");
map.put("img", R.drawable.sanxing);
list.add(map);
map = new HashMap<String, Object>();//8
map.put("ti", "马自达");
list.add(map);
map = new HashMap<String, Object>();//9
map.put("tv", "百度");
map.put("im", R.drawable.baidu);
list.add(map);
return list;
}
ListView listView;
private void initView(View view) {
listView=(ListView) view.findViewById(R.id.list4);
listView.setAdapter(new MyAdapter());
}
List<Map<String, Object>> mDate;
public class MyAdapter extends BaseAdapter{
@Override
public int getViewTypeCount() {//返回Item的类型总数
return super.getViewTypeCount();
}
@Override
public int getItemViewType(int position) {
if (position==0 || position == 3|| position == 9|| position == 6) {
return 0;
}else if (position==1 || position == 4|| position == 7) {
return 1;
}else{
return 2;
}
}
@Override
public int getCount() {
return mDate.size();
}
@Override
public Object getItem(int position) {
return mDate.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
ViewHolder_a holder1;
ViewHolder_b holder2;
ViewHolder_c holder3;
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
switch (getItemViewType(position)) {
case 0:
holder1 = new ViewHolder_a();
if (convertView==null) {
convertView = View.inflate(getActivity(),R.layout.list_item2, null);
holder1.imageView = (ImageView) convertView.findViewById(R.id.item_im3);
holder1.textView = (TextView) convertView.findViewById(R.id.item_tv3);
holder1.button = (Button) convertView.findViewById(R.id.itm_bt3);
convertView.setTag(holder1);
}else{
holder1=(ViewHolder_a) convertView.getTag();
}
Log.i("md", "mDate():"+mDate);
holder1.imageView.setBackgroundResource((Integer) mDate.get(position).get("im"));
holder1.textView.setText((String) mDate.get(position).get("tv"));
holder1.button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
}
});
break;
case 1:
holder2 = new ViewHolder_b();
if (convertView==null) {
convertView = View.inflate(getActivity(), R.layout.list_item, null);
holder2.imageView = (ImageView) convertView.findViewById(R.id.item_im);
holder2.textView = (TextView) convertView.findViewById(R.id.item_tv);
holder2.textView2 = (TextView) convertView.findViewById(R.id.item_tv2);
convertView.setTag(holder2);
}else{
holder2=(ViewHolder_b) convertView.getTag();
}
holder2.imageView.setBackgroundResource((Integer) mDate.get(position).get("img"));
holder2.textView.setText((String) mDate.get(position).get("title"));
holder2.textView2.setText((String) mDate.get(position).get("jia"));
break;
case 2:
holder3 = new ViewHolder_c();
if (convertView == null) {
convertView = View.inflate(getActivity(), R.layout.list_item3, null);
holder3.imageView1 = (ImageView)convertView.findViewById(R.id.item3_im1);
holder3.imageView2 = (ImageView)convertView.findViewById(R.id.item3_im2);
holder3.textView = (TextView)convertView.findViewById(R.id.item3_tv);
convertView.setTag(holder3);
}else{
holder3 = (ViewHolder_c) convertView.getTag();
}
holder3.textView.setText((String)mDate.get(position).get("ti"));
holder3.imageView1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
}
});
holder3.imageView2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
}
});
break;
}
return convertView;
}
}
class ViewHolder_a{
TextView textView;
ImageView imageView;
Button button;
}
class ViewHolder_b{
TextView textView;
TextView textView2;
ImageView imageView;
}
class ViewHolder_c{
TextView textView;
ImageView imageView1;
ImageView imageView2;
}
}
实现效果
实现步骤
- 首先我们需要为不同的Item设置不同的数值,int值,因为getItemViewType返回的是int值,所以需定义成int,必须从0开始,依次递增。
@Override
public int getItemViewType(int position) {
if (position==0 || position == 3|| position == 9|| position == 6) {
return 0;
}else if (position==1 || position == 4|| position == 7) {
return 1;
}else{
return 2;
}
}
- 重写getItemViewType和getViewTypeCount方法后,getViewTypeCount返回Item的则为我们定义的position,然后在getView可以进行判断
switch (getItemViewType(position)) {
...
}
- 定义ViewHolder,根据类型的不同需要定义多个ViewHolder1,2,3,加载对应的布局和数据
- 添加好数据后,listview.setAdapter就行了!
网友评论