android ListView的简单使用与优化


ListView顾名思义是显示列表的控件,几乎每个App都会使用到ListView,当需要展示大量的数据时就需要用到ListView.在本文我会用ListView模仿虎扑做一个简单的NBA球星得分排行榜

                                                          

首先我们在布局文件中定义一个ListView

<RelativeLayout 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"
    tools:context="${relativePackage}.${activityClass}" >
<ListView 
    android:id="@+id/second_listView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    ></ListView>
</RelativeLayout>


layout_width和layout_height属性都设为match_parent,使其占满整个屏幕。


ListView是用来显示数据的,这些数据可能从网上下载,也可能从数据库中读取,在这里我们采用硬编码的方法来加载数据。

建立一个球星的类,属性分别为姓名,数据,头像资源ID,得分,所属球队

public class Person {
	
	private String mName;
	private String mData;
	private int mIcon;
	private String mScore;
	private String mTeam;
	
	public Person(String name, String data, int icon, String score, String team) {
		
		mName = name;
		mData = data;
		mIcon = icon;
		mScore = score;
		mTeam = team;
	}
	public String getName() {
		return mName;
	}
	public void setName(String name) {
		mName = name;
	}
	public String getData() {
		return mData;
	}
	public void setData(String data) {
		mData = data;
	}
	public int getIcon() {
		return mIcon;
	}
	public void setIcon(int icon) {
		mIcon = icon;
	}

	public String getScore() {
		return mScore;
	}
	public void setScore(String score) {
		mScore = score;
	}
	public String getTeam() {
		return mTeam;
	}
	public void setTeam(String team) {
		mTeam = team;
	}
	




创建每个item显示的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >
    <ImageView 
        android:layout_gravity="center"
        android:id="@+id/lead_icon_imageView"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:src="@drawable/kobe"
        android:layout_margin="5dp"
        />
    <LinearLayout 
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_marginLeft="15dp"
        android:layout_marginTop="5dp"
        android:layout_marginBottom="5dp"
        
        >
        <TextView 
            android:id="@+id/lead_name_TextView"
            android:layout_width="wrap_content"
            android:layout_weight="1"
            android:layout_height="0dp"
            
            android:gravity="center"
            android:textSize="18sp"
            />
        <TextView 
            android:id="@+id/lead_date_TextView"
            android:layout_marginTop="3dp"
            android:textSize="15sp"
            android:layout_width="wrap_content"
            android:layout_height="0dp"
            android:layout_weight="1"
           
            android:gravity="center"
            />
        
        
    </LinearLayout>
    <LinearLayout 
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="center_vertical"
        >
        <TextView
            android:id="@+id/lead_team_TextView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
           	android:textSize="18sp"
           	android:layout_marginLeft="55dp"
            
            />
    </LinearLayout>
      <LinearLayout 
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="center_vertical"
        >
        <TextView
            android:id="@+id/lead_score_TextView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
          	android:layout_gravity="center_vertical"
           	android:textSize="18sp"
           	android:layout_marginLeft="30dp"
            
            />
    </LinearLayout>
    

</LinearLayout>


创建Adapter

数据是无法直接传递给ListView的,这时候就需要用到适配器即Adapter,我们创建一个StarAdapter使用ArrayAdapter作为基类,由于数据是Person类型的,泛型使用Person,定义一个mResourceId作为传进来的每个Item的布局,重写构造方法使其初始化。

该类的关键在于getView方法,这个方法会在每个子项被定义时调用。首先通过position获取到子项,然后通过LayoutInflate转化我们传入的布局,然后获取到每个控件,接着为其赋值,最后将view返回。

这个方法有两个优化的地方

1、重用废弃的view

convertView存放的是移除屏幕的view,如果我们每一个view都实例化,会极大的浪费内存,因此我们会先判断一下convertView是否为空,如果为空就利用LayoutInflate进行转化生成新的view,如果不为空直接使用废弃的view。

2、使用ViewHolder

我们在每次getView方法中获取控件时都需要使用findViewById,因此我们会增加创建一个类ViewHolder,里面变量为子项所需要的控件,通过view.setTag将ViewHolder存储在view中,如果convertView存在的话直接通过view.getTag方法获取到ViewHolder,这样会使ListView更加优化,提高流畅度。

public class StarAdapter extends ArrayAdapter<Person>{
	
	private int mResourceId;

	public StarAdapter(Context context, int resource, List<Person> objects) {
		super(context, resource, objects);
		mResourceId=resource;
	}
	
	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		Person person=getItem(position);
		View view;
		ViewHolder viewHolder;
		if(convertView==null){
			viewHolder=new ViewHolder();
			view=LayoutInflater.from(getContext()).inflate(mResourceId, null);
			viewHolder.mIconImage=(ImageView) view.findViewById(R.id.lead_icon_imageView);
			viewHolder.mNameTextView=(TextView) view.findViewById(R.id.lead_name_TextView);
			viewHolder.mDataTextView=(TextView) view.findViewById(R.id.lead_date_TextView);
			viewHolder.mTeamTextView=(TextView) view.findViewById(R.id.lead_team_TextView);
			viewHolder.mScoreTextView=(TextView) view.findViewById(R.id.lead_score_TextView);
			//将viewHolder放在view中
			view.setTag(viewHolder);
			
		}else{
			view=convertView;
			//从view中获取viewHolder
			viewHolder=(ViewHolder) view.getTag();
		}
		viewHolder.mIconImage.setImageResource(person.getIcon());
		viewHolder.mNameTextView.setText(person.getName());
		viewHolder.mDataTextView.setText(person.getData());
		viewHolder.mTeamTextView.setText(person.getTeam());
		viewHolder.mScoreTextView.setText(person.getScore());
		
		return view;
	}
	
	class ViewHolder{
		ImageView mIconImage;
		TextView mNameTextView;
		TextView mDataTextView;
		TextView mScoreTextView;
		TextView mTeamTextView;
	}
	

}


将适配器传给ListView


首先初始化数据,我们将数据存到一个ArrayList<Person>中


private List<Person> stars=new ArrayList<Person>();


private void initStars(){
		Person durant=new Person("杜兰特", "32.1分7板5助", R.drawable.durant, "32.1", "雷霆");
		stars.add(durant);
		Person kobe=new Person("科比", "30.7分6板6助", R.drawable.kobe, "30.7", "湖人");
		stars.add(kobe);
		Person lebron=new Person("詹姆斯", "26.9分8板8助", R.drawable.lebron, "26.9", "骑士");
		stars.add(lebron);
		Person wade=new Person("韦德", "24.5分7板4助", R.drawable.wade, "24.5", "热火");
		stars.add(wade);
		Person jeremy=new Person("林书豪", "15.2分4板8助", R.drawable.jeremy, "15.2", "黄蜂");
		stars.add(jeremy);
		Person durant2=new Person("杜兰特", "32.1分7板5助", R.drawable.durant, "32.1", "雷霆");
		stars.add(durant2);
		Person kobe2=new Person("科比", "30.7分6板6助", R.drawable.kobe, "30.7", "湖人");
		stars.add(kobe2);
		Person lebron2=new Person("詹姆斯", "26.9分8板8助", R.drawable.lebron, "26.9", "骑士");
		stars.add(lebron2);
		Person wade2=new Person("韦德", "24.5分7板4助", R.drawable.wade, "24.5", "热火");
		stars.add(wade2);
		Person jeremy2=new Person("林书豪", "15.2分4板8助", R.drawable.jeremy, "15.2", "黄蜂");
		stars.add(jeremy2);
		Person durant3=new Person("杜兰特", "32.1分7板5助", R.drawable.durant, "32.1", "雷霆");
		stars.add(durant3);
		Person kobe3=new Person("科比", "30.7分6板6助", R.drawable.kobe, "30.7", "湖人");
		stars.add(kobe2);
		Person lebron3=new Person("詹姆斯", "26.9分8板8助", R.drawable.lebron, "26.9", "骑士");
		stars.add(lebron3);
		Person wade3=new Person("韦德", "24.5分7板4助", R.drawable.wade, "24.5", "热火");
		stars.add(wade3);
		Person jeremy3=new Person("林书豪", "15.2分4板8助", R.drawable.jeremy, "15.2", "黄蜂");
		stars.add(jeremy3);
		
		
		
	}


为ListView设置适配器

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.activity_second);
		
		
		initStars();
		
		mShowListView=(ListView) findViewById(R.id.second_listView);
		
		StarAdapter adapter=new StarAdapter(SecondActivity.this, R.layout.lead_item, stars);
		
		mShowListView.setAdapter(adapter);
		
	}

结束!这只是简单使用,ListView的使用太多变了,需要多多学习!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章