一、监听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; } });
/** 定义弹性滑动的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; } }
<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); } }
/** * 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(); } }