簡單實現具有彈性的ListView

鋸齒流沙發表於2017-12-26

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);
            }
        }

    }
}
複製程式碼

View

從上面的效果圖可看出,確實實現了彈性的滑動效果。

相關文章