现在的位置: 首页 > 综合 > 正文

Android-BaseAdapter学习

2018年05月14日 ⁄ 综合 ⁄ 共 4713字 ⁄ 字号 评论关闭

当我们要自定义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;
	
	
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		Log.w("onCreate", "执行");
		super.onCreate(savedInstanceState);
		
	}

	@Override
	public 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());

		}

		@Override
		public int getCount() {
			System.out.println("getCount() start!!!!!!!!! "+dataList.size());
			return dataList.size();
		}

		@Override
		public Object getItem(int position) {
			return position;
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public 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() {
				
				@Override
				public 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

抱歉!评论已关闭.