使用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; } });
相关文章推荐
- ListView使用ViewHolder模式提高效率
- android群英传笔记——ListView常用优化技巧(一、使用ViewHolder模式提高效率)
- 【Android UI】ListView使用ViewHolder模式提高效率
- Android探究--使用ViewHolder提高ListView效率
- Android列表组件ListView使用详解之ViewHolder提高效率
- ListView使用技巧之ViewHolder模式提高效率
- ListView的使用用ViewHolder提升效率
- 【Android Training - Performance】提高显示布局文件的性能[Lesson 4 - 使用ViewHolder提升ListView的性能]
- 使用ViewHolder模式来提高自定义adapter的效率
- Android中关于RecycleView的使用,代替ListView,可以提高效率
- ListView使用ViewHolder提高性能
- 复用历史缓存View对象解决ListView的OOM异常,使用句柄提高ListView显示效率(二)
- 如何使用ListView实现一个带有网络请求,解析,分页,缓存的公共的List页面来大大的提高工作效率
- ListView之BaseAdapter的基本使用以及ViewHolder模式
- ListView之BaseAdapter的基本使用以及ViewHolder模式
- ListView之BaseAdapter的基本使用以及ViewHolder模式
- ListView之BaseAdapter的基本使用以及ViewHolder模式
- ListView 使用 ViewHolder
- Android Training - 提升布局文件的性能(Lesson 4 - 使用ViewHolder来提升ListView的性能)
- ListView之BaseAdapter的基本使用以及ViewHolder模式