ListView 在Android列表中具有举足轻重的位置,虽然新增的RecyclerView可以实现ListView的效果,以及可以实现ListView不能实现的效果,但是在众多的Android软件中,ListView仍然会被大量使用。
我们都知道ListView滚动到顶部或者底端的时候,没有弹性的效果,给用户的体验十分的不友好,而Android5.0以上,ListView只是添加了一个半月的阴影效果,相对越IOS的弹性列表,Android的ListView仍然不能与之匹敌。
本文只是简单的改造一下ListView,让其具有弹性的效果。从源码中可以发现,ListView有一个可以控制滑动到边缘的处理方法overScrollBy。该方法的maxOverScrollY就是控制滑动到顶部时可以超过的最大高度,默认值为0。有了这个参数,就好办了,我们可以重写改方法,然后修改maxOverScrollY的值,那么ListView就具有了弹性效果。
public class ExcependListView extends ListView {
public ExcependListView(Context context) {
super(context);
}
public ExcependListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ExcependListView(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) {
return super.overScrollBy(deltaX, deltaY,
scrollX, scrollY, scrollRangeX,
scrollRangeY, maxOverScrollX,
PXUtils.getRealPixel(300), isTouchEvent);
}
}
复制代码
上面的ExcependListView继承了ListView,并且重写了overScrollBy修改maxOverScrollY的值。
public class ExcepenLSActivity extends AppCompatActivity {
private ExcependListView mList;
private List mData = new ArrayList();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_excepen_ls);
PXUtils.init(this);
for (int i = 0; i < 50; i++) {
String s = "name"+i;
mData.add(s);
}
mList = (ExcependListView)this.findViewById(R.id.list);
MAdapter mAdapter = new MAdapter(mData,this);
mList.setAdapter(mAdapter);
}
private class MAdapter extends BaseAdapter{
private List<String>datas;
private Context mContext;
public MAdapter(List<String> datas, Context context) {
this.datas = datas;
mContext = context;
}
@Override
public int getCount() {
return datas.size();
}
@Override
public Object getItem(int position) {
return datas.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null || !(convertView instanceof Item)){
convertView = new Item(mContext);
}
((Item)convertView).setData(datas.get(position));
return convertView;
}
private class Item extends LinearLayout{
private Button btn;
public Item(Context context) {
super(context);
initView(context);
}
private void initView(Context context) {
View view = LayoutInflater.from(context).inflate(R.layout.item_layout,null);
addView(view);
btn = view.findViewById(R.id.text);
}
public void setData(String text){
btn.setText(text);
}
}
}
}
复制代码
从上面的效果图可看出,确实实现了弹性的滑动效果。