1.ListView的作用:
用户通过手指上下滑动的方式将屏幕外的数据滚动到屏幕内,同时屏幕上原有数据则会滚出屏 幕。例如(查看QQ聊天记录,翻阅微博最新消息等等)
2.ListView简单使用方法:
2.1.将ListView添加到页面布局里
2.2.ListView在活动里干了三件事
(1)找到控件
(2)创建构造器(new ArrayAdapter<T>)构造函数中传入 (当前上下文,ListView子项布局id,适配的数据)
(3)控件中.setAdapter()方法,将创建好的构造器传进去。
3.定制ListView的界面(明确4步就行)
//1.首先需要创建layout布局,定制样式。
//2.创建相应类(Fruit),对layout里面所需数据进行设置
//也就是get,set,构造函数
//3.自定义适配器,对相应的布局进行更改和设置(重点)
//首先fanAdapter继承ArrayAdapter,泛型是创建的实体类
public class fanAdapter extends ArrayAdapter<Fruit>
//重写构造函数方法,我们只需用到第二个意思是子项布局的id(取出来赋值全局变量,方便后续操作)
//子项布局id:可以理解成 listview里面的每一行列
public fanAdapter(@NonNull Context context, int resource, @NonNull List<Demofan> objects) {
super(context, resource, objects);
resourceId = resource;
}
//重写getView方法,这个方法在每个子项被滚动到屏幕内的时候会被调用。也就是刷新滚动页面
//这个可以理解成对每一行里的每一个控件进行操作
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
//通过getItem方法得到fruit实例:position也可以理解成子项id,位置
Fruit fruit = getItem(position);
//convertView参数:判断是否为空,如果为空就加载布局,否则重用布局
//好处:提高效率,快速滚动时候性能更好
if(convertView ==null){
//使用LayoutInflater来为我们子项加载布局,传入子项布局id,视图,false是固定的
view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false);
//实例化viewHolder
viewHolder = new ViewHolder();
viewHolder.images = (ImageView) view.findViewById(R.id.images);
viewHolder.titles = (TextView) view.findViewById(R.id.titles);
//调用View的setTag方法,将ViewHolder对象储存在View中
view.setTag(viewHolder);
}else{
//当convertView不为null的时候,则调用View的getTag方法,把ViewHoler重新取出,这样每次
//都是通过缓存取出
view = convertView;
viewHolder = (ViewHolder) view.getTag();
}
//简单设置数据操作
viewHolder.images.setImageResource(fan.getImageId());
viewHolder.titles.setText(fan.getName());
/* TextView titles = (TextView) view.findViewById(R.id.titles);
ImageView images = (ImageView) view.findViewById(R.id.images);
titles.setText(fan.getName());
images.setImageResource(fan.getImageId());*/
return view;
}
//新增一个内部类ViewHolder,用于对控件的实例进行缓存
class ViewHolder {
ImageView images;
TextView titles;
}
//4.在MainActivity里进行应用。
//定义new ArrayList存储数据,(多态)
private List<Fruit> fruitList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//里面就是写入数据的方法
initFruits();
//实例化这个自定义构造器
fanAdapter fanAdapter = new fanAdapter(MainActivity.this, R.layout.fan_item, fruitList);
ListView list = (ListView) findViewById(R.id.list_view);
//listview监听点击事件
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
//int i是判断哪一个子项
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Demofan demofan = fruitList.get(i);
String s = l + "";
//显示数据
Toast.makeText(MainActivity.this, demofan.getName()+s, Toast.LENGTH_SHORT).show();
}
});
//把数据通过setAdapter传入到listView中
list.setAdapter(fanAdapter);
}