具有弹性的ListView

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);
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值