在实际的应用开发时,往往有很多地方需要使用listview,当然我们得了解它的一些技巧。
1.ListView的优化技巧
主要使用ViewHolder来提高效率,利用它的视图缓存机制,避免每次在调用方getView()方法时通过findViewById()实例化控件。使用时,只需在自定义的adapter中定义内部类ViewHolder,将ListView的item中的控件作为其成员变量。
如下getView()方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| @Override public View getView(int position, View convertView, ViewGroup parent) { 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.drawable.ic_launcher); holder.title.setText(mData.get(position)); return convertView; } //定义内部类 public final class ViewHolder { public ImageView img; public TextView title; }
|
2.ListView的常用属性
设置分割线
隐藏滚动条
1
| android:scrollbars="none"
|
设置要显示在第N项
1 2 3 4 5 6
| //瞬间完成 listView.setSelection(N); //平滑完成 listView.smoothScrollBy(distance,duration); listView.smoothScrollByOffset(offset); listView.smoothScrollToPosition(n);
|
动态修改
1 2
| //改变llist后调用 mAdapter.notifyDataSetChanged();
|
3.动态改变ListView的布局
如:实现聊天界面,加载连个布局的。
主要是比普通的adapter多实现getItemViewType()和getViewType()两个方法,然后再getView()中作出相应的处理。
如下部分主要代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| //返回第position个item是何种类型 @Override public int getItemViewType(int position) { ChatItemListViewBean bean = mData.get(position); return bean.getType(); } //返回不同布局的总数 @Override public int getViewTypeCount() { return 2; }</span> @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { //判断布局类型 if (getItemViewType(position) == 0) { holder = new ViewHolder(); convertView = mInflater.inflate( R.layout.chat_item_itemin, null); holder.icon = (ImageView) convertView.findViewById( R.id.icon_in); holder.text = (TextView) convertView.findViewById( R.id.text_in); } else { holder = new ViewHolder(); convertView = mInflater.inflate( R.layout.chat_item_itemout, null); holder.icon = (ImageView) convertView.findViewById( R.id.icon_out); holder.text = (TextView) convertView.findViewById( R.id.text_out); } convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.icon.setImageBitmap(mData.get(position).getIcon()); holder.text.setText(mData.get(position).getText()); return convertView; }
|
此外,ListView还能设置滑动监听,有OnTouchListener和OnScrollListener监听事件。
上一篇:使用Gradle发布项目到JCenter仓库
下一篇:android真机测试之offline或unauthorized错误