ListView的简单使用
ListView用来数据的展示,ListView允许用户通过手指上下滑动的方式,将屏幕外的数据滚动到屏幕内,同时屏幕上原有的数据则会滚动出屏幕。
-
ListView的使用步骤:
提供数据 --> 创建适配器 --> listView.setAdapter(adapter) 将adapter对象传递进去
-
ArrayAdapter:
它可以同过泛型来指定要适配的数据类型,它的构造函数依次传入当前上下文。ListView子项的id,以及适配的类型。(可以根据需求传入不同的子项id)
- 自定义适配器
步骤:
定义子类继承 ArrayAdapter,BaseAdapter或SimpleAdapter
需要重写自定义适配器中相应的函数
创建自定义适配器对象并使用
布局:新建一个ListView的子项布局,将子项布局加载进父布局中
继承ArrayAdapter时需要重写getView()方法
public class FruitAdapter extends ArrayAdapter {
private int resourceId;
public FruitAdapter(@NonNull Context context, int resource, @NonNull List<Fruit> objects) {
super(context, resource, objects);
resourceId = resource;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
Fruit fruit = (Fruit) getItem(position);//获取当前项的Fruit实例
View view;
ViewHolder viewHolder;
if(convertView != null){
view = convertView;
viewHolder = (ViewHolder) view.getTag();//重新获取ViewHolder
}else{
view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);//加载布局
viewHolder = new ViewHolder();
viewHolder.textView = view.findViewById(R.id.fruit_name);
view.setTag(viewHolder);//将ViewHolder存储在view中
}
viewHolder.textView.setText(fruit.getFruitName());
return view;
}
class ViewHolder{
TextView textView;
}
}
这是进行优化后的自定义适配器,在MainActivity中使用:
FruitAdapter adapter = new FruitAdapter(this,fruit__item,false);
继承BaseAdapter:
public class FruitAdapter extends BaseAdapter {
List<Fruit> mFruitList;
private Context mContext;
public FruitAdapter(Context context,List<Fruit> fruitList){
mContext = context;
mFruitList = fruitList;
}
@Override
public int getCount() {
return mFruitList.size();
}
@Override
public Object getItem(int i) {
return mFruitList.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
Fruit fruit = (Fruit) getItem(i);//获取当前项的Fruit实例
ViewHolder viewHolder;
if(view == null){
view = LayoutInflater.from(mContext).inflate(R.layout.fruit__item,null);
viewHolder = new ViewHolder();
viewHolder.textView = view.findViewById(R.id.fruit_name);
view.setTag(viewHolder);//将ViewHolder存储在view中
}else{
viewHolder = (ViewHolder) view.getTag();//重新获取ViewHolder
}
viewHolder.textView.setText(fruit.getFruitName());
return view;
}
static class ViewHolder{
TextView textView;
}
}
getCount : 要绑定的条目的数目,比如格子的数量
getItem : 根据一个索引(位置)获得该位置的对象
getItemId : 获取条目的id
getView : 获取该条目要显示的界面
MainActivity中的使用:
public class MainActivity extends AppCompatActivity {
private List<Fruit> fruitList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
InitFruits();
ListView listView = findViewById(R.id.list_view);
FruitAdapter adapter = new FruitAdapter(this,fruitList);
listView.setAdapter(adapter);
//子项的点击事件
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Fruit fruit = fruitList.get(i);
Toast.makeText(MainActivity.this,fruit.getFruitName(),Toast.LENGTH_SHORT).show();
}
});
}
public void InitFruits(){
for(int i = 1;i < 10; i ++){
Fruit apple = new Fruit("apple");
fruitList.add(apple);
Fruit banana = new Fruit("banana");
fruitList.add(banana);
Fruit lemon = new Fruit("lemon");
fruitList.add(lemon);
Fruit mango = new Fruit("mango");
fruitList.add(mango);
}
}
}
代码中的Fruit是一个类,里面是子项所要显示的信息,可以根据需求在类中进行信息的添加。MainActivity使用setOnItemClickListener()方法为ListView注册监听器,当用户点击了ListView中的任何一个子项时,就会回调onItemClick()方法,通过position参数判断出用户点击哪一个子项。