标签: android进阶 读书笔记 ListView
4.1 ListView使用技巧
使用ViewHolder提升效率
略
设置项目间分割线
android:divider="@android:color/darker_gray"
android:dividerHeight="10dp"
android:divider="@null"//将分割线设置为透明
隐藏ListView滚动条
android:srollbars="none"
取消ListView的Item的点击效果
android:listSelector="#00000000"
或者
android:listSelector="@android:color/transparent"
设置ListView显示在第几项
listView.setSlection(int index);
如果需要平滑滚动
mListView.smoothScrollBy(distance,duration);
mListView.smoothScrollByOffset(offset);
mListView.smoothScrollToPosition(index);
动态修改ListView
mData.add("new");
mAdapter.notifyDataSetChanged();
注意必须保证是同一个List(即数据来源),否则无法达到效果
遍历ListView中所有Item
for(int i=0;i<mListView.getChildCount();i++)
View view=mListView.getChildAt(i);
处理空的ListView
setEmptyView(View);
ListView的滑动监听
1 OnTouchListener
通过监听ACTION_DOWN,ACTION_MOVE,ACTION_UP来实现
2 OnScrollListener
OnScrollListener.SCROLL_STATE_IDIE:滚动停止
OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:正在滚动
OnScrollListener.SCROLL_STATE_FLING:手指拋动,在离开后ListView由于惯性继续滑动的状态
(当用户没有手指拋动时不会回调FLING状态)
OnSroll:滑动时一直调用
(在这个方法参数中:
firstVisibleItem:当前能看见的第一个Item的ID(从0开始);visibleItemCount:当前能看见的Item的总数(即使底部Item未全部显示也包含在内);
totalItemCount:整个Item的总数)
if(firstVisibleItem+visibleItemCount==totalItemCount&&totalItemCount>0)
{
//说明此时滚动到最后一行
}
if(firstVisibleItem>lastVisibleItemPosition){
//上滑
}else if(firstVisibleItem<lastVisibleItemPosition){
//下滑
}
lastVisibleItemPosition=firstVisibleItem;
还有:
mListView.getLastVisiblePosition();
mListView.getFirstVisiblePosition();
4.2 ListView常用扩展
4.2.1 具有弹性滑动的ListView
重写ListView的overSrollBy();
替换maxOverScrollY(默认值为0)为不为零的其他值
4.2.2 自动显示,隐藏布局的ListView
主要思想就是监听ListView的滑动方向,然后实现上滑ListView时(即此时ListView内容向下滑动)隐藏标题栏等,反之显示
注意需要给ListView增加一个HeaderView,从而避免第一个Item被标题栏遮挡
View header = new View(this);
header.setLayoutParams(new AbsListView.LayoutParams(
AbsListView.LayoutParams.MATCH_PARENT,
(int) getResources().getDimension(
R.dimen.abc_action_bar_default_height_material)));
mListView.addHeaderView(header);
4.2.3聊天ListView
1重写ListView的Adapter的
public int getItemViewType(int position){
return type;
}
和
public int getViewTypeCount(){
return number;
}
2然后在getView中对于不同的数据加载不同的布局就行了
@Override
public int getItemViewType(int position) {
ChatItemListViewBean bean = mData.get(position);
return bean.getType();
}
@Override
public int getViewTypeCount() {
return 2;
}
@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;
}
4.2.4 动态改变ListView布局
1将两种布局写在一起,通过控制布局的显示和隐藏达到切换布局的效果(例如Foucus时显示不同的布局)
2在Adapter的getView方法中,通过判断来选择加载不同的布局
例如
先设置监听
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
adapter.setCurrentItem(position);//自定义方法
adapter.notifyDataSetChanged();
}
});
然后判断
public View getView(int position, View convertView, ViewGroup parent) {
LinearLayout layout = new LinearLayout(mContext);
layout.setOrientation(LinearLayout.VERTICAL);
if (mCurrentItem == position) {
layout.addView(addFocusView(position));
} else {
layout.addView(addNormalView(position));
}
return layout;
}