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;
}
});