标签:
这一章,我们来说说ListView这个组件。ListView是一个非常常用,并且有用的组件。可能说说还没有建立对该组件的印象。比如我们的歌单便可以用这个组件进行实现。
最近,偶尔会逛逛博客园,发现了一个博主说RecyclerView代替了ListView。毕竟刚接触Android,我收藏了相关的博客,有时间进行学习。当然在这一章中,我们还是对ListView这个组件进行说明。虽然组件会更新,但是很多基本的方法还会延续下去。
———————————————————华丽丽的分割线——————————————————————
要实现一个完整的ListView需要有好几块的内容:1. 子项目的布局,2. 存储数据的类 3. 整体的布局, 4. adapter(适配器)类 5. 需要添加listview的activity。
首先我们需要定义一个子项布局,其中包含一个ImageView和TexView组件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <ImageView android:id="@+id/fruit_image" android:layout_height="wrap_content" android:layout_width="wrap_content" /> <TextView android:id="@+id/fruit_name" android:layout_height="wrap_content" android:layout_width="match_parent" ></TextView> </LinearLayout>
这里可以再编写一个相关的数据类(Fruit),对数据进行存储,其中包括图片的id,以及相关的信息。因为简单,我这边也不编写了。
接着我们开始编写适配器的类了。要实现listview还有其他方法,但是使用adapter比较简单方便,因此使用adapter。其中adapter已经实现的非常好的。因此我们在编写Adapter类是可以继承arrayadapter:
public class FruitAdapter extends ArrayAdapter<Fruit> {
private int resourceId;
public FruitAdapter(Context context, int textViewResourceId, List<Fruit> objects) {
super(context,textViewResourceId,objects);
resourceId = textViewResourceId;
}
@Override
public View getView(int position,View convertView,ViewGroup parent){
Fruit fruit = getItem(position);
View view = LayoutInflater.from(getContext()).inflate(resourceId,null);
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这个方法。这个方法与listview添加每一个子项息息相关!在getView中有一个参数是converView,这个参数用于将之前加载好的布局进行缓存,这样能方便以后进行重用。运用这个参数我们可以提高ListView的运行效率:
@Override
public View getView(int position,View convertView,ViewGroup parent){
Fruit fruit = getItem(position);
View view;
if(convertView == null ) {
view = LayoutInflater.from(getContext()).inflate(resourceId, null);
}else {
view = convertView;
}
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;
}
继续进化,使用一个viewHolder的类,对相关的数据进行记录:
public View getView(int position,View convertView,ViewGroup parent){
Fruit fruit = getItem(position);
View view;
ViewHolder viewHolder;
if(convertView == null ) {
view = LayoutInflater.from(getContext()).inflate(resourceId, null);
viewHolder = new ViewHolder();
viewHolder.fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
viewHolder.fruitName = (TextView) view.findViewById(R.id.fruit_name);
view.setTag(viewHolder);
}else {
view = convertView;
viewHolder = (ViewHolder) view.getTag();
}
viewHolder.fruitImage.setImageResource(fruit.getImageId());
viewHolder.fruitName.setText(fruit.getName());
return view;
}
class ViewHolder {
ImageView fruitImage;
TextView fruitName;
}
在进行之后,将在主要的,类似的代码如下:
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,data);
ListView listView = (ListView) findViewById(R.id.list_view);
listView.setAdapter(adapter);
标签:
原文地址:http://www.cnblogs.com/carels/p/5693347.html