[TOC]
在Android 5.X时代,RecycleView在很多地方都在逐渐取代ListView。
使用ViewHolder模式提高效率
ViewHolder模式充分利用了ListView的视图缓存机制,避免了每次在调用getView()的时候都去通过findViewById()实例化控件。
在自定义的Adapter中定义一个内部类ViewHolder,并将布局中的控件作为成员变量。
public final class ViewHolder{
public ImageView img;
public TextView title;
}
在getView()方法中通过视图缓存机制来重用缓存。
class ViewHolderAdapter extends BaseAdapter{
private List<String> mData;
private LayoutInflater mInflater;
public ViewHolderAdapter(Context context,List<String> data){
this.mData=data;
mInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return mData.size();
}
@Override
public Object 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 holder = null;
if (convertView == null){
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.viewholder_item,null);
holder.img = (ImageView) convertView.findViewById(R.id.img);
holder.title = (TextView) convertView.findViewById(R.id.title);
convertView.setTag(holder);
}else {
holder = (ViewHolder) convertView.getTag();
}
holder.img.setBackgroundResource(R.drawable.gift);
holder.title.setText(mData.get(position));
return convertView;
}
private class ViewHolder {
public ImageView img;
public TextView title;
}
}
MainActivity
public class MainActivity extends AppCompatActivity {
......
private ViewHolderAdapter mAdapter;
private List<String> mData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
//listview.setEmptyView(findViewById(R.id.empty_view));
mData = new ArrayList<String>();
for (int i = 0; i < 20; i++) {
mData.add("第" + i + "张");
}
mAdapter = new ViewHolderAdapter(this, mData);
listview.setAdapter(mAdapter);
for (int i=0;i<listview.getChildCount();i++){
View view = listview.getChildAt(i);
}
}
xml属性
|xml属性|描述|补充
|--|--|
|divider|项目分割线的颜色|@android:color/ ,@null分割线透明
|dividerHeight|项目分割线的高度
|scrollbars|滚动条|none不出现滚动条
|listSelector|点击效果|@android:color/transport是透明色
ListView代码属性
ListView以Item为单位进行显示。
设置 ListViewV型要显示在第几项
瞬间完成的移动
listView.setSelection(N)
平滑移动
listview.smoothScrollBy(5,10);
listview.smoothScrollByOffset(10);
listview.smoothScrollToPosition(5);
遍历ListView中的所有Item
for (int i=0;i<listview.getChildCount();i++){
//返回组中指定文件的视图
//通过getChildAt()来获取第i个子View
View view = listview.getChildAt(i);
}
动态修改ListView
//保证传数据的List是同一个List而不是其他对象。
mData.add("new");
mAdapter.notifyDataSetChanged();
处理空ListView
当列表中无数据时,应该给以无数据的提示。
首先在布局中添加一个View,然后找到这个View。
listView.setEmptyView(findViewById(R.id.empty_view));