ListView适配器

本文详细介绍了Android中ListView适配器的使用,包括ArrayAdapter和SimpleAdapter的自定义,ListView常用属性和方法,以及适配器的工作原理。此外,还讨论了ListView的性能优化,如convertView复用、ViewHolder模式、异步图片加载和分页加载策略,以解决ListView卡顿问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

①布局文件添加listview空降
②准备数据源:适配器不同;数组,xml,对象集合,数据库
③创建适配器
④加载到listview组件
事件:点击滚动事件
研究ArrayAdapter:使用自定义布局文件
1.创建类对象
2.从写ArrayAdapter父类 getView();
3.创建适配器
SimpleAdapter使用:
1.创建自定义布局文件
2.创建适配器

ListView常用属性
1.android:divider=”” 列表之间绘制的颜色或者图片。一般开发中用于分隔表项。在实际开发过程中,如果你不想要列表之间的分割线,可以设置属性为 @null
2. android:dividerHeight=”” 前面 divider 的高度。
3. android:stackFromBottom=”” 使它们的内容从底部开始显示。默认是 false 从顶部开始显示,如果设置为 true 则从底部开始显示。
4. android:transcriptMode=”” 设置列表的 transcriptMode 模式,该模式指定列表添加新的选项的时候,是否自动滑动到底部,显示新的选项。
共三个枚举值:
disabled:取消 transcriptMode 模式,默认的 。
normal:当接受到数据集合改变的通知,并且仅仅当最后一个选项已经完全显示在屏幕的时候,自动滑动到底部。
alwaysScroll:无论当前列表显示什么选项,列表将会自动滑动到底部显示最新的选项。
13.2ListView常用方法
setEmptyView(View)设置ListView没有数据时展示的布局
需要注意。该方法需要的参数 View。该 View 必须和 ListView 在同一个布局容器中。
setHeaderView()添加头部布局,可以添加多个(需要动态加载布局)
setFooterView()添加尾部布局,可以添加多个(需要动态加载布局)
13.3适配器
Android 中适配器是连接后端数据和前端显示的接口,是数据和UI之间重要的纽带,主要在 View 上显示【一般是 listview】。可以看作是界面数据绑定的一种理解。它所操纵的数据一般都是一些比较复杂的数据,如数组,链表,数据库,集合等。适配器就像显示器,把复杂的东西按人可以接受的方式来展现。
高级控件:ListView、GridView[网格视图]、Spinner[下拉列表]、Gallery[画廊]、ViewPage 等都需要使用适配器来为其设置数据源。
常用的适配器有:ArrayAdapter,SimpleAdapter,CursorAdapter 这三个都是继承 BaseAdapter,BaseAdapter是一个抽象类,需要子类继承并实现其中的方法才能使用,常用于用户自定义适配器时,显示比较复杂的数据。
ListView的ConvertView复用
1.重用了convertView,很大程度上的减少了内存的消耗。通过判断convertView是否为null,是的话就需要产生一个View出来,然后给这个视图数据,最后将这个视图返回给底层,呈献给用户。
2.ViewHolder 为static,也就是静态的,静态类只会在第一次加载时 会耗费比较长时间,但是后面就可以很好帮助加载,同时保证了内存中只有一个ViewHolder,节省了内存的开销
3.给contentView设置tag(setTag()),传入一个viewHolder对象,用于缓存要显示的数据
4.图片采用异步加载方式
5.如果listview需要显示的item很多,就要考虑分页加载。比如一共要显示100条或者更多的时候,我们可以考虑先加载20条,等用户拉到列表底部的时候再去 加载接下来的20条
6.尽量避免在ListView适配器中使用线程,因为线程是产生内存泄露的主要原因在于线程生命周期的不可控制
7.ListView布局的layout_height尽量使用march_parent防止用户误操作屏幕导致重复调用getview方法

@Override
public View getView(int position, View convertView, ViewGroup parent) {
View layout = null;
if (convertView == null) {
layout = getLayoutInflater().inflate(R.layout.activity_main, parent, false);
//在这里去 findViewById 以及更新UI
}else{//如果 convertView 不等于 null 了。则不需要再去加载一次布局
layout = convertView;
//在这里去 findViewById 以及更新UI
}
return layout;
}
例:
MainActivity
public class MainActivity extends AppCompatActivity {
private ListView lv_show;
private ArrayList<Student> data;

private int images[] = {R.mipmap.icon0, R.mipmap.icon1,
        R.mipmap.icon2, R.mipmap.icon3, R.mipmap.icon4,
        R.mipmap.icon5, R.mipmap.icon6, R.mipmap.icon7,
        R.mipmap.icon8, R.mipmap.icon9, R.mipmap.icon10, R.mipmap.icon11};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    lv_show = (ListView) findViewById(R.id.lv_show);
    initData();
    MyAdapter myAdapter = new MyAdapter(this, data);
    lv_show.setAdapter(myAdapter);
    lv_show.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
      Toast.makeText(MainActivity.this,"id="+id,Toast.LENGTH_SHORT).show();
        }
    });
}

//初始化数据
private void initData() {
    data = new ArrayList<>();
    for (int i = 0; i < images.length; i++) {
        long l = System.currentTimeMillis();
        data.add(new Student(images[i], "标题" + i, "最后一条消息" + i, l - i * 10000));
    }
}   }

Listview卡顿的解决思路
1、使用Adapter提供的convertView 进行复用ItemView
2、使用ViewHolder 减少 findviewbyid 调用次数
3、 Listview 被多层嵌套,多次的onMessure导致卡顿,需要减少嵌套的层数
4、如果多层嵌套无法避免,建议把Listview的高和宽设置为 match_parent
5、使用分页,减少每次ListView加载的数据
6、如果显示图片,可以对图片进行缓存,减少加载的
7、减少不必要的视图更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值