ListView使用技巧

  • ListView常用技巧
  • ListView常用拓展

4.1.1使用ViewHolder模式提高效率

4.1.2设置项目间分割线

  android:divider="@android:color/darker_gray"
        android:dividerHeight="5dp"

4.1.3隐藏ListView的滚动条

android:scrollbars="none"
package wangsheng.swpuiot.qunyingzhuan.ch4.section1;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.List;

import wangsheng.swpuiot.qunyingzhuan.R;

public class ViewHoulderAdapter extends BaseAdapter {
    private List<String> mData;
    private LayoutInflater mInflater;

    public ViewHoulderAdapter(Context con, List<String> mData) {
        this.mData = mData;
        this.mInflater = LayoutInflater.from(con);
    }

    @Override
    public int getCount() {
        return mData.size();
    }

    @Override
    public Object getItem(int position) {
        return mData.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHoulder viewHoulder = null;
        //判断是否缓存
        if (convertView == null) {
            viewHoulder = new ViewHoulder();
            convertView = mInflater.inflate(R.layout.viewholder, null);
            viewHoulder.img = convertView.findViewById(R.id.imageView);
            viewHoulder.title = convertView.findViewById(R.id.textView);
            convertView.setTag(viewHoulder);
        } else {
            viewHoulder = (ViewHoulder) convertView.getTag();
        }
        viewHoulder.img.setBackgroundResource(R.drawable.ic_launcher_background);
        viewHoulder.title.setText(mData.get(position));
        return convertView;
    }

    public final class ViewHoulder {
        public ImageView img;
        public TextView title;
    }
}

效果图
在这里插入图片描述

4.1.4取消ListView的item的点击效果

android:listSelecter = "#000000000"

或者Android自带的透明色

android:listSelecter = "@android:color/transparent"

设置ListView需要显示在第几项

listView.setselection(N)

上面的方法类似于scrollTo是瞬间移动都得。下面是平滑移动

mListView.smoothScrollBy(distance,duration);
mListView.smoothScrollByOffset(offset);
mListView.smoothScrollToPosition(index);

动态修改ListView

mData.add("new");
mAdapter.notifyDataSetChanged();

遍历ListView中所有item

for(int i = 0;i<mListView.getChildCount();i++){
	View view = mListView.getChildAt(i);
}

处理空ListView

ListView无数据时候,给以无数据提示

ListView listView = findViewById(R.id.listView);
listView.setEmptyView(findViewById(R.id.empty_view));

空数据显示默认视图,有数据不会显示

ListView滑动监听

mListView.setOnTouchListener(new View.OnTouchListener() {
                    @Override
                    public boolean onTouch(View v, MotionEvent event) {
                        switch (event.getAction()) {
                            case MotionEvent.ACTION_DOWN:
                                break;
                            case MotionEvent.ACTION_MOVE:
                                break;
                            case MotionEvent.ACTION_UP:
                                break;
                        }
                        return false;
                    }
                });

可以通过这三个事件发生时的坐标,根据坐标判断用户滑动的方向,并在不同的事件中做出不同的处理。

OnScrollerListener

    mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
                    @Override
                    public void onScrollStateChanged(AbsListView view, int scrollState) {
                        switch (scrollState) {
                            case SCROLL_STATE_IDLE:
                                //停止滑动时
                                break;
                            case SCROLL_STATE_TOUCH_SCROLL:
                                //正在滚动
                                break;
                            case SCROLL_STATE_FLING:
                                //手指抛动时,即手指用力滑动
                                //在离开后ListView由于惯性继续滑动的状态
                                break;
                        }
                    }

                    @Override
                    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                        //滚动时一直调用
                    }
                });

当用户没有做手指抛动的状态时候OnScrollerListener方法只会回调两次,一次停止,一次正在滚动,否则3次加上手指抛动。
onScroll()这个回调方法,它在ListView滚动时会一直回调,而方法中的后三个int参数,非长精确地显示了滚动的状态

  • firstVisibleItem :当前能看见的第一个Item的ID(从0开始)(包括没有完整显示的)
  • visibleItemCount:当前能看见的Item总数
  • totalItemCount:整个ListView的Item总数

判断是否滚动到了最后一行

if(firstVisibleItem+visibleItemCount==totalItemCount&&totalItemCount>0){
		//当前满足已滚动到了最后一行
}

判断滚动的方向

if(firstVisibleItem>lastVisibleItemPosition){
	//上滑
}else if(firstVisibleItem<lastVisibleItemPosition){
	下滑
}
lastVisibleItem = firstVisibleItem;

通过一个成员变量lastVisibleItem来记录上一次第一个可视的Item的ID并与当前的可视Item的ID进行比较,可知滚动方向。

ListView已经封装的一些方法

//获取可视区域内最后一个Item的id
mListView.getLastVisiblePosition()
//获取可视区域内第一个Item的id
mListView.getFirstVisiblePosition()

4.2ListView常用拓展

具有弹性的ListView

通过自写ListView继承原生ListView重写overScrollBy方法,修改传入的maxOverScrollY参数,这个参数默认是0,就没有弹性,可以传入我们自己定量的值,就可以让ListView具有弹性。
这种方法不如增加HeaderView或者使用ScrollerView进行嵌套的可定制性高。
在这里插入图片描述
在这里插入图片描述

自动显示隐藏布局的ListView

给ListView增加一个HeaderView

聊天的ListView

就是根据ListView的item的不同加载不同的布局就行了
ListView有个 getItemViewType()方法。

动态地改变ListView的布局

通过记录点击的item的位置,在getView的方法中判断position是否为点击的item的位置,加载不同的布局。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值