天天看點

基于抽象布局和炒雞牛鼻adapter編寫的demo 主要是為了減少項目中的代碼

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

繼續閱讀