添加xml布局 1 2 3 4 <ListView android:id ="@+id/list_view" android:layout_width ="match_parent" android:layout_height ="match_parent" />
定义item实体类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 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; } }
定义item布局 1 2 3 4 5 6 7 8 9 10 11 12 <LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android" android:layout_width ="match_parent" android:layout_height ="wrap_content" > <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 ="center_vertical" android:layout_marginLeft ="10dp" /> </LinearLayout >
创建listview自定义适配器 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 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, parent, false ); 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; } }
引入activity活动 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 public class MainActivity extends AppCompatActivity { private List<Fruit> fruitList = new ArrayList<>(); @Override 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 () { for (int i = 0 ; i < 2 ; i++) { 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缓存是否为空进行判断是否重载 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 public class FruitAdapter extends ArrayAdapter <Fruit > { ... @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, parent, false ); } 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; } }
消除findViewById重复获取组件实例的开销
新增内部类ViewHolder,用于对控件的实例进行缓存。
当 convertView 为 null 的时候,创建一个 ViewHolder 对象,并将控件的实例都存放在 ViewHolder 里,然后调用 View 的 setTag()方法,将 ViewHolder 对象存储在 View 中
当 convertView 不为 null 的时候, 则调用 View 的 getTag()方法,把 ViewHolder 重新取出。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 public class FruitAdapter extends ArrayAdapter <Fruit > { ... @Override 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, parent, false ); 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; } }
添加点击事件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public class MainActivity extends AppCompatActivity { private List<Fruit> fruitList = new ArrayList<>(); @Override 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); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick (AdapterView<?> parent, View view, int position, long id) { Fruit fruit = fruitList.get(position); Toast.makeText(MainActivity.this , fruit.getName(), Toast.LENGTH_SHORT).show(); } }); } ... }
本文作者 : haise本文地址 : https://www.shifeng1993.com/2018/05/07/android5/ 版权声明 : 转载请注明出处!