android : setEmptyView与万能适配器的使用

empty_list_layout.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:gravity="center"
        android:textSize="18sp"
        android:textColor="#000000"
        android:text="No Data"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

list_layout.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <include
        android:id="@+id/no_data"
        layout="@layout/empty_list_layout"/>

</LinearLayout>

注意:
1、listview需要和emptyview同级,即放在同一个父viewgroup中,也可代码实现:

如:

TextView emptyView = new TextView(this);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
		LinearLayout.LayoutParams.MATCH_PARENT, 
        LinearLayout.LayoutParams.MATCH_PARENT);
emptyView.setLayoutParams(layoutParams);
emptyView.setText("This appears when the list is empty");
emptyView.setGravity(Gravity.CENTER);
emptyView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);
emptyView.setVisibility(View.GONE);
((ViewGroup)listView.getParent()).addView(emptyView);
listView.setEmptyView(emptyView);

2、emptyview生效的条件:

adapter 为空或者列表为空:

adapter == null || adapter.isEmpty()

item_layout.xml

<?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"
    android:orientation="vertical">

    <TextView
        android:id="@+id/item_tv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="20dp"
        android:text="" />

</LinearLayout>

java代码:


public class MainActivity extends AppCompatActivity {

    private List<String> data = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.list_layout);
        initView();
    }

    private void initView() {
        ListView listView = (ListView) findViewById(R.id.lv);
        View emptyView = findViewById(R.id.no_data);

        for (int i = 0; i < 10; i++) {
            data.add("item" + i);
        }

        listView.setEmptyView(emptyView);
        // setEmptyView的触发条件是当用户的使用的ListView/gridView的list内容是空的:即list的size=0
        // 或
        // ListView,GridView的适配器adapter是null的时候触发:即不设置setAdapter
        CommonAdapter<String> commonAdapter = new CommonAdapter<String>(this, 
										        data, R.layout.item_layout) {
            @Override
            public void convert(CommonViewHolder holder, String item) {
                holder.setTextView(R.id.item_tv, item);
            }
        };
        listView.setAdapter(commonAdapter);
    }
}

工具类:

万能适配器:

public abstract class CommonAdapter<T> extends BaseAdapter {

    protected LayoutInflater mLayoutInflater;
    protected Context mContext;
    protected List<T> mData;
    protected int mItemLayoutId;

    public CommonAdapter(Context mContext, List<T> mData, int mItemLayoutId) {
        mLayoutInflater = LayoutInflater.from(mContext);
        this.mContext = mContext;
        this.mData = mData;
        this.mItemLayoutId = mItemLayoutId;
    }

    @Override
    public int getCount() {
        return mData == null ? 0 : mData.size();
    }

    @Override
    public T getItem(int position) {
        return mData.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //实例化一个ViewHolder
        CommonViewHolder holder = getViewHolder(position, convertView, parent);
        //使用对外公开的convert方法,通过ViewHolder把View找到,通过Item设置值
        convert(holder, getItem(position));
        return holder.getmConvertView();
    }

    private CommonViewHolder getViewHolder(int position, View convertView, ViewGroup parent){
        return CommonViewHolder.getHolder(mContext, mItemLayoutId, convertView, parent);
    }

    /**
     * 对外公布了一个convert方法,并且还把ViewHolder和本item对应的Bean对象给传出去
     * 现在convert方法里面需要干嘛呢?通过ViewHolder把View找到,通过Item设置值
     */
    public abstract void convert(CommonViewHolder holder, T item);

}

万能viewholder

public class CommonViewHolder {

    private SparseArray<View> mViews;
    private View mConvertView;

    //构造函数
    private CommonViewHolder(Context context, int resLayoutId, ViewGroup parent) {
        this.mViews = new SparseArray<>();
        this.mConvertView = LayoutInflater.from(context).inflate(resLayoutId, parent, false);
        this.mConvertView.setTag(this);
    }

    //获取一个ViewHolder
    public static CommonViewHolder getHolder(Context context, int resLayoutId, 
											    View convertView, ViewGroup parent) {
        if (convertView == null) {
            return new CommonViewHolder(context, resLayoutId, parent);
        }
        return (CommonViewHolder) convertView.getTag();
    }

    //通过控件的id获取对应的控件,如果没有则加入mViews;记住 <T extends View> T 这种用法
    public <T extends View> T getItemView(int viewId) {
        View view = mViews.get(viewId);
        if (view == null) {
            view = mConvertView.findViewById(viewId);
            mViews.put(viewId, view);
        }
        return (T) view;
    }

    //获得一个convertView
    public View getmConvertView() {
        return mConvertView;
    }

    /**
     * 为TextView赋值
     */
    public CommonViewHolder setTextView(int viewId, String text) {
        TextView view = getItemView(viewId);
        view.setText(text);
        return this;
    }

    /**
     * 为ImageView赋值——drawableId
     */
    public CommonViewHolder setImageResource(int viewId, int drawableId) {
        ImageView view = getItemView(viewId);
        view.setImageResource(drawableId);
        return this;
    }

    /**
     * 为ImageView赋值——bitmap
     */
    public CommonViewHolder setImageBitmap(int viewId, Bitmap bitmap) {
        ImageView view = getItemView(viewId);
        view.setImageBitmap(bitmap);
        return this;
    }

}

参考:Android 快速开发系列 打造万能的ListView GridView 适配器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值