ListView使用
1、ListView常用属性
//item被点击时的背景颜色
android:listSelector="@color/colorPrimaryDark"
//滚动缓存
android:scrollingCache="true"
android:cacheColorHint="@color/splashBackgroundColor"
2、ListView常用适配器
设置ListView适配器有两种方法,需要重写四个方法,其中主要使用getCount()、getView()方法
(1)匿名内部类
ListView.setAdapter(new BaseAdapter() {
@Override
public int getCount() {
//有多少条数据
return 0;
}
@Override
public Object getItem(int i) {
//返回某一条数据对象
return null;
}
@Override
public long getItemId(int i) {
//返回某个位置
return 0;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
//返回一个视图
return null;
}
});
(2)新建一个类继承BaseAdapter
class MyAdapter extends BaseAdapter{
@Override
public int getCount() {
//有多少条数据
return 0;
}
@Override
public Object getItem(int i) {
//返回某一条数据对象
return null;
}
@Override
public long getItemId(int i) {
//返回某个位置
return 0;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
//返回一个视图
return null;
}
}
3、优化ListView
通过新建一个ViewHolder类,声明需要的控件变量
//新建类,声明需要的变量
class ViewHolder {
ImageView avatarImageView;
TextView nametext;
TextView agetext;
}
实例化视图后通过setTag()存储控件,getTag()获取视图数据对象viewHolder
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder viewHolder;
//返回一个视图,if判断为空时才再次实例化视图
if (view == null) {
view = mlayoutInflater.inflate(R.layout.item_phone_book_friend, null);
viewHolder = new ViewHolder();
viewHolder.avatarImageView = view.findViewById(R.id.avatar_text_view);
viewHolder.nametext = view.findViewById(R.id.name_text_view);
viewHolder.agetext = view.findViewById(R.id.age_text_view);
//settag()储存要显示的视图数据
view.setTag(viewHolder);
} else {
//gettag()获取视图数据对象
viewHolder = (ViewHolder) view.getTag();
}
viewHolder.agetext.setText(muUserinfos.get(i).getmUserName());
viewHolder.nametext.setText(String.valueOf(muUserinfos.get(i).getMAge()));
viewHolder.avatarImageView.setImageResource(R.drawable.ic_launcher);
return view;
}
完整代码
//新建MyAdapter类继承BaseAdapter
public class MyAdapter extends BaseAdapter {
//上下文
private Context mcontext;
//新建数据集合
private List<Userinfo> muUserinfos = new ArrayList<Userinfo>();
//视图填充器
private LayoutInflater mlayoutInflater;
//有参构造函数
public PhoneBookAdapter(Context context, List<Userinfo> userinfos) {
//上下文
mcontext = context;
muUserinfos = userinfos;
//获取视图填充器服务
mlayoutInflater = (LayoutInflater) mcontext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
//有多少条数据
return muUserinfos.size();
}
@Override
public Object getItem(int i) {
//返回某一条数据对象
return muUserinfos.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
/**
* 设置不同的视图风格
* @param position
* @return
*/
@Override
public int getItemViewType(int position) {
return super.getItemViewType(position);
}
/**
* 每一行数据显示在界面,用户看到时
*
* @param i
* @param view
* @param viewGroup
* @return
*/
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder viewHolder;
//返回一个视图,if判断为空时才再次实例化视图
//view=View.inflate(mcontext,R.layout.item_phone_book_friend,null);//另一种视图绑定
if (view == null) {
view = mlayoutInflater.inflate(R.layout.item_phone_book_friend, null);
viewHolder = new ViewHolder();
viewHolder.avatarImageView = view.findViewById(R.id.avatar_text_view);
viewHolder.nametext = view.findViewById(R.id.name_text_view);
viewHolder.agetext = view.findViewById(R.id.age_text_view);
//settag()储存要显示的视图数据
view.setTag(viewHolder);
} else {
//gettag()获取视图数据对象
viewHolder = (ViewHolder) view.getTag();
}
//获取控件
// ImageView avatarImageView = view.findViewById(R.id.avatar_text_view);
// TextView nametext = view.findViewById(R.id.name_text_view);
// TextView agetext = view.findViewById(R.id.age_text_view);
//和数据进行绑定
viewHolder.agetext.setText(muUserinfos.get(i).getmUserName());
viewHolder.nametext.setText(String.valueOf(muUserinfos.get(i).getMAge()));
viewHolder.avatarImageView.setImageResource(R.drawable.ic_launcher);
return view;
}
/**
* 刷新数据
*
* @param userinfos
*/
public void refreshData(List<Userinfo> userinfos) {
muUserinfos = userinfos;
notifyDataSetChanged();
}
//新建类,声明需要的变量
class ViewHolder {
ImageView avatarImageView;
TextView nametext;
TextView agetext;
}
}
4、更新ListView数据
调用MyAdapter类继承BaseAdapter的notifyDataSetChanged()方法刷新ListView显示的数据
//刷新数据
MyAdapter.notifyDataSetChanged();
在MyAdapter类写一个refreshData()方法,用于在更新数据时,传入新的数据再进行刷新显示
public void refreshData(List<Userinfo> userinfos) {
muUserinfos = userinfos;
notifyDataSetChanged();
}
Android基础:ListView深度解析
本文介绍了Android中ListView的使用,包括其常用属性、适配器的两种实现方式(匿名内部类和新建类继承BaseAdapter),重点讲解了通过ViewHolder优化ListView的性能,以及如何更新ListView数据,利用notifyDataSetChanged()方法刷新显示。
2万+

被折叠的 条评论
为什么被折叠?



