简单实现具有弹性的ListView

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

    }
}
复制代码

从上面的效果图可看出,确实实现了弹性的滑动效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值