一、监听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);
}
}
/**
* 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();
}
}