Android ListView使用总结

一、监听ListView的滑动方向

方法一:

// 系统默认的最低滑动距离,即超过这个值,才被认作是滑动
private float mTouchSlop;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mTouchSlop = ViewConfiguration.get(this).getScaledTouchSlop();
    initView();
}
private void initView() {
    myList = (MyListView) findViewById(R.id.myList);

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,
            new String[]{"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "L", "M", "N", "O", "P", "Q"});
    myList.setAdapter(adapter);

    myList.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            float x = event.getX();
            float y = event.getY();

            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    lastX = event.getX();
                    lastY = event.getY();
                    break;
                case MotionEvent.ACTION_MOVE:
                    float deltaX = x - lastX;
                    float deltaY = y - lastY;

                    // 屏幕的Y轴是沿屏幕朝下的
                    if (deltaY > mTouchSlop) {
                        Log.i(LOG_TAG, "下移");
                    } else if (deltaY < -mTouchSlop) {
                        Log.w(LOG_TAG, "上移");
                    }

                    break;
                case MotionEvent.ACTION_UP:
                    break;
            }

            lastX = x;
            lastY = y;

            return false;
        }
    });
}

方法二:
myList.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                switch (scrollState) {
                    case SCROLL_STATE_IDLE:
                        Log.i(LOG_TAG, "滑动停止时,该方法只会调用一次");
                        break;
                    case SCROLL_STATE_TOUCH_SCROLL:
                        Log.i(LOG_TAG, "正在滑动时,该方法只会调用一次");
                        break;
                    case SCROLL_STATE_FLING:
                        Log.i(LOG_TAG, "手指抛动时,即手指快速滑动后,ListView要惯性移动一段距离" +
                                ",该方法某些情况下可以不被调用");
                        break;
                }
            }

            /* @params:firstVisibleItem-- 当前能看见的第一个View的ID
            *          visibleItemCount-- 当前能看见的Item总数
            *          totalItemCount  -- ListView的Item总数*/
            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                if (firstVisibleItem > lastFirstVisibleItem)
                    Log.w(LOG_TAG, "上滑");
                else if (firstVisibleItem < lastFirstVisibleItem)
                    Log.w(LOG_TAG, "下滑");
                lastFirstVisibleItem = firstVisibleItem;
            }
        });


2、定义弹性滑动的ListView
    重写overScrollBy函数,该函数中默认的为0,将其修改为相应值即可

/** 定义弹性滑动的ListView  **/
public class MyListView extends ListView {
    private int maxOverScrollDistanceY = 80;

    public MyListView(Context context, AttributeSet attrs) {
        super(context, attrs);

        DisplayMetrics metrics = context.getResources().getDisplayMetrics();
        float density = metrics.density; // 获取屏幕密度
        maxOverScrollDistanceY = (int) (maxOverScrollDistanceY * density);

    }

    public MyListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX,
                                   int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {
        // 将maxOverScrollY滑动距离替换为maxOverScrollDistanceY即可,因为其默认值为0
        return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY,
                maxOverScrollX, maxOverScrollDistanceY, isTouchEvent);
    }

    public void setMaxOverScrollDistanceY(int maxOverScrollDistanceY) {
        this.maxOverScrollDistanceY = maxOverScrollDistanceY;
    }
}

三、RecyclerView的使用:
1、在布局文件xml中使用:
<android.support.v7.widget.RecyclerView
    android:id="@+id/myRecyclerView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:scrollbars="vertical"
    >
</android.support.v7.widget.RecyclerView>

2、在Activity中使用:

public class MainActivity extends AppCompatActivity {

    private RecyclerView myRecyclerView;
    private RecyclerView.Adapter myAdapter;
    private RecyclerView.LayoutManager myLayoutManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        myRecyclerView = $(R.id.myRecyclerView);
        // 用于自身优化
        myRecyclerView.setHasFixedSize(true);

        myLayoutManager = new LinearLayoutManager(this);
        myRecyclerView.setLayoutManager(myLayoutManager);

        List<String> dataLists = new ArrayList<>();
        dataLists.add("a");
        dataLists.add("b");
        dataLists.add("c");
        dataLists.add("d");

        myAdapter = new MyRecyclerAdapter(dataLists);
        myRecyclerView.setAdapter(myAdapter);
    }

    private <T> T $(int resId) {
        return (T) findViewById(resId);
    }

}


3、自定义Adapter:

/**
 * Adapter用法类似于ListView的BaseAdapter,这里实现了对ViewHolder的封装
 */
public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.MyViewHolder> {
    private List<String> dataLists;

    /** 自定义ViewHolder */
    public static class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView txt1;
        public TextView txt2;

        public MyViewHolder(View itemView) {
            super(itemView);

            /** 界面初始化被提到了这里 **/
            txt1 = (TextView) itemView.findViewById(R.id.txt1);
            txt2 = (TextView) itemView.findViewById(R.id.txt2);
        }
    }

    // 构造函数
    public MyRecyclerAdapter(List<String> dataLists) {
        this.dataLists = dataLists;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        /** 为每个RecyclerView的Item项提供界面 **/
        View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.recy_item_layout,viewGroup, false);
        // 创建自定义的ViewHolder
        MyViewHolder myViewHolder = new MyViewHolder(itemView);

        return myViewHolder;
    }

    /** 为每个Item的界面赋值 **/
    @Override
    public void onBindViewHolder(MyViewHolder viewHolder, int i) {
        viewHolder.txt1.setText(dataLists.get(i));
        viewHolder.txt2.setText(dataLists.get(i));
    }

    @Override
    public int getItemCount() {
        if (dataLists == null)
            return 0;
        return dataLists.size();
    }
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值