ListView的优化——打造万能的adapter(一)

ListView的优化打找条目不同的适配器,当我们在做项目的时候,对于同样的ListView可以进行优化,不必在创建多个一样的适配器。这是我试着去封装对应的ListView。
import java.util.List;
import com.example.listview.holder.BaseHolder;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

public abstract class MyBaseAdater<T> extends BaseAdapter {

private List<T> list;
private BaseHolder holder;

public MyBaseAdater(List<T> list) {
    super();
    this.list = list;
}

@Override
public int getCount() {
    return list.size();
}

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

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if(convertView == null){
        holder = getHolder();
    }else{
        //根据tag找到holder
        if(convertView.getTag() != null){
            holder = (BaseHolder) convertView.getTag();
        }
    }

    //将设置控件的数据也放到BaseHolder里面
    holder.setData(list.get(position));

    //返回的是对应的holder的view对象
    return holder.getView();
}

//给子类去创建对应的holder条目
public abstract BaseHolder getHolder();

}

这个对应的一个基础适配器的封装,简单的理解就是我们将view.inflate和findiewbyId ,settag放在了holder里面的,创建holder的时候就去做上面的操作。然后可以通过gettag获取holder对象。
然后将对应的条目的数据绑定到对应的条目上,于是就setData()方法将数据传递给对应的holder里面。也就是说这样就可以在holder里面获取到对应的条目的数据。 然后在holder里面获取对应的view 对象来让返回。
于是BaseHolder就必需实现下面的功能:
import android.content.Context;
import android.view.View;

//BaseHoldr主要去执行查找控件,设置tag和设置数据给控件
public abstract class BaseHolder<T> {

private T mData;
private View view;
public Context context;

//当一创建的时候就去查找控件和设置tag,因此要放在构造方法里面
public BaseHolder(Context context) {
    this.context = context;
    view = initView();
    //设置tag
    view.setTag(this);
}


//当数据进来之后就要将数据设置到控件上
public void setData(T mData) {
    this.mData = mData;
    refreshView();
}

//获取对应的条目的view对象
public View getView() {
    return view;
}

//获取对应的条目的数据
public T getData(){
    return mData;
}

//不同的listview的条目的控件不同 交给子类去完成查找控件
public abstract View initView();
//控件未知也要交给子类去实现填充对应的控件的数据
public abstract void refreshView();
}

于是当我们创建不同的listView就可以用上面的模版了 然后的话就只是对应的listview的holder不同就会产生对应的listView,下面就可以实现了队员的listView的功能了。
import java.util.ArrayList;
import java.util.List;
import com.example.listview.adapter.MyBaseAdater;
import com.example.listview.holder.BaseHolder;
import com.example.listview.holder.FirstHolder;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ListView;

public class MainActivity extends Activity {

    private List<String> firstList;
    private ListView lv_test;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initData();
        initView();

        //将数据传递给对应的MyBaseAdapter适配器
        FirstAdapter firstAdapter = new FirstAdapter(firstList);
        lv_test.setAdapter(firstAdapter);
    }

    private void initView() {
        lv_test = (ListView) findViewById(R.id.lv_test);
    }

    private void initData() {
        firstList = new ArrayList<String>();
        for(int i=0; i<30; i++){
            firstList.add("嘻嘻哈哈"+i);
        }

    }

    class FirstAdapter extends MyBaseAdater<String>{


        public FirstAdapter(List<String> list) {
            super(list);
        }

        //获取对应的条目,注意的新建的时候等于context传递给Baseholder,不是直接传递给FirstHolder,不然会报initview空指针。
        @Override
        public BaseHolder getHolder() {
            return new FirstHolder(MainActivity.this);
        }

    }
}

FirstHolder为:
import com.example.listview.R;

import android.content.Context;
import android.view.View;
import android.widget.TextView;

public class FirstHolder extends BaseHolder<String> {
    public FirstHolder(Context context) {
        super(context);
    }

private TextView tv_first;

//初始化对应的控件
@Override
public View initView() {
    View view= View.inflate(context, R.layout.item_first, null);
    tv_first = (TextView) view.findViewById(R.id.tv_first);
    return view;
}

//将数据填充到对应的控件上
@Override
public void refreshView() {
    //获取对应的条目的数据
    String data = getData();
    tv_first.setText(data);
}

}

代码下载为:
http://download.csdn.net/detail/xks19943/9453959

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值