ListView

ListView

基本用法

1.创建一个Item类,里面存储的是一条Item的信息

public Fruit{
	private String name;
	private int id;
	...
}

2.创建一个Item的Adapter 继承ArrayAdapter<>并且重载其构造函数和getView方法

public FruitAdapter(@NonNull Context context, int resource, @NonNull List<Fruit> fruits) {
        super(context, resource, fruits);
        resourceId = resource;
    }

上面代码中resource应该是item布局的resource 用于后面查找到单个条目的view并且对其进行操作

@NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        Fruit fruit = getItem(position);
        View view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
        ImageView fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
        TextView fruitName =  (TextView) view.findViewById(R.id.fruit_name);
        fruitImage.setImageResource(fruit.getImageId());
        fruitName.setText(fruit.getName());
        return view;
    }

上面的getView是为了构建每一个条目的视图,通过inflate 获取了视图的实体
并且通过findViewById获取控件的实体进行设置
最终返回view

4.创建Item的布局

 <ImageView
        android:id="@+id/fruit_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

 <TextView
        android:id="@+id/fruit_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

5.在父界面中找到ListView的实体并且为其设置Adapter

     ListView listView = findViewById(R.id.lvFruitList);
     listView.setAdapter(new FruitAdapter(this, R.layout.fruit_item, getList()));

其中FruitAdapter构造方法的第二个参数是Item布局的id

提升效率

使用简单的方法实现的ListView的效率较低,所以有一些改进效率的措施

1

在getView界面中判断传入的参数convertView是否为空,如果是空的话,就通过Inflater获取,否则的话,直接复用convertView

if(convertView!=null){
            view = convertView;
}else{
            view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
}

这一步是为了减少view绑定的次数

2 继续优化

Fruit fruit = getItem(position);
        View view;
        ViewHolder viewHolder;
        if (convertView != null) {
            view = convertView;
            viewHolder = (ViewHolder) view.getTag();
        } else {
            view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false);
            viewHolder = new ViewHolder();
            viewHolder.fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
            viewHolder.fruitName = view.findViewById(R.id.fruit_name);
            view.setTag(viewHolder);
        }
        viewHolder.fruitImage.setImageResource(fruit.getImageId());
        viewHolder.fruitName.setText(fruit.getName());
        return view;

这一步是为了减少资源绑定的次数
但是具体为什么可以这么用,不太清楚,后面有机会看看源码

点击事件

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Log.d(TAG, "onItemClick: " + position);
            }
});
ListView是Android中常用的控件,它可以展示一列数据,并且支持滑动、点击等交互操作。使用ListView需要自定义Adapter来管理数据和界面的显示。 以下是一个简单的ListView使用示例: 1. 定义ListView布局文件,例如listview_layout.xml: ``` <ListView android:id="@+id/list_view" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 2. 定义ListView的每一个item布局文件,例如list_item_layout.xml: ``` <TextView android:id="@+id/item_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="16sp" android:padding="16dp" /> ``` 3. 定义Adapter,例如MyAdapter.java: ``` public class MyAdapter extends BaseAdapter { private List<String> mDataList; public MyAdapter(List<String> dataList) { mDataList = dataList; } @Override public int getCount() { return mDataList.size(); } @Override public Object getItem(int position) { return mDataList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_layout, parent, false); holder = new ViewHolder(); holder.text = convertView.findViewById(R.id.item_text); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } String data = mDataList.get(position); holder.text.setText(data); return convertView; } private static class ViewHolder { TextView text; } } ``` 4. 在Activity中使用ListView: ``` public class MainActivity extends AppCompatActivity { private ListView mListView; private MyAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mListView = findViewById(R.id.list_view); List<String> dataList = new ArrayList<>(); for (int i = 0; i < 20; i++) { dataList.add("Item " + i); } mAdapter = new MyAdapter(dataList); mListView.setAdapter(mAdapter); } } ``` 这样就完成了一个简单的ListView展示。当数据量较大时,可以使用RecyclerView来优化性能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值