`
zhoujianghai
  • 浏览: 434328 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

listview的美化和优化

阅读更多

在android开发中,listview是比较常用的一个组件,它以列表的形式显示数据。列表显示需要三个元素:

1、listview用来显示具体列表的view

2、XXAdapter适配器用来把具体的数据映射到listview

3、具体需要展示的数据,比如文字,图片,按钮等组件

 

listview的适配器类型主要分为三种:ArrayAdapter、SimpleAdapter、SimpleCursorAdapter。

ArrayAdapter比较简单,只能显示一行文字,SimpleAdapter扩充性很好,可以自己定义出很多种效果,SimpleCursorAdapter可以和数据库很好的结合,把数据库中的表的内容展示到列表上。

 

有些时候,由于我们需要展示的数据量很大,而且也需要美化显示的效果,这时我们就需要自定义一个适配器,只需继承BaseAdapter,实现它的四个方法。listview在开始绘制的时候,首先调用getCount()方法,得到需要绘制的item数量,再调用getView绘制每一个item,每调用一次getView都会实例化一个view对象,因此对于显示大量数据的时候,必须进行优化。下面是一个小例子,getView方法对listview进行了一定的优化,当listview的某一项被选择或者点击时,更换该项的背景图片。源码如下:

ListViewActivity.java

 

package com.alex.activity;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.AdapterView.OnItemSelectedListener;

public class ListViewActivity extends Activity {
    /** Called when the activity is first created. */
	private List<Map<String, Object>> datas = null; //存放初始化数据
	private ListView roomListView = null; 
	//Button back;
    @Override
    public void onCreate(Bundle savedInstanceState) {
    	super.onCreate(savedInstanceState);
    	//去除窗口的title区域
		this.requestWindowFeature(Window.FEATURE_NO_TITLE);
		//全屏显示
		this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);
		this.setContentView(R.layout.listview);
		
		initDatas();
		findViews();
    }
    
    private void initDatas() {
    	datas = new ArrayList<Map<String,Object>>();
    	for(int i=0;i<12;i++) {
    		Map<String, Object> itemMap = new HashMap<String,Object>();
    		itemMap.put("data", "测试数据"+i);
    			datas.add(itemMap);
    	}
    }
    
    private void findViews() {
    	roomListView = (ListView)findViewById(R.id.room_list);
    	roomListView.setAdapter(new MyListViewAdapter(this));
    	roomListView.setVerticalScrollBarEnabled(true); //显示垂直滚动条
    	roomListView.setSelection(0); //默认选中第一项
    }
    
    
    public class MyListViewAdapter extends BaseAdapter {

    	private LayoutInflater mInflater; //作用:把xml布局文件实例化成View
    	
    	public MyListViewAdapter(Context context) {
    		this.mInflater = LayoutInflater.from(context);
    	}
		@Override
		public int getCount() {
			return datas.size();
		}

		@Override
		public Object getItem(int position) {
			return null;
		}

		@Override
		public long getItemId(int position) {
			return 0;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			ViewHolder holder = null;
			if(convertView == null) {
				holder = new ViewHolder();
				convertView = mInflater.inflate(R.layout.list_row, null);
				convertView.setBackgroundResource(R.drawable.dtht_1);
				holder.data = (TextView)convertView.findViewById(R.id.data);
					
				convertView.setTag(holder);
			}
			else {
				holder = (ViewHolder)convertView.getTag();	
			}
			
			holder.data.setText(String.valueOf(datas.get(position).get("data")));
					return convertView;
		}
    	
    }
    
    public final class ViewHolder {
    	TextView data;
    }
}
 

 

listview.xml

 

 

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="fill_parent"
		android:layout_height="fill_parent"
		>

		<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
		android:orientation="horizontal" android:layout_width="fill_parent"
		android:layout_height="fill_parent"
		>
		<ListView android:id="@+id/room_list"
		android:layout_width="fill_parent"
		android:layout_height="fill_parent"
		android:listSelector="@drawable/dtht_2"
		android:background="@drawable/dtht_1"
		android:cacheColorHint="#00000000" 
		android:divider="#00000000" 
		android:dividerHeight="1dip" 
		/>
		</LinearLayout>

	</FrameLayout>

 

 

 list_row.xml

 

<?xml version="1.0" encoding="utf-8"?>

		<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
		android:layout_width="fill_parent"
		android:layout_height="fill_parent">
		
	<TextView android:id="@+id/data"
			android:layout_width="fill_parent"
			android:layout_height="36dip" 
			 android:layout_alignParentLeft="true"
			 android:gravity="center"
			 android:textColor="#ffffff"
			 />
	
		</RelativeLayout>
 

 

 

效果图见附件

 

  • 大小: 13.7 KB
分享到:
评论
2 楼 zhoujianghai 2010-11-18  
时培峰 写道
好多冗余代码:o

,roomListView.setOnItemSelectedListener(...)这段代码可以去掉的
1 楼 时培峰 2010-11-18  
好多冗余代码:o

相关推荐

Global site tag (gtag.js) - Google Analytics