listview是一个重点内容,平时在开发的时候都只是初步了解,在网上粗略的看了一下就直接上手,还是在adapter中使用,了解的并不是很多,希望接下来的学习能使自己对ListView有一个更深刻的学习,达到熟悉使用。
简单实现ListVIew 现在activity_main.xml文件中设置如下布局:
<LinearLayout 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"> <ListView android:id="@+id/ListView" android:layout_width="match_parent" android:layout_height="match_parent"> </ListVIew></LinearLayout>在代码中添加如下代码:
PRivate String[] data = {"Apple", "Banana", "Orange", "Watermelon", "Pear", "Grape", "Pineapple", "Strawberry", "Cherry", "Manog"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, data);//android.R.layout.simple_list_item_1是android内置的布局文件,里面只有一个TextView,用于简单的显示一段文本 ListView listView = (ListView)findViewById(R.id.list_view); listView.setadapter(arrayAdapter);}适配器用来设置内容,而listview是一个布局,要将内容显示在布局上就需要布局调用setAdapter()方法将adapter传进去。
实现一个图片对应文字的效果: 先定义一个实体类:
public class Fruit{ private String name; private int imageId; public Fruit(String name, int imageId){ this.name = name; this,imageId = imageId; } public String getName(){ return name; } public int getImageId(){ return imageId; }}在layout目录下新建fruit_item.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent" > <ImageView android:id="@id/fruit_image" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TextView android:id="@+id/fruit_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="centent" android:layout_marginLeft="10dip"/></LinearLayout>接下来创建自定义的适配器,继承ArrayAdapter,指定Fruit类,新建FruitAdapter:
public class FruitAdapter extent ArrayAdapter<Fruit>{ private int resourceId; public FruitAdapter(Context context, int textViewResourceId, List<Fruit> Objects) super(context, textViewResourceId, objects); reourceId = 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; }FruitAdapter 重写了父类的一组构造函数,用于将上下文、ListView 子项布局的 id 和数 据都传递进来。另外又重写了 getView()方法,这个方法在每个子项被滚动到屏幕内的时候 会被调用。在 getView 方法中,首先通过 getItem()方法得到当前项的 Fruit 实例,然后使用 LayoutInflater 来为这个子项加载我们传入的布局, 接着调用 View 的 findViewById()方法分别 获取到 ImageView 和 TextView 的实例,并分别调用它们的 setImageResource()和 setText()方 法来设置显示的图片和文字,最后将布局返回,这样我们自定义的适配器就完成了 修改 MainActivity 中的代码:
private List<Fruit> fruitList = new ArrayList<Fruit>();protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initFruits(); // 初始化水果数据 FruitAdapter adapter = new FruitAdapter(MainActivity.this,R.layout.fruit_item, fruitList); ListView listView = (ListView) findViewById(R.id.list_view); listView.setAdapter(adapter);} private void initFruits() { Fruit apple = new Fruit("Apple", R.drawable.apple_pic); fruitList.add(apple); Fruit banana = new Fruit("Banana", R.drawable.banana_pic); fruitList.add(banana); Fruit orange = new Fruit("Orange", R.drawable.orange_pic); fruitList.add(orange); Fruit watermelon = new Fruit("Watermelon",R.drawable.watermelon_pic); fruitList.add(watermelon); Fruit pear = new Fruit("Pear", R.drawable.pear_pic); fruitList.add(pear); Fruit grape = new Fruit("Grape", R.drawable.grape_pic); fruitList.add(grape); Fruit pineapple = new Fruit("Pineapple", R.drawable.pineapple_pic); fruitList.add(pineapple); Fruit strawberry = new Fruit("Strawberry", R.drawable.strawberry_pic); fruitList.add(strawberry); Fruit cherry = new Fruit("Cherry", R.drawable.cherry_pic); fruitList.add(cherry); Fruit mango = new Fruit("Mango", R.drawable.mango_pic); fruitList.add(mango);}对listView进行功能的优化: convertView是用于将之前加载好的布局进行缓存,以便以后重用,所以代码可以修改为以下形式:
View view;ViewHolder viewHolder;if(convertView == null){ view = LayoutInflate.from(getContext()).inflate(resourceId, null); viewHolder = new viewHolder(); viewHolder.fruitImage = (ImageView)view.findViewById(R.id.fruit_view); viewHolder.fruitName = (TextView)view.findViewById(R.id.fruit_name); view.setTag(viewHolder);//将viewHolder存储在View中}else{ view = convertView; viewHolder = (ViewHolder)view.getTag();//重新获取ViewHolder}viewHolder.fruitImage.setImageResource(fruit.getImageId());viewHolder.fruitName.setText(fruit.getName());class ViewHolder{ ImageView fruitImage; TextView fruitName;}新闻热点
疑难解答