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);
}
}