天天看点

《Android群英传》---读书笔记2

标签: 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;
}