写这个demo的时候发现炒鸡牛鼻adapter在setList的时候传入null会报空指针,简直就是打脸啊,于是稍微修改了一下,
没有用过的小伙伴不知道这个adapter的牛逼之处,各种方法都不用管,只要重写
public int getItemResourceId() {
return 0;指定布局id
}
public void initItemView(PxViewHolder viewHolder, List<EmptyBean> list, int position) {
//指定到控件 viewHolder.<TextView>getView(R.id.item_name)--->泛型的写法让你不用去自定义viewholder 直接通过id就指定到控件
}
只要重写这2个方法就好了,别的都是自动生成的
还有一点需要注意到是创建 Adapter 类的时候需要指定 item中加载的数据类型
class MyAdapter extends TsmBaseAdapter<EmptyBean>{//这里面的 EmptyBean 就是指定的item的类型
}
用了这么多的adapter,真心没见过比这个还好用的adapter了,
再一次附上代码
package com.example.administrator.testempty; import android.app.Activity; import android.content.Context; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import java.util.ArrayList; import java.util.List; public abstract class TsmBaseAdapter<T> extends BaseAdapter { private String TAG; public Activity context; private LayoutInflater inflater; public List<T> list; public View view; /* 尖括号里面的就是adapter中的实体 */ public TsmBaseAdapter(Activity context, List<T> list) { this.context = context; TAG = this.getClass().getSimpleName(); this.list = list; if (this.list == null) this.list = new ArrayList<T>(); inflater = this.context.getLayoutInflater(); } public void setList(List<T> list) { this.list = list; if (this.list == null) this.list = new ArrayList<T>(); notifyDataSetChanged(); } public void addList(List<T> list){ if(list==null||list.size()==0) return; this.list.addAll(list); notifyDataSetChanged(); } @Override public int getCount() { return this.list.size(); } @Override public Object getItem(int position) { return this.list.get(position); } public View initConvertView(int resource) { return inflater.inflate(resource, null); } @Override public long getItemId(int position) { return position; } public abstract int getItemResourceId(); public abstract void initItemView(PxViewHolder viewHolder, List<T> list, int position); @Override public View getView(int position, View convertView, ViewGroup parent) { final PxViewHolder viewHolder = PxViewHolder.get(context, convertView, parent, getItemResourceId(), position); // initItemView(viewHolder, getItem(position),list,position); initItemView(viewHolder, list, position); return viewHolder.getConvertView(); } public static class PxViewHolder { private final SparseArray<View> mViews; private int mPosition; private View mConvertView; private PxViewHolder(Context context, ViewGroup parent, int layoutId, int position) { this.mPosition = position; this.mViews = new SparseArray<View>(); mConvertView = LayoutInflater.from(context).inflate(layoutId, parent, false); mConvertView.setTag(this); } public static PxViewHolder get(Context context, View convertView, ViewGroup parent, int layoutId, int position) { if (convertView == null) { return new PxViewHolder(context, parent, layoutId, position); } return (PxViewHolder) convertView.getTag(); } public View findViewById(int viewId) { return mConvertView.findViewById(viewId); } public View getConvertView() { return mConvertView; } public <T extends View> T getView(int viewId) { View view = mViews.get(viewId); if (view == null) { view = mConvertView.findViewById(viewId); mViews.put(viewId, view); } return (T) view; } public int getPosition() { return mPosition; } } }
下面重点说一下抽象布局 viewstub 在主布局中声明该view ,并指定layout 对象
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:id="@+id/lv_test" android:layout_width="match_parent" android:layout_height="match_parent"> </ListView> <ViewStub android:id="@+id/vs_empty" android:layout_width="match_parent" android:layout_height="match_parent" android:layout="@layout/empty"/> </FrameLayout> </RelativeLayout>
下面这个是empty 的布局 就是一个ImageView+Button 为了方便就封装了一个控件 设置了一个点击方法一个更换图片的方法,在没网和空数据的情况下使用不用的图片,
比单独使用起来方便了很多,
<?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"> <com.example.administrator.testempty.EmptyView android:id="@+id/empty_view" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center"> </com.example.administrator.testempty.EmptyView> </LinearLayout>
下面是activity代码 由于viewstub在 没调用inflate()方法时 系统是不会加载的,这个时候你找到viewstub中的EmptyView的时候就会报空指针,所以在使用的时候必须先要调用
inflate(),其他的我就没有什么说的了,都比较简单
package com.example.administrator.testempty; import android.app.Activity; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.ViewStub; import android.widget.AdapterView; import android.widget.ListView; import android.widget.TextView; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { private EmptyView empty_view; private ListView lv_empty; private MyAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ViewStub vs_empty = (ViewStub) findViewById(R.id.vs_empty); vs_empty.inflate(); empty_view=(EmptyView)findViewById(R.id.empty_view); empty_view.setEmptyBtnClickListeners(new EmptyView.EmptyBtnClickListeners() { @Override public void onClick() { adapter.setList(newshuju()); } }); lv_empty=(ListView)findViewById(R.id.lv_test); lv_empty.setEmptyView(empty_view); adapter=new MyAdapter(this,null); lv_empty.setAdapter(adapter); adapter.setList(newshuju()); lv_empty.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if(position==0){ empty_view.setImage(R.mipmap.meishuju); adapter.setList(null); } if(position==1){ empty_view.setImage(R.mipmap.meiwang); adapter.setList(null); } } }); } private List<EmptyBean> newshuju(){ List<EmptyBean> bean=new ArrayList<>(); EmptyBean b1=new EmptyBean(); b1.setName("点击这个清空数据"); bean.add(b1); EmptyBean b2=new EmptyBean(); b2.setName("点击这个没网"); bean.add(b2); return bean; } class MyAdapter extends TsmBaseAdapter<EmptyBean>{ public MyAdapter(Activity context, List<EmptyBean> list) { super(context, list); } @Override public int getItemResourceId() { return R.layout.item_empty; } @Override public void initItemView(PxViewHolder viewHolder, List<EmptyBean> list, int position) { viewHolder.<TextView>getView(R.id.item_name).setText(list.get(position).getName()); } } }
最后附上demo 希望大家可以好好看一些这个炒鸡牛鼻的adapter , 真的很实用
http://download.csdn.net/detail/qq_22256027/9664764