■ListView列表视图
1.概述:以垂直列表的形式显示所有列表项。由于RecyclerView覆盖了ListView所有常用功能,甚至相比有更灵活的扩展性。
因此,能使用RecyclerView的话,就很少有人使用ListView了。
2.两种实现方式:
(1)ListView作为Activity里层控件(普通方式创建,最常见)
(2)ListView作为Activity最外层控件(Activity集成ListActivity)
3.属性:android:dividerHeight="10dp" 分割线高度,各列表项的间距
android:divider="@android:color/white" 分割线颜色,各列表项间距的颜色
注意:
没有设置divider属性时,分隔条高度dividerHeight默认为大约1dp。
当设置列表的divider属性时(此时默认dividerHeight为0),要配置dividerHeight属性。
android:listSelector="@android:color/transparent" 去除列表项被选中时的默认背景(ItemVIew已经设置了背景,也就无须使用该属性了)
android:cacheColorHint="@android:color/transparent" 避免列表在被滑动时变黑的情况4.方法:
onItemClickListener(...)
注意:若单独监听了ItemView里面某个View或者这个View具有默认监听事件,
就可能会出现点击ItemView无效。
因为被点击事件可能被View拦截并处理掉了。
此时,若想ItemVIew一定获得点击事件焦点,
对ItemView的根布局设置属性Android:descendantFocusability="blocksDescendants"即可。
setClickable(false) // 禁止点击注意:setClickable(false)方法要在setOnClickListener()方法之后被调用。
因为执行setOnClickListener()方法的过程中会确保clickable状态为true。
4.刷新:(1)全部刷新:
对每个ItemView都进行了刷新。
方法:先给原先用来构造适配器的数据源赋予新值,
然后再调用“适配器”的刷新方法。
确保以上次序和方法调用的对象为适配器却还是不能刷新的话,
在适配器类中创建setDatas(目标数据)方法。
在setDataChanged(…)中设置数据源和调用NotifyDataSetChanged方法。
注意:
是调用Adapter的NotifyDataSetChanged方法,
而不是ListView的deferNotifyDataSetChanged方法。
(2)单个刷新/局部刷新:
写一个更新方法,来单独刷新ItemView中的某个View。
------------------------------
/** position 要更新的View所处的列表项位置*/
public void updateItemView(int position) {
// 第一个看得见的列表项位置
int visiblePosition = mListView.getFirstVisiblePosition();
int index = position - visiblePosition;
// 看得见的列表项才去更新
if (index >= 0) {
// 要更新的ItemView
View view = mListView.getChildAt(index);
// 要更新的ItemView的holder
MyAdapter.ViewHolder holder = (MyAdapter.ViewHolder) view.getTag();
// 更新View内容
holder.textview.setText("已读");
// 若要必要,接着更新数据源
mData.get(index).put("record", "1");
}
}
------------------------------
@Override
public View getView(final int position, View convertView, ViewGroupparent) {
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
convertView =mInflater.inflate(R.layout.listview_item, null);
holder.textview = (TextView)convertView.findViewById(R.id.textview);
convertView.setTag(holder);
} else {
holder = (ViewHolder)convertView.getTag();
}
holder.textview.setText((String)mData.get(position).get("title"));
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
updateItemView(position);
}
});
return convertView;
}