最近做一個項目需要用到ListView加載上千條數據,當然結果是很卡! 怎麼解決呢?google一下?
找到了一個開源項目http://commonsware.com/cwac
但是怎麼使用呢?網上找了一堆demo沒說清楚!經過本人反覆實驗 終於弄懂了!如果有不合理或者更好的建議請寫下來大家一起共同解決!
好了廢話不多說 開始!
demo和jar地址http://download.csdn.net/detail/zabio/6979685
1.準備好項目所需要的jar包 CWAC-AdapterWrapper.jar 和CWAC-EndlessAdapter.jar
2.導入項目這個步驟就不再說了
3.看代碼 簡單粗糙的寫了下
package com.hy.lazylistview;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import com.commonsware.cwac.endless.EndlessAdapter;
public class MainActivity extends Activity {
private ListView lv;
private List list = new ArrayList();
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv);
//初始化第一次顯示的數據
for (int j = 0; j < 100; j++) {
list.add(j + "startData");
}
lv.setAdapter(new MyAdapter());
}
//這個是我們需要的可以無限往下滑進行列表數據加載的控件
class MyAdapter extends EndlessAdapter {
//加載時的動畫
private RotateAnimation rotate = null;
private View pendingView = null;
//構造的時候 要super一下
MyAdapter() {
//裏面這個很熟悉 常用的baseAdapter
super(new MyBaseAdapter());
rotate = new RotateAnimation(0f, 360f, Animation.RELATIVE_TO_SELF,
0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
rotate.setDuration(600);
rotate.setRepeatMode(Animation.RESTART);
rotate.setRepeatCount(Animation.INFINITE);
}
//顯示加載時的view
@Override
protected View getPendingView(ViewGroup parent) {
View row = LayoutInflater.from(parent.getContext()).inflate(
R.layout.row, null);
pendingView = row.findViewById(android.R.id.text1);
pendingView.setVisibility(View.GONE);
pendingView = row.findViewById(R.id.throbber);
pendingView.setVisibility(View.VISIBLE);
startProgressAnimation();
return (row);
}
//設置加載的時間
@Override
protected boolean cacheInBackground() {
SystemClock.sleep(10000);
//設置限制總數據大小
return (getWrappedAdapter().getCount() < 1000);
}
//往list裏面添加數據
@Override
protected void appendCachedData() {
if (getWrappedAdapter().getCount() < 1000) {
for (int i = 0; i <100; i++) {
list.add(i+"addData");
}
}
}
void startProgressAnimation() {
if (pendingView != null) {
pendingView.startAnimation(rotate);
}
}
}
//這是常見的控件不解釋了
class MyBaseAdapter extends BaseAdapter {
@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return list.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
class Holder {
TextView t, t2;
}
@Override
public View getView(int position, View view, ViewGroup parent) {
Holder h;
if (view == null) {
h=new Holder();
view = View.inflate(MainActivity.this, R.layout.item, null);
h.t = (TextView) view.findViewById(R.id.tv);
h.t2 = (TextView) view.findViewById(R.id.tv2);
view.setTag(h);
} else {
h = (Holder) view.getTag();
}
h.t.setText("position" + position);
h.t2.setText(list.get(position).toString());
return view ;
}
}
}
--------------------資源文件--------------------
activity_main
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<ListView
android:id="@+id/lv"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_alignParentLeft="true"
android:cacheColorHint="#00000000"
android:fastScrollEnabled="true" />
</RelativeLayout>
item------------------------------
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#0f0"/>
<TextView
android:id="@+id/tv2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#00f"/>
</LinearLayout>
row-----------------------------
<?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="wrap_content" >
<TextView
android:id="@android:id/text1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:minHeight="?android:attr/listPreferredItemHeight"
android:paddingLeft="6dip"
android:textAppearance="?android:attr/textAppearanceLarge" />
<ImageView
android:id="@+id/throbber"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_popup_sync_1"
android:visibility="gone" />
<TextView
android:id="@+id/tv"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:minHeight="?android:attr/listPreferredItemHeight"
android:paddingLeft="6dip"
/>
</FrameLayout>