美文网首页Android-recyclerview
android recycleview点击滑动到指定位置

android recycleview点击滑动到指定位置

作者: hao_developer | 来源:发表于2021-07-17 11:43 被阅读0次

    只需要自定义一个LinearSmoothScroller,仔细看LinearSmoothScroller的源码发现,其实谷歌已经埋下了伏笔,既然纠正就纠正到底吧

    public class TopSmoothScroller extends LinearSmoothScroller {
        TopSmoothScroller(Context context) {
            super(context);
        }
        @Override
        protected int getHorizontalSnapPreference() {
            return SNAP_TO_START;
        }
        @Override
        protected int getVerticalSnapPreference() {
            return SNAP_TO_START;
        }
    }
    

    然后调用LinearLayoutManager的startSmoothScroll即可

    final TopSmoothScroller mScroller = new TopSmoothScroller(getActivity());
    mScroller.setTargetPosition(integer);
    mManager.startSmoothScroll(mScroller);
    

    demo:

    public class RvHuaDongActivity extends BaseActivity {
        RecyclerView mRv;
        private LinearLayoutManager mManager;
    
        //此处等于onCreate
        @Override
        protected void initData() {
            List<String> list = new ArrayList<>();
            for (int i = 0; i < 100; i++) {
                list.add("position" + i);
            }
            mManager = new LinearLayoutManager(this);
            mRv.setLayoutManager(mManager);
            mRv.setAdapter(new MyAdapter(list));
        }
    
        public void onClick(View view) {
            switch (view.getId()) {
                case R.id.tv_rvhuadong_GuanXing_1:
                    int position1 = (int) (Math.random() * 100);
                    Toast.makeText(this, "滑到:" + position1, Toast.LENGTH_SHORT).show();
                    LinearSmoothScroller s1 = new TopSmoothScroller(getActivity());
                    s1.setTargetPosition(position1);
                    mManager.startSmoothScroll(s1);
                    break;
                case R.id.tv_rvhuadong_GuanXing_2:
                    LinearSmoothScroller s2 = new TopSmoothScroller(getActivity());
                    s2.setTargetPosition(20);
                    mManager.startSmoothScroll(s2);
                    break;
                case R.id.tv_rvhuadong_GuanXing_3:
                    LinearSmoothScroller s3 = new TopSmoothScroller(getActivity());
                    s3.setTargetPosition(99);
                    mManager.startSmoothScroll(s3);
                    break;
                case R.id.tv_rvhuadong_ShanXian_1:
                    int position2 = (int) (Math.random() * 100);
                    Toast.makeText(this, "闪到:" + position2, Toast.LENGTH_SHORT).show();
                    mManager.scrollToPositionWithOffset(position2, 0);
                    break;
                case R.id.tv_rvhuadong_ShanXian_2:
                    mManager.scrollToPositionWithOffset(20, 0);
                    break;
                case R.id.tv_rvhuadong_ShanXian_3:
                    mManager.scrollToPositionWithOffset(99, 0);
                    break;
            }
        }
     
        private class MyAdapter extends RecyclerView.Adapter<BaseViewHolder> {
            private final List<String> mList;
     
            public MyAdapter(List<String> list) {
                mList = list;
            }
     
            @Override
            public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                LinearLayout ll = new LinearLayout(getActivity());
                ll.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
                ll.setOrientation(LinearLayout.VERTICAL);
     
                AppCompatTextView tv = new AppCompatTextView(RvHuaDongActivity.this);
                tv.setTextSize(30);
                tv.setBackgroundColor(0xffeeeeee);
                ll.addView(tv);
     
                RecyclerView rv = new RecyclerView(getActivity());
                rv.setLayoutManager(new LinearLayoutManager(getActivity()));
                rv.setNestedScrollingEnabled(true);
                rv.setAdapter(new ItemAdapter(new ArrayList<String>()));
                ll.addView(rv, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
                return new BaseViewHolder(ll);
            }
     
            @Override
            public void onBindViewHolder(BaseViewHolder holder, int position) {
                ViewGroup vg = (ViewGroup) holder.itemView;
                TextView tv = (TextView) vg.getChildAt(0);
                tv.setText(mList.get(position));
     
                RecyclerView rv = (RecyclerView) vg.getChildAt(1);
                ItemAdapter adapter = (ItemAdapter) rv.getAdapter();
                adapter.mList.clear();
                for (int i = 0; i < 6; i++) {
                    adapter.mList.add("item" + i);
                }
                adapter.notifyDataSetChanged();//在bind时确定好数据
            }
     
            @Override
            public int getItemCount() {
                return mList.size();
            }
        }
     
        private class ItemAdapter extends RecyclerView.Adapter<BaseViewHolder> {
            private final List<String> mList;
     
            public ItemAdapter(List<String> list) {
                mList = list;
            }
     
     
            @Override
            public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                AppCompatTextView tv = new AppCompatTextView(RvHuaDongActivity.this);
                tv.setTextSize(30);
                tv.setBackgroundColor(0xffeeeeee);
                tv.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
                return new BaseViewHolder(tv);
            }
     
            @Override
            public void onBindViewHolder(BaseViewHolder holder, int position) {
                TextView tv = (TextView) holder.itemView;
                tv.setText(mList.get(position));
                if (position >= mList.size() - 2) {
                    tv.getLayoutParams().height = 600;
                } else {
                    tv.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT;
                }
                tv.setLayoutParams(tv.getLayoutParams());
            }
     
            @Override
            public int getItemCount() {
                return mList.size();
            }
        }
    }
    

    相关文章

      网友评论

        本文标题:android recycleview点击滑动到指定位置

        本文链接:https://www.haomeiwen.com/subject/ymcwpltx.html