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