天天看點

ListView優化實戰指南

ListView優化實戰指南
ListView優化實戰指南
ListView優化實戰指南
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">這裡有幾個關鍵字:ListView && GridView</span>
           
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">幾乎每個android App應該都可以看到ListView或者GridView的影子,如果你是一個android開發者,你肯定對ListView又愛又恨!</span>
           

下面我們就一些具體的代碼講一講怎麼優化ListView:

Terminology

>index (索引)

>position(位置)

>id(辨別)

Stable IDs

>hasStableIds() == true

>An ID always refers to the same value

>Helps ListView

adapter

getView

listview is smart

contentView

>supplied by listview

>matcher item types

>reuse it

 主布局代碼:activity_list.xml

<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/mListview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</RelativeLayout>
           

icon_item.xml

<LinearLayout 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"
    android:gravity="center"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/item_icon"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_marginLeft="16dp"
        android:src="@drawable/flag_uk" />

    <TextView
        android:id="@+id/item_text"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginRight="16dp"
        android:layout_weight="1"
        android:gravity="center"
        android:text="delfaut text" />

</LinearLayout>
           

ListActivity.java

package com.pdsu.customview;

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

import com.pdsu.customview.utils.MyAdapter;
import com.pdsu.customview.utils.ToastUtils;

import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.Toast;

public class ListActivity extends Activity {
	private List<Map<String, String>> lists = null;
	private ListView mListView;
	private LayoutInflater mInflater;
	private MyAdapter adapter;
private ToastUtils mToast;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_list);
		lists = new ArrayList<Map<String, String>>();
		mInflater = this.getLayoutInflater();
		mToast=new ToastUtils();
		getData();
		mListView = (ListView) findViewById(R.id.mListview);
		adapter = new MyAdapter(this, mInflater, lists);
		mListView.setAdapter(adapter);
		mListView.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
				// TODO Auto-generated method stub
				if (lists.get(position).get("image") == "0") {
					lists.get(position).put("image", "1");
				} else {
					lists.get(position).put("image", "0");
				}
				// Toast.makeText(getApplicationContext(), "圖檔改變了!", 0).show();
				mToast.showToast(getApplicationContext(), "圖檔改變了!"+lists.get(position).get("sno"));
				adapter.notifyDataSetChanged();
			}
		});
	}

	private void getData() {
		// TODO Auto-generated method stub

		for (int i = 0; i < 1000; i++) {
			Map<String, String> maps = new HashMap<String, String>();
			maps.put("sno", "s" + i);
			maps.put("image", "0");
			lists.add(maps);
		}
	}
}
           
package com.pdsu.customview.utils;

import java.util.List;
import java.util.Map;

import com.pdsu.customview.R;

import android.R.layout;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class MyAdapter extends BaseAdapter {

	private List<Map<String, String>> lists = null;
	private Context mContext;

	public MyAdapter(Context mContext, LayoutInflater mInflater, List<Map<String, String>> lists) {
		super();
		this.mContext = mContext;
		this.mInflater = mInflater;
		this.lists = lists;
	}

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return lists == null ? 0 : lists.size();
	}

	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		if (lists == null) {
			return "資料項為空";
		} else {
			return lists.get(position);
		}
	}

	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		ViewHolder holder = null;
		if (convertView == null) {
			convertView = mInflater.inflate(R.layout.icon_item, parent, false);
			holder = new ViewHolder();
			holder.text = (TextView) convertView.findViewById(R.id.item_text);
			holder.icon = (ImageView) convertView.findViewById(R.id.item_icon);
			convertView.setTag(holder);
		} else {
			holder = (ViewHolder) convertView.getTag();
		}
		holder.text.setText(lists.get(position).get("sno"));
		holder.icon.setImageResource(lists.get(position).get("image") == "0" ? R.drawable.flag_uk : R.drawable.flag_us);
		return convertView;
	}

	private LayoutInflater mInflater;

	static class ViewHolder {
		TextView text;
		ImageView icon;
	}
}
           
package com.pdsu.customview.utils;

import android.content.Context;
import android.widget.Toast;

public class ToastUtils {

	private static Toast mToast = null;

	public void showToast(Context mContext, String msg) {
		if (mToast == null) {
			mToast = Toast.makeText(mContext, msg, Toast.LENGTH_SHORT);
		} else {
			mToast.setText(msg);
		}
		mToast.show();
	}
}
           

源碼位址:http://download.csdn.net/detail/osevenblue/9294785

繼續閱讀