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;
}
}