您的位置:首页 > 其它

使用ViewHolder提高ListView的效率

2016-09-25 19:29 417 查看
ViewHolder模式充分利用ListView的视图缓存机制,避免每次在调用getView()的时候去通过findViewById()实例化控件。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageView"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textView"/>
</LinearLayout>

<?xml version="1.0" encoding="utf-8"?>
<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="servicedemo.example.com.testviewholder.MainActivity">

<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/listView" />
</RelativeLayout>

public class MainActivity extends AppCompatActivity {

private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

listView = (ListView) findViewById(R.id.listView);
List<String> mData = new ArrayList<String>();
for (int i = 0; i < 20; i++) {
mData.add("" + i);
}
ViewHolderAdapter mAdapter = new ViewHolderAdapter(this, mData);
listView.setAdapter(mAdapter);

}
}

public class ViewHolderAdapter extends BaseAdapter{

private List<String> mData;
private LayoutInflater mInflater;

public ViewHolderAdapter(Context context,List<String> data){
this.mData = data;
mInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return mData.size();
}

@Override
public Object getItem(int i) {
return mData.get(i);
}

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

@Override
public View getView(int i, View convertView, ViewGroup viewGroup) {
ViewHolder holder = null;
// 判断是否缓存
if (convertView == null) {
holder = new ViewHolder();
// 通过LayoutInflater实例化布局
convertView = mInflater.inflate(R.layout.notify_item, null);
holder.img = (ImageView) convertView.findViewById(R.id.imageView);
holder.title = (TextView) convertView.findViewById(R.id.textView);
convertView.setTag(holder);
} else {
// 通过tag找到缓存的布局
holder = (ViewHolder) convertView.getTag();
}
// 设置布局中控件要显示的视图
holder.img.setBackgroundResource(R.mipmap.ic_launcher);
holder.title.setText(mData.get(i));
return convertView;
}

public final class ViewHolder{
public ImageView img;
public TextView title;
}
}

listView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {

switch (motionEvent.getAction()){
case MotionEvent.ACTION_DOWN:
Log.i("test","触摸时操作");
break;
case MotionEvent.ACTION_MOVE:
Log.i("test","移动时操作");
break;
case MotionEvent.ACTION_UP:
Log.i("test","离开时操作");
break;
}
return false;
}
});

listView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView absListView, int i) {
switch (i){
case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:
Log.i("test1","停止滑动时");
break;
case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
Log.i("test1","正在滚动");
break;
case AbsListView.OnScrollListener.SCROLL_STATE_FLING:
Log.i("test1","手指用力滑并离开后由于惯性滑动");
break;
}
}

/*
*
* firstVisibleItem 能看见的第一个Item的ID
* VisibleItemCount 能看见的Item总数
* totalItemCount  整个ListView的Item总数
* */
@Override
public void onScroll(AbsListView absListView, int firstVisibleItem, int VisibleItemCount, int totalItemCount) {
Log.i("test2","滚动时一直调用!");

if (firstVisibleItem + VisibleItemCount  == totalItemCount && totalItemCount > 0)
{
Log.i("test3","滚到最后一行");
}
if (firstVisibleItem > lastVisibleItemPosition){
Log.i("test3","上滑");
}else  if(firstVisibleItem < lastVisibleItemPosition){
Log.i("test3","下滑");
}
lastVisibleItemPosition = firstVisibleItem;
}
});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: