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);
}
}
}
}
複製程式碼
從上面的效果圖可看出,確實實現了彈性的滑動效果。