Android默认的ListView在滚动到顶端或者底端的时候,并没有很好的提示。不过我们也可以通过重写ListView来实现这个功能。
@Override
protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {
int mMaxOverDistance = set();
return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, mMaxOverDistance, isTouchEvent);
}
在查看ListView源代码可以发现,ListView有一个控制滑动到边缘的处理方法,如上所示。
可以看到这个参数:maxOverScrollY, 它的默认值是0,我们可以通过改变这个值来是实现弹性的ListView。
下面附上源代码:
public class TempListView extends ListView {
private Context mContext;
public TempListView(Context context) {
super(context);
mContext = context;
}
public TempListView(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
}
public TempListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mContext = context;
}
@Override
protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {
int mMaxOverDistance = set();
return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, mMaxOverDistance, isTouchEvent);
}
private int set() {
DisplayMetrics metrics = mContext.getResources().getDisplayMetrics();
float density = metrics.density;
return (int) (30 * density);
}
}
public class ListViewActivity extends AppCompatActivity {
public List<String> items;
@Bind(R.id.listView)
TempListView listView;
private MyAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_view);
ButterKnife.bind(this);
items = new ArrayList<>();
for (int i = 0; i < 20; i++) {
items.add("test" + 1);
}
adapter = new MyAdapter();
listView.setAdapter(adapter);
}
class MyAdapter extends BaseAdapter {
public MyAdapter() {
}
@Override
public int getCount() {
return items.size();
}
@Override
public Object getItem(int position) {
return items.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(ListViewActivity.this).inflate(R.layout.item_list, parent, false);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.tvTest.setText(items.get(position));
return convertView;
}
class ViewHolder {
@Bind(R.id.tv_test)
TextView tvTest;
ViewHolder(View view) {
ButterKnife.bind(this, view);
}
}
}
}