ListView抽取及优化(上)

来源:互联网 发布:c语言中开根号 编辑:程序博客网 时间:2024/05/17 04:46

在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的抽取优化

1 0
原创粉丝点击