ListView抽取及优化(上)

本文通过实例介绍了传统ListView的实现方式,并提出存在的问题。随后将逐步优化ListView的开发过程,特别是针对ViewHolder的复用进行深入探讨。

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

在App开发中,ListView控件的出现与使用应该不少。假如程序中现在有20个ListView,那么对应的适配器Adapter,以及Adapter里面的ViewHolder就会有20个。这样程序会显得特别冗余,复用性差的要死!

首先我先带着代价回顾一下传统的ListView写法,之后在一步一步优化!
传统的ListView写法应该是大家比较熟悉的
步骤:
1.创建ListView控件

<!-- activity_main.xml -->

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.listviewoptimization.MainActivity" >

    <ListView 
        android:id="@+id/listView_show"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    </ListView>

</RelativeLayout>

2.创建一会在Adapter中要用到的listview的item布局
这里写图片描述

<!-- listview_item.xml -->

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" 
    android:layout_marginTop="5dp">

    <ImageView
        android:id="@+id/imageView_show"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_marginRight="5dp"
        android:layout_alignParentTop="true"
        android:background="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/textView_show"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/imageView_show"
        android:layout_alignParentLeft="true"
        android:layout_marginBottom="14dp"
        android:layout_marginLeft="20dp"
        android:text="传统的ListView" />

</RelativeLayout>

3.创建item对应的JavaBean,方便封装数据

public class InfoBean 
{
    private String title;//item的标题
    private String image;//item的图片

    public InfoBean() {
        super();
    }
    public InfoBean(String title, String image) {
        super();
        this.title = title;
        this.image = image;
    }

    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getImage() {
        return image;
    }
    public void setImage(String image) {
        this.image = image;
    }
}

4.创建Adapter,传统的写法通常都是继承BaseAdapter的,这个代码就不过多的解释了,都是老代码,估计你写的比我次数都多!

public class MyAdapter extends BaseAdapter 
{
    private LayoutInflater mInflater;
    private Context mContext;
    private List<InfoBean> mData;

    public MyAdapter(Context context,List<InfoBean> data) 
    {
        this.mContext = context;
        this.mData = data;
        this.mInflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        return mData.size();
    }

    @Override
    public Object getItem(int position) {
        return mData.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) 
    {
        ViewHolder vh = null;
        if(convertView == null)
        {
            vh = new ViewHolder();
            convertView = mInflater.inflate(R.layout.listview_item, parent, false);
            vh.textView_show = (TextView)convertView.findViewById(R.id.textView_show);
            vh.imageView_show = (ImageView)convertView.findViewById(R.id.imageView_show);
            convertView.setTag(vh);
        }
        else
        {
            vh = (ViewHolder)convertView.getTag();
        }

        //给传来的值设置上
        vh.textView_show.setText(mData.get(position).getTitle());
        vh.imageView_show.setBackgroundResource(R.drawable.ic_launcher);
        return convertView;
    }

    class ViewHolder
    {
        TextView textView_show;
        ImageView imageView_show;
    }
}

5.最后在MainActivity中三个步骤搞定,初始化ListView控件,初始化数据源,初始化数据适配器并setAdapter绑定

public class MainActivity extends Activity 
{
    protected ListView listView_show;
    private List<InfoBean> mData;
    private MyAdapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView_show = (ListView)this.findViewById(R.id.listView_show);

        initData();
        listView_show.setAdapter(mAdapter);
    }

    /**
     * 初始化操作
     */
    private void initData() 
    {
        //初始化数据
        mData = new ArrayList<InfoBean>();
        for(int x = 1; x <= 10; x++)
        {
            //这里的图片地址我在Adapter里就用ic_luncher代替了,假装传一下...
            InfoBean bean = new InfoBean("标题" + x,"http://www.drawable.png...");
            mData.add(bean);
        }

        //初始化数据适配器
        mAdapter = new MyAdapter(MainActivity.this,mData);
    }
}

就以上这些代码,如果开发中不进行抽取,效果也会实现,但让人看着非常的不爽!这篇文章就当带着大家复习了一下吧,下一篇中会正式的进入到主题,介绍ViewHolder的抽取优化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值