《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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值