这一章,我们来说说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);