Android-BaseAdapter学习

来源:互联网 发布:软件研发部管理制度 编辑:程序博客网 时间:2024/06/10 08:40

当我们要自定义ListView控件的时候,我们自定义的Adapter就要继承Baseadapter来定制我们要实现的功能。

Note:

         当我们继承BaseAdapter类的时候,最重要的是getView方法,在这个方法中我们来对ListView进行优化,这里边有两点是用来进行优化的:

          1. 自定义的ViewHolder类,用了保存通过findViewById获取的每个Item中各个控件的id,这样可以减少在加载list的时候查找id的时间。

          2.判断contentView是否为空,来复用Item,避免每次显示一个Item的时候,都需要重新加载一个新Item的布局。比如,一个Listview有100条数据,但是我们的屏幕只能够显示10条数据,如果不进行判断,当我们下拉显示所有数据的时候,内存中就会加载100条item的布局,而进行判断之后,则内存中只加载10条新的item的布局,然后下拉显示数据时,就会复用这10条Item的布局,只是数据进行变化。

           除了以上两点,ListView还有其他地方需要优化,比如数据异步加载,图片缓存等方面。


下面我再给出一个Fragment中使用BaseAdapter实例:

1、ListFragment.class

import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.content.Intent;import android.os.Bundle;import android.support.v4.app.Fragment;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.ListView;import android.widget.TextView;public class ListFragment extends Fragment {private ListView contactList;private List<Map<String,Object>> dataList;private MyAdapter myAdapter;@Overridepublic void onCreate(Bundle savedInstanceState) {Log.w("onCreate", "执行");super.onCreate(savedInstanceState);}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {Log.w("", "onCreateView()执行");View view=inflater.inflate(R.layout.list_fragment,container,false);contactList=(ListView) view.findViewById(R.id.contactListView);init();//在此初始化return view;}private void init(){Log.w(getClass().getName()+" init(): ", "start");dataList=new ArrayList<Map<String,Object>>();getData();myAdapter=new MyAdapter();contactList.setAdapter(myAdapter);Log.w(getClass().getName()+" init(): ", "end");}//把数据放入list中,数据源可以来自网络,本地文件,本例子自动赋值private void getData(){Log.w(this.getClass().getName()+" getData()", "start");Map<String , Object> map;for(int i = 0;i<100;i++ ){map=new HashMap<String, Object>();map.put("contactName", "name : "+i);map.put("contactNumber", "100"+ "i");map.put("contactIcon", R.drawable.icon_tab_calllog);dataList.add(map);}}private class MyAdapter extends BaseAdapter{private LayoutInflater mInflater;public MyAdapter() {    this.mInflater=LayoutInflater.from(getActivity());}@Overridepublic int getCount() {System.out.println("getCount() start!!!!!!!!! "+dataList.size());return dataList.size();}@Overridepublic Object getItem(int position) {return position;}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {Log.w(getClass().getName()+" getView(): ", "start");ViewHolder viewHolder;if(convertView==null){System.out.println("convert==null");convertView=mInflater.inflate(R.layout.contact_list_item,null);viewHolder=new ViewHolder();viewHolder.contactIcon=(ImageView) convertView.findViewById(R.id.contactIcon);viewHolder.contactName=(TextView) convertView.findViewById(R.id.contactName);viewHolder.contactNumber=(TextView) convertView.findViewById(R.id.contactNumber);convertView.setTag(viewHolder);}else{viewHolder=(ViewHolder) convertView.getTag();}viewHolder.contactIcon.setImageResource((Integer) dataList.get(position).get("contactIcon"));viewHolder.contactName.setText((CharSequence) dataList.get(position).get("contactText"));viewHolder.contactNumber.setText((CharSequence) dataList.get(position).get("contactNumber"));convertView.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//自定义点击事件}});return convertView;}}static class ViewHolder{ImageView contactIcon;TextView contactName;TextView contactNumber;}}

2、list_fragment.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >        <ListView         android:id="@+id/contactListView"        android:layout_width="fill_parent"        android:layout_height="fill_parent"        >            </ListView></LinearLayout>

3、contact_list_item.xml 自定义list中每一个item要显示的内容

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="horizontal" >        <ImageView        android:id="@+id/contactIcon"        android:layout_width="50dp"        android:layout_height="50dp"        android:contentDescription="头像"        />        <LinearLayout        android:layout_height="fill_parent"        android:layout_width="wrap_content"        android:orientation="vertical"        >                <TextView            android:id="@+id/contactName"            android:layout_width="fill_parent"            android:layout_height="wrap_content"             />                <TextView             android:id="@+id/contactNumber"            android:layout_width="fill_parent"            android:layout_height="wrap_content"            />    </LinearLayout>    </LinearLayout>


参考文章了,给出链接:

http://www.cnblogs.com/loulijun/archive/2011/12/28/2305016.html



0 0