Android 简单的BaseListAdapter封装+巧用ListView加载不同布局文件

来源:互联网 发布:若非吾故人乎翻译 编辑:程序博客网 时间:2024/06/06 17:07

先上代码:撸一个简单的BaseListAdapter类:

/** * Created by ekikousei易皇星 on 17/2/22. * E-mail:13764664731@163.com * Signature:缘分是本书,翻的不经意会错过,读的太认真会流泪!! * <p> * TODO:类描述: */public abstract class BaseListAdapter<T> extends BaseAdapter {    protected  List<T> mTList=new ArrayList<>();    protected Context mContext;    protected LayoutInflater mInflater;    public BaseListAdapter(Context mContext,List<T> mTList) {        this.mContext=mContext;        this.mTList=mTList;        mInflater= LayoutInflater.from(mContext);    }    @Override    public int getCount() {        return mTList.size();    }    @Override    public T getItem(int i) {        return (T)mTList.get(i);    }    @Override    public long getItemId(int i) {        return i;    }    public void clearAll() {        mTList.clear();    }    public  List<T> getData(){        return  mTList;    }    public  void addAll(List<T> lists){        if(null==lists || lists.size()==0){            return;        }else {            notifyDataSetChanged();        }    }    public  void add(T item){        mTList.add(item);        notifyDataSetChanged();    }  public  void removeEntity(T item){      mTList.remove(item);  }}

第二步:巧用getItemViewType加载不同布局

/** * Created by ekikousei易皇星 on 17/2/22. * E-mail:13764664731@163.com * Signature:缘分是本书,翻的不经意会错过,读的太认真会流泪!! * <p> * TODO:类描述: */public class ListAdapter extends  BaseListAdapter<ItemInfo> {    private static final int TYPE_COUNT = 2;//item类型的总数    private static final int TYPE_COMSUM = 0;//男类型    private static final int TYPE_CHARGE = 1;//女类型    private  List<ItemInfo> mTList;    /**    之类继承父类,一定要实现父类的构造方法,否则出现:     There is no default constructor available     */    public ListAdapter(Context mContext, List<ItemInfo> mTList) {        super(mContext, mTList);        this.mTList=mTList;    }    @Override    public int getItemViewType(int position) {        if("0".equals(mTList.get(position).getType())){            return TYPE_COMSUM;        }else if("1".equals(mTList.get(position).getType())){            return TYPE_CHARGE;        }        return 0;    }    @Override    public int getViewTypeCount() {        return TYPE_COUNT;    }    @Override    public View getView(int i, View view, ViewGroup viewGroup) {      int type=  getItemViewType(i);        if(type==TYPE_COMSUM){            view=  mInflater.inflate(R.layout.listview_item,null);            TextView tvname= (TextView) view.findViewById(R.id.name);            TextView tvsex= (TextView) view.findViewById(R.id.sex);            tvname.setText(mTList.get(i).getName());            tvsex.setText(mTList.get(i).getSex());            return view;        }else if(type==TYPE_CHARGE){            view=  mInflater.inflate(R.layout.listview_item_other,null);            TextView tvname= (TextView) view.findViewById(R.id.name);            TextView tvsex= (TextView) view.findViewById(R.id.sex);            tvname.setText(mTList.get(i).getName());            tvsex.setText(mTList.get(i).getSex());            return view;        }        return null;    }}

在上面的getView()方法里面,根据getItemViewType()来加载item所需要的布局文件

item布局文件:listview_item.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"              android:orientation="vertical"              android:layout_width="match_parent"              android:layout_height="match_parent">    <TextView        android:id="@+id/name"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="item"/>    <TextView        android:layout_marginTop="16dp"        android:id="@+id/sex"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="item"/></LinearLayout>

在listAdapter的getview() 中还有一个item布局文件listview_item_other.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"              android:orientation="vertical"              android:layout_width="match_parent"              android:layout_height="match_parent">\    <TextView        android:id="@+id/name"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="item"/>    <TextView        android:id="@+id/sex"        android:layout_marginTop="15dp"        android:gravity="right"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="item"/></LinearLayout>

搞定listAdapter,查不到就完事了

public class MainActivity extends AppCompatActivity {    private  List<ItemInfo> list=new ArrayList<>();    private ListView listview;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        listview= (ListView) findViewById(R.id.listview);        for (int i = 0; i <100 ; i++) {            if(i%2==0){                ItemInfo info=new ItemInfo();                info.setName("item"+i);                info.setSex("男"+i);                info.setType("0");                list.add(info);            }else {                ItemInfo info=new ItemInfo();                info.setName("item"+i);                info.setSex("女"+i);                info.setType("1");                list.add(info);            }        }        ListAdapter mlistadapter=new ListAdapter(MainActivity.this,list);        listview.setAdapter(mlistadapter);    }}

效果图:

这里写图片描述

0 0