基于抽象布局和炒鸡牛鼻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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值