1.新建一个实体类Fruit
package com.example.administrator.myapplication; /** * Created by Administrator on 2015/9/28. */ public class Fruit { //name表示的是名字 private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } //表示的是图片的Id private int imageId; public int getImageId() { return imageId; } public void setImageId(int imageId) { this.imageId = imageId; } public Fruit(String name,int imageId){ this.name = name; this.imageId = imageId; } }2.ListView的自定义布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/fruit_image" android:layout_width="200dp" android:layout_height="200dp" /> <TextView android:id="@+id/fruit_name" android:layout_gravity="center" android:layout_marginLeft="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>3.定义一个适配器(这里---------->提高运行效率的优化【对加载布局和加载控件的优化】)
//创建一个适配器,继承ArrayAdapter,并将泛型指定为Fruit public class FruitAdapter extends ArrayAdapter<Fruit> { //为了在getView中获取布局,我们定义一个int类型的数据获取ListView的子项布局 private int resourceId; //重写父类的一个构造函数 第一个参数是上下文对象 第二个参数ListView的子向布局 第三个参数是数据 public FruitAdapter(Context context, int resource, List<Fruit> objects) { super(context, resource, objects); resourceId = resource; } //这个方法在每个子项被滚动到屏幕内的时候被调用 @Override public View getView(int position, View convertView, ViewGroup parent) { //获取当前项的Fruit实例 Fruit fruit = getItem(position); View view; //我们使用一个内部类,用户对控件的缓存 //当convertView为空的时候,创建一个ViewHolder对象,并将控件的实例都存放在ViewHolder里, // 然后调用View的setTag()方法,将ViewHolder对象存储在View中。 // 当convertView不为空的时候则调用View的getTag()方法,把ViewHolder重新取出。 ViewHolder viewHolder; //优化 如果converView是空的话,则使用LayoutInflater去加载布局,如果不为空的话,直接对converView进行重用 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);//将viewHolder存储在view中 } else { view = convertView; viewHolder = (ViewHolder) view.getTag(); } // 分别为他们设置图片和文字 viewHolder.fruitImage.setImageResource(fruit.getImageId()); viewHolder.fruitName.setText(fruit.getName()); // 为子项加载我们传入的布局 // View view = LayoutInflater.from(getContext()).inflate(resourceId, null); // 分别获取我们布局中的Imageview和TextView实例(每次加载的时候都会findViewById()方法来获取控件的实例 可以优化!) // 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; } class ViewHolder { ImageView fruitImage; TextView fruitName; } }4.在MainActivity设配适配器还有点击事件
public class MainActivity extends AppCompatActivity { private List<Fruit> fruitList = new ArrayList<Fruit>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initFruits();//初始化加载数据 FruitAdapter fruitAdapter = new FruitAdapter(MainActivity.this,R.layout.fruit_item,fruitList); ListView listView = (ListView)this.findViewById(R.id.list_view); listView.setAdapter(fruitAdapter); //点击 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(); } }); } private void initFruits() { Fruit apple = new Fruit("apple",R.mipmap.apple512); fruitList.add(apple); Fruit banana = new Fruit("banana",R.mipmap.banana512); fruitList.add(banana); Fruit cherry = new Fruit("cherry",R.mipmap.cherry512); fruitList.add(cherry); Fruit apricot = new Fruit("apricot",R.mipmap.apricot512); fruitList.add(apricot); Fruit lemon = new Fruit("lemon",R.mipmap.lemon512); fruitList.add(lemon); Fruit mango = new Fruit("mango",R.mipmap.mango512); fruitList.add(mango); Fruit peach = new Fruit("peach",R.mipmap.peach512); fruitList.add(peach); }效果:
总结:我们使用ListView的过程中主要就是定义一个ListView的子项布局,一个实体类,一个适配器,然后在主窗口中调到