(转)ListView——BaseAdapter

原文连接:http://xqjay19910131-yahoo-cn.iteye.com/blog/1167956

 

自定义Adapter继承BaseAdapter 

Custom_BaseAdapterActivity.java

public class Custom_BaseAdapterActivity extends ListActivity {

    List<Map<String,Object>> list;
    
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        
        list = getListData();
        setContentView(R.layout.listdemo2);
        
        MyAdapter myAdapter = new MyAdapter(this);
        setListAdapter(myAdapter);
    }
    
    public List<Map<String,Object>> getListData(){
        list = new ArrayList<Map<String,Object>>();
        
        Map<String,Object> map1 = new HashMap<String,Object>();
        Map<String,Object> map2 = new HashMap<String,Object>();
        map1.put("headimg", R.drawable.lxq);
        map1.put("nickname", "蜗牛/");
        map1.put("textsign", "乘着风游荡在蓝天边 一片云掉落在我面前.");
        
        map2.put("headimg", R.drawable.hyl);
        map2.put("nickname", "轩凌涵舞");
        map2.put("textsign", "以后我儿子得有两门必修课,打篮球和拉小提琴.");
        
        list.add(map1);
        list.add(map2);
        
        return list;
    }
    
    public final class ViewHolder{
        public ImageView headimg;
        public TextView nickname;
        public TextView textsign;
        public Button listbtn;
    }
    
    public class MyAdapter extends BaseAdapter{
        
        private LayoutInflater flater;
        
        public MyAdapter(Context context) {
            super();
            this.flater = LayoutInflater.from(context);
        }

        public int getCount() {
            // TODO Auto-generated method stub
            return list.size();
        }

        public Object getItem(int arg0) {
            // TODO Auto-generated method stub
            return null;
        }

        public long getItemId(int arg0) {
            // TODO Auto-generated method stub
            return 0;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub
            ViewHolder holder = null;
            if(convertView == null){
                holder = new ViewHolder();
                convertView = flater.inflate(R.layout.user2, null);
                holder.headimg = (ImageView) convertView.findViewById(R.id.headimg);
                holder.nickname = (TextView) convertView.findViewById(R.id.nickname);
                holder.textsign = (TextView) convertView.findViewById(R.id.textsign);
                holder.listbtn = (Button) convertView.findViewById(R.id.listbtn);
                convertView.setTag(holder);
            }
            else{
                holder = (ViewHolder) convertView.getTag();
            }
            holder.headimg.setBackgroundResource((Integer)list.get(position).get("headimg"));
            holder.nickname.setText((String)list.get(position).get("nickname"));
            holder.textsign.setText((String)list.get(position).get("textsign"));
            holder.listbtn.setOnClickListener(new View.OnClickListener() {
                public void onClick(View arg0) {
                }
            });
            return convertView;
        }
    }
}

 

listdemo2.xml

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:gravity="center_horizontal"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
  
   <TextView
    android:gravity="center_horizontal"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:text="默默 De 爱"
      android:textSize="12pt"
      android:textStyle="italic"
  />
  
  <ListView
      android:id="@+id/android:list"
      android:gravity="center_horizontal"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:scrollbars="vertical"
  />
</LinearLayout>

 

user2.xml

 

 

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
  
  <LinearLayout
      android:orientation="horizontal"
      android:gravity="center_vertical"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:layout_margin="5px"
      android:layout_alignParentLeft="true"
  >
  <ImageView
      android:id="@+id/headimg"
      android:layout_width="64px"
      android:layout_height="64px"
  />
  <LinearLayout
      android:orientation="vertical"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_marginLeft="4dip"
  >
  <TextView
      android:id="@+id/nickname"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:textSize="8pt"
      android:textStyle="bold"
      android:textColor="#FFFFFF"
  />
  
  <TextView
      android:id="@+id/textsign"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:textSize="6pt"
      android:singleLine="true"
      android:textColor="#FFFFFF"
  />
  </LinearLayout>
  </LinearLayout>
  <Button
      android:id="@+id/listbtn"
      android:layout_marginLeft="20px"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Click"
      android:layout_alignParentRight="true"
      android:layout_centerVertical="true"
  />
</RelativeLayout>

 

引用
编写自定义Adapter可以继承BaseAdapter类,如果是数据库使用可以继承CursorAdapter。在本例中继承了BaseAdapter类,BaseAdapter是一个抽象类,必须在它的子类中实现下面的方法: 


• int getCount()   返回总数据源中总的记录数; 
• Object getItem(int position)   根据选择的项目的位置,获得选择的数据源中某个项目的数据; 
• long getItemId(int position)   根据选择的项目的位置; 
• View getView(int position, View convertView, ViewGroup parent)   获得要展示的项目View对象。 


这里最为麻烦的方法就是getView(),getView()方法是ListView的每个列表项目绘制在屏幕上时被调用。该方法其中的一个参数是convertView,在ListView第一次显示列表项目的时候,convertView是null值。当向上滑动屏幕时候,屏幕上面的列表项目退出屏幕,屏幕下面原来不可见的列表项目会进入屏幕,这个时候的convertView不是null值,下面代码的处理对于提供ListView控件提高性能是至关重要的。 

if (convertView == null) { 
convertView = mInflater.inflate(R.layout.main, null); 

holder = new ViewHolder(); 
holder.text = (TextView) convertView 
.findViewById(R.id.textview); 
holder.icon = (ImageView) convertView.findViewById(R.id.icon); 

convertView.setTag(holder); 
} else { 
holder = (ViewHolder) convertView.getTag(); 
} 

 



只有在convertView为null时才去实例化控件,创建convertView对象、holder对象,其中convertView对象是通过mInflater.inflate(R.layout.main, null)方法,从一个main.xml布局文件中加载并创建的。 
而在convertView非null的时候不会实例化控件,否则每次都要实例化控件,当列表项目很多时,用户反复滑动屏幕会有“卡”的感觉,不再流畅了。 
ViewHolder类是将每一个项目中的控件封装起来的类,可以在convertView 为null时候创建ViewHolder类的实例holder,然后通过convertView.setTag(holder);把它放到convertView中,而在convertView非null时候,再通过convertView.getTag()过的一个ViewHolder类的实例,这样在翻屏的时候就不会反复创建ViewHolder实例对象了,就本例而言只是创建了9个ViewHolder实例。 

 

posted @ 2012-09-24 10:49  loverszhaokai  阅读(169)  评论(0编辑  收藏  举报