zoukankan      html  css  js  c++  java
  • 嵌套RecyclerView左右滑动替代自定义view

    以前的左右滑动效果采用自定义scrollview或者linearlayout来实现,recyclerview可以很好的做这个功能,一般的需求就是要么一个独立的左右滑动效果,要么在一个列表里的中间部分一个左右滑动效果

    而列表里面也容易,只是需要解决一点小问题,个人认为值得一提的就是高度问题,一般的人采用固定死的高度,可是在列表里面展示和机型的不同,固定死的话很难保证美观,动态的高度才能解决问题的所在

    首先在一个列表控件布局上添加一个recyclerview控件

    <android.support.v7.widget.RecyclerView
            android:id="@+id/plan_recycler"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>

    然后是adapter适配器布局

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:padding="@dimen/dimen_20dp">
    
        <ImageView android:id="@+id/img_icon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:src="@drawable/bbs_plan_mofa"/>
        <TextView android:id="@+id/tv_content"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="@dimen/dimen_8dp"
            android:textSize="15sp"
            android:textColor="@color/color_323232"/>
    
    </LinearLayout>

    接下来写adapter

    import android.content.Context;
    import android.support.v7.widget.RecyclerView;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;
    import com.xulu.loanmanager.R;
    
    import java.util.List;
    
    import butterknife.BindView;
    import butterknife.ButterKnife;
    
    /**
     * Created by LiuZhen on 2017/6/22.
     */
    
    public class BBSPlanAdapter extends RecyclerView.Adapter<BBSPlanAdapter.MyViewHolder> {
    
        private List<String> list;
        private LayoutInflater mInflater;
        private Context context=null;
        private int height;
        private boolean isMeasure = false;
        private CallBack callBack;
    
        public BBSPlanAdapter(Context context, List<String> list, CallBack callBack) {
            this.context=context;
            this.list = list;
            mInflater = LayoutInflater.from(context);
            this.callBack = callBack;
        }
    
        @Override
        public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = mInflater.inflate(R.layout.item_bbsdetail_plan, parent, false);
            if (!isMeasure) {
                view.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
                height = view.getMeasuredHeight();
                callBack.getHeight(height);
            }
            MyViewHolder holder = new MyViewHolder(view);
            return holder;
        }
    
        public int getHeight(){
            return height;
        }
    
        @Override
        public void onBindViewHolder(MyViewHolder holder, final int position) {
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    callBack.ItemClick(position);
                }
            });
        }
    
        @Override
        public int getItemCount() {
            return 6;
        }
    
        static class MyViewHolder extends RecyclerView.ViewHolder{
    
            @BindView(R.id.tv_content)
            TextView tv_content;
    
            MyViewHolder(View view){
                super(view);
                ButterKnife.bind(this,view);
            }
    
        }
    
        public interface CallBack{
            void getHeight(int height);
            void ItemClick(int position);
        }
    
    }

    重点是measure方法,得到测量的高度

    接下来就可以直接使用了

    private void initScrollList(){
            final RecyclerView planRecycler = (RecyclerView) headView.findViewById(R.id.plan_recycler);
    
            LinearLayoutManager linearLayoutManager = new LinearLayoutManager(BBSDetailActivity.this);
            linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
            planRecycler.setLayoutManager(linearLayoutManager);
            List<String> list = new ArrayList<>();
            BBSPlanAdapter adapter = new BBSPlanAdapter(BBSDetailActivity.this, list, new BBSPlanAdapter.CallBack() {
                @Override
                public void getHeight(int height) {
                    ViewGroup.LayoutParams params = planRecycler.getLayoutParams();
                    params.height = height;
                    planRecycler.setLayoutParams(params);
                }
    
                @Override
                public void ItemClick(int position) {
                    Toast.makeText(BBSDetailActivity.this,""+position,Toast.LENGTH_SHORT).show();
                }
            });
            planRecycler.setAdapter(adapter);
        }

    很简单,完全替代自定义view,效果如下,如果没有测量这一步可能会出现高度不适合,要么是看不到textview的文字,因为太低了,要么就是太高了,不美观

  • 相关阅读:
    CDN混战何去何从,史上最全分析
    s3c2440中U-boot移植时执行cp.b提示:Flash not Erased【转】
    ubuntu18.04下挂载网络文件系统失败【学习笔记】
    win10下搭建深度学习--总结【学习笔记】
    零基础入门深度学习(5)
    为pyhon安装opencv扩展包出现distributed 1.21.8 requires msgpack, which is not installed.【转】
    ubuntu18.04下监视显卡的运行情况【学习笔记】
    Windows10下用Anaconda3安装TensorFlow教程【转】
    ImportError: libcublas.so.9.0: cannot open shared object file: No such file or directory 【学习笔记】【原创】
    安装tensorflow报ImportError: libcublas.so.9.0: cannot open shared object file的解决方法【转】
  • 原文地址:https://www.cnblogs.com/LiuZhen/p/7065874.html
Copyright © 2011-2022 走看看