寫這個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