码迷,mamicode.com
首页 > 其他好文 > 详细

ListView的自定制

时间:2016-06-22 20:15:05      阅读:314      评论:0      收藏:0      [点我收藏+]

标签:

(1)创建项目,在res/drawable_hdpi文件夹中导入图片,在activity_main.xml文件中添加ListView控件,添加代码如下

<ListView
  android:id="@+id/list_view"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
</ListView>

(2)给ListView的单元格自定制布局文件,在res/layout目录下新建文件fruit_item.xml文件,代码如下

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <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"
        android:layout_marginLeft="10dip" />

</LinearLayout>

(3)定义一个实体类作为ListView适配器的适配类型,新建类Fruit,代码如下

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;
	}
}

(4)自定义一个适配器,继承自ArrayAdapter,泛型指定为Fruit,新建类FruitAdapter,代码如下

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) {
		// TODO Auto-generated method stub
		Fruit fruit=getItem(position);//获取当前项的Fruit实例
		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);//将ViewHolder存储在View中
		}else {
			view=convertView;
			viewHolder=(ViewHolder)view.getTag();//重新获取ViewHolder
		}
		viewHolder.fruitImage.setImageResource(fruit.getImageId());
		viewHolder.fruitName.setText(fruit.getName());
		return view;
	}
	class ViewHolder{
		ImageView fruitImage;
		TextView fruitName;
	}
}

  这里的convertView用于将之前加载好的布局进行缓存,便于之后的重用。上述代码表示如果convertView为空则利用LayoutInflater加载布局,不为空,则直接对convertView进行重用,这样就可以不用每次滑动都重新加载一遍布局。

  这里我们还新增了一个内部类ViewHolder,convertView为空的时候创建ViewHolder对象,并将控件的实例都存放到ViewHolder里,然后调用setTag方法将ViewHolder对象存储在View中,不为空时则利用getTag将ViewHolder取出。这样缓存控件的实例后就没必要每次都通过findViewById()方法来获取实例。

  这两步都起到了优化的作用,提高了ListView的运行效率。

(5)修改MainActivity中的代码,代码如下

public class MainActivity extends Activity {
	private List<Fruit> fruitList=new ArrayList<Fruit>();
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		initFruit();//初始化数据
		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 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 initFruit() {
		Fruit fruit1=new Fruit("fruit1", R.drawable.a1);
		fruitList.add(fruit1);
		Fruit fruit2=new Fruit("fruit2", R.drawable.a2);
		fruitList.add(fruit2);
		Fruit fruit3=new Fruit("fruit3", R.drawable.a3);
		fruitList.add(fruit3);
		Fruit fruit4=new Fruit("fruit4", R.drawable.a4);
		fruitList.add(fruit4);
		Fruit fruit5=new Fruit("fruit5", R.drawable.a5);
		fruitList.add(fruit5);
		Fruit fruit6=new Fruit("fruit6", R.drawable.a6);
		fruitList.add(fruit6);
		Fruit fruit7=new Fruit("fruit7", R.drawable.a7);
		fruitList.add(fruit7);
		Fruit fruit8=new Fruit("fruit8", R.drawable.a8);
		fruitList.add(fruit8);
		Fruit fruit9=new Fruit("fruit9", R.drawable.a9);
		fruitList.add(fruit9);
		Fruit fruit10=new Fruit("fruit10", R.drawable.a10);
		fruitList.add(fruit10);
		Fruit fruit11=new Fruit("fruit11", R.drawable.a11);
		fruitList.add(fruit11);
		Fruit fruit12=new Fruit("fruit12", R.drawable.a12);
		fruitList.add(fruit12);
		Fruit fruit13=new Fruit("fruit13", R.drawable.a13);
		fruitList.add(fruit13);
		Fruit fruit14=new Fruit("fruit14", R.drawable.a14);
		fruitList.add(fruit14);
	}
}

运行结果如下:

技术分享

从上述步骤中不难看出,我们只要修改第(2)步的文件就可以定制各种各样的界面了

 

ListView的自定制

标签:

原文地址:http://www.cnblogs.com/grein/p/5608220.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!