RecycleView嵌套RecycleView实现列表(加引导页动画及条目删除)

第一个页面设置引导页动画

在动画结束后跳转到列表页面

public class MainActivity extends AppCompatActivity {

    private ImageView iv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iv = findViewById(R.id.IV);
        getSupportActionBar().hide();
        DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
        int height = displayMetrics.heightPixels;
        //缩放
        ObjectAnimator objectAnimator1=ObjectAnimator.ofFloat(iv,"scaleX",2,1);
        //渐变
        ObjectAnimator objectAnimator2=ObjectAnimator.ofFloat(iv,"alpha",0,1);
        //旋转
        ObjectAnimator objectAnimator3=ObjectAnimator.ofFloat(iv,"rotation",0,360);
        //平移
        ObjectAnimator objectAnimator4=ObjectAnimator.ofFloat(iv,"translationY",0,height/2-iv.getHeight()/2);

        AnimatorSet set=new AnimatorSet();
        //组合
        set.play(objectAnimator1).with(objectAnimator2).with(objectAnimator3).with(objectAnimator4);
        //设置时间
       set.setDuration(3000);
       //动画开启
        set.start();
        //动画执行过程
        set.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {

            }

            @Override
            public void onAnimationEnd(Animator animation) {
                startActivity(new Intent(MainActivity.this,TwoActivity.class));
            }

            @Override
            public void onAnimationCancel(Animator animation) {

            }

            @Override
            public void onAnimationRepeat(Animator animation) {

            }
        });
    }
}

写两个页面(用fragment)点击底部切换

public class TwoActivity extends AppCompatActivity {

    private FrameLayout framelayout;
    private RadioGroup rg;
    private FragmentManager manager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_two);
        framelayout = findViewById(R.id.framelayout);
         rg = findViewById(R.id.rg);
        initData();
    }

    private void initData() {
         manager = getSupportFragmentManager();
         final OneFragment fragment1=new OneFragment();
        final TwoFragmennt fragmennt2=new TwoFragmennt();
         manager.beginTransaction().replace(R.id.framelayout,fragment1).commit();
         rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
             @Override
             public void onCheckedChanged(RadioGroup group, int checkedId) {
                 FragmentTransaction transaction=manager.beginTransaction();
                 switch (checkedId){
                     case R.id.button1:
                         transaction.replace(R.id.framelayout,fragment1);
                         break;
                     case R.id.button2:
                         transaction.replace(R.id.framelayout,fragmennt2);
                         break;
                 }
                 transaction.commit();
             }
         });
    }
}

列表顶部要实现自定义view

public class SearchView extends LinearLayout {
    private int searchColor;
    private ImageView back;
    private ImageView btn_ss;
    private EditText edit_ss;

    public SearchView(Context context) {
        this(context,null);
    }

    public SearchView(Context context,AttributeSet attrs) {
        this(context, attrs,0);
    }

    public SearchView(Context context,AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context,attrs);
    }

    private void init(Context context, AttributeSet attrs) {
        initAttrs(context,attrs);
        initView();
    }

    private void initView() {
        View view = LayoutInflater.from(getContext()).inflate(R.layout.hander, this, true);
         back = view.findViewById(R.id.back);
         btn_ss = view.findViewById(R.id.btn_ss);
         edit_ss = view.findViewById(R.id.edit_ss);
         back.setOnClickListener(new OnClickListener() {
             @Override
             public void onClick(View v) {
                 if (searchViewCallback!=null){
                     searchViewCallback.onClickListener(v);
                 }
             }
         });
        btn_ss.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (TextUtils.isEmpty(edit_ss.getText().toString())){
                    if (searchViewCallback!=null)
                        searchViewCallback.keywordsEmpty();
                    return;
                }
                if (searchViewCallback!=null)
                    searchViewCallback.searchClick(edit_ss.getText().toString());
            }
        });
    }

    private void initAttrs(Context context, AttributeSet attrs) {
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.SearchView);
         searchColor = typedArray.getColor(R.styleable.SearchView_searchColor, Color.BLUE);
         if (typedArray!=null){
             typedArray.recycle();
         }
    }
    private SearchViewCallback searchViewCallback;

    /**
     * 调用者去调用
     * @param searchViewCallback
     */
    public void setSearchViewCallback(SearchViewCallback searchViewCallback) {
        this.searchViewCallback = searchViewCallback;
    }

    public interface SearchViewCallback{
        void keywordsEmpty();
        void onClickListener(View v);//点击事件
        void searchClick(String keywords);//搜索点击事件
    }
}

布局如下

<LinearLayout
    android:orientation="horizontal"
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <ImageView
        android:id="@+id/back"
        android:src="@drawable/b"
        android:layout_gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <ImageView
        android:src="@drawable/aaa"
        android:layout_gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <ImageView
        android:id="@+id/btn_ss"
        android:src="@drawable/c"
        android:layout_gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <EditText
        android:layout_weight="1"
        android:layout_gravity="center"
        android:id="@+id/edit_ss"
        android:drawableRight="@drawable/e"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

要在value文件下新建attrs.xml文件

<declare-styleable name="SearchView">
        <attr name="searchColor" format="color"/>
        <attr name="searchSize" format="dimension"/>
    </declare-styleable>

在fragment实现自定义view


public class OneFragment extends Fragment implements SearchView.SearchViewCallback {
    private SearchView search;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.frag01, null);
         search = view.findViewById(R.id.search);
         search.setSearchViewCallback(this);
        return view;
    }

    @Override
    public void keywordsEmpty() {
        Toast.makeText(getActivity(),"关键词不能为空",Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onClickListener(View v) {
        getActivity().finish();
    }

    @Override
    public void searchClick(String keywords) {
        String result = keywords;
    }
}

mvp框架

写锲约类


public interface ListContract {
    interface IModel{
        void getLeftList(HashMap<String,String> params, ListModel.ModelCallback modelCallback);
        void getRightList(HashMap<String,String> params, ListModel.ModelCallback modelCallback);
    }
    interface IView{
        void leftSucess(List<Leftbean.databean> leftbean);
        void rightSucess(List<Rightbean.databean> rightbean);
        void leftFailure(String error);
        void rightFailure(String error);
    }
    abstract class IPresenter{
        public abstract void getLeftList(HashMap<String,String> params);
        public abstract void getRightList(HashMap<String,String> params);
    }
}

model层


public class ListModel implements ListContract.IModel {
    @Override
    public void getLeftList(HashMap<String, String> params, final ModelCallback modelCallback) {
        OkhttpUtils.getInstance().doPost(UserApi.left_api, params, new OkhttpCallback() {
            @Override
            public void failure(String msg) {
            modelCallback.leftFailure(msg);
            }

            @Override
            public void success(String result) {
            modelCallback.leftSuccess(result);
            }
        });
    }

    @Override
    public void getRightList(HashMap<String, String> params, final ModelCallback modelCallback) {
        OkhttpUtils.getInstance().doPost(UserApi.right_api, params, new OkhttpCallback() {
            @Override
            public void failure(String msg) {
                modelCallback.rightFailure(msg);
            }

            @Override
            public void success(String result) {
                modelCallback.rightSUccess(result);
            }
        });
    }
    public interface ModelCallback{
        void leftSuccess(String result);
        void rightSUccess(String result);
        void leftFailure(String error);
        void rightFailure(String error);
    }
}

presenter层


public class ListPresenter extends ListContract.IPresenter {
    private ListModel listModel;
    private ListContract.IView  iView;

    public ListPresenter(ListContract.IView iView) {
        listModel=new ListModel();
        this.iView = iView;
    }

    @Override
    public void getLeftList(HashMap<String, String> params) {
        listModel.getLeftList(params, new ListModel.ModelCallback() {
            @Override
            public void leftSuccess(String result) {
                Leftbean leftbean = new Gson().fromJson(result, Leftbean.class);
                List<Leftbean.databean> data = leftbean.data;
                iView.leftSucess(data);
            }

            @Override
            public void rightSUccess(String result) {

            }

            @Override
            public void leftFailure(String error) {

            }

            @Override
            public void rightFailure(String error) {

            }
        });
    }

    @Override
    public void getRightList(HashMap<String, String> params) {
        listModel.getRightList(params, new ListModel.ModelCallback() {
            @Override
            public void leftSuccess(String result) {

            }

            @Override
            public void rightSUccess(String result) {
                Rightbean json = new Gson().fromJson(result, Rightbean.class);
                List<Rightbean.databean> data = json.data;
                iView.rightSucess(data);
            }

            @Override
            public void leftFailure(String error) {

            }

            @Override
            public void rightFailure(String error) {

            }
        });
    }
}

工具类

ok的callback


public interface OkhttpCallback {
    void failure(String msg);//服务器请求失败:断网,服务器宕机等等因素
    void success(String result);//数据合法
}

工具类

public class OkhttpUtils {

    private Handler handler  = new Handler() ;

    private OkHttpClient okHttpClient;

    private static OkhttpUtils mInstance;//私有属性


    private OkhttpUtils() {//私有构造方法
        HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
        loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        okHttpClient = new OkHttpClient.Builder()
                .addInterceptor(loggingInterceptor)//添加日志拦截器
                .writeTimeout(5, TimeUnit.SECONDS)
                .connectTimeout(5, TimeUnit.SECONDS)
                .readTimeout(5, TimeUnit.SECONDS)
                .build();//链式调用,构建者模式


    }


    /**
     * 创建实例,双重检验锁,单例模式进行实例化
     *
     * @return
     */
    public static OkhttpUtils getInstance() {

        if (mInstance == null) {
            synchronized (OkhttpUtils.class) {
                if (mInstance == null) {
                    mInstance = new OkhttpUtils();
                }
            }
        }

        return mInstance;

    }

    /**
     * get请求方式
     */
    public void doGet(String url,HashMap<String, String> parmas, final OkhttpCallback requestCallback) {

        StringBuilder p = new StringBuilder();
        if (parmas!=null&&parmas.size()>0){
            for (Map.Entry<String, String> map : parmas.entrySet()) {

                p.append(map.getKey()).append("=").append(map.getValue()).append("&");
            }

            System.out.println("ppppppp===="+p.toString());
        }
        Request request = new Request.Builder().url(url+"?"+p.toString())
                .get().build();

        okHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                if (requestCallback != null) {
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            requestCallback.failure("网络异常");
                        }
                    });
                }
            }

            @Override
            public void onResponse(Call call, final Response response) throws IOException {
                final String result = response.body().string();
                if (requestCallback != null) {
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            requestCallback.success(result);

                        }
                    });
                }
            }
        });


    }

    /**
     * Post请求方式
     */
    public void doPost(String url, HashMap<String, String> parmas, final OkhttpCallback callback) {

        FormBody.Builder builder = new FormBody.Builder();

        for (Map.Entry<String, String> map : parmas.entrySet()) {
            builder.add(map.getKey(), map.getValue());

        }

        RequestBody requestBody = builder.build();

        Request request = new Request.Builder().url(url)
                .post(requestBody).build();

        okHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

                if (callback != null) {
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            callback.failure("网络异常");
                        }
                    });

                }

            }

            @Override
            public void onResponse(Call call, final Response response) throws IOException {

                if (callback != null) {
                    if (200 == response.code()) {
                        final String result = response.body().string();
                        handler.post(new Runnable() {
                            @Override
                            public void run() {
                                callback.success(result);
                            }
                        });

                    }
                }
            }
        });


    }

    /**
     * 上传头像,文件
     */
    public void uploadFile(String url, HashMap<String, Object> params, final OkhttpCallback okhttpCallback) {


        MultipartBody.Builder builder = new MultipartBody.Builder();
        builder.setType(MultipartBody.FORM);
        for (Map.Entry<String, Object> map : params.entrySet()) {
            String key = map.getKey();
            Object value = map.getValue();
            if (value instanceof File) {
                File file = (File) value;
                builder.addFormDataPart(key, file.getName(), RequestBody.create(MediaType.parse("image/*"), file));

            } else {
                builder.addFormDataPart(key, value.toString());
            }
        }
        Request request = new Request.Builder().url(url).post(builder.build()).build();
        okHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                if (okhttpCallback != null) {
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            okhttpCallback.failure("网络异常");
                        }
                    });
                }
            }

            @Override
            public void onResponse(Call call, final Response response) throws IOException {

                if (okhttpCallback != null) {
                    final String result = response.body().string();
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            okhttpCallback.success(result);
                        }
                    });
                }

            }
        });


    }

    /**
     * 取消所有请求,好处:节省开销:内存开销,cpu的开销(线程开销)
     */
    public void cancelAllTask() {
        if (okHttpClient != null) {
            okHttpClient.dispatcher().cancelAll();
        }
    }


}

三个RecycleView的适配器

第一个

public class Adapter_one extends RecyclerView.Adapter<Adapter_one.ViewHolder> {
    private Context context;
    private List<Leftbean.databean> list;

    public Adapter_one(Context context, List<Leftbean.databean> list) {
        this.context = context;
        this.list = list;
    }

    @NonNull
    @Override
    public Adapter_one.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(context).inflate(R.layout.item1, viewGroup, false);
        ViewHolder viewHolder=new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull final Adapter_one.ViewHolder viewHolder, int i) {
        final Leftbean.databean databean = list.get(i);
        viewHolder.name.setText(databean.name);
        viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int pos = viewHolder.getLayoutPosition();
                listener.onItemClickListener(viewHolder.itemView,pos);
            }
        });
        viewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                int pos = viewHolder.getLayoutPosition();
                listener.onItemLongClickListener(viewHolder.itemView,pos);
                return false;
            }
        });
    }

    @Override
    public int getItemCount() {
        return list==null?0:list.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        private final TextView name;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
             name = itemView.findViewById(R.id.name);
        }
    }
    public interface OnRecycleViewClickListener{
        void onItemClickListener(View view,int position);
        void onItemLongClickListener(View view,int position);
    }
    private OnRecycleViewClickListener listener;

    public void setListener(OnRecycleViewClickListener listener) {
        this.listener = listener;
    }
}

第二个


public class Adapter_two extends RecyclerView.Adapter<Adapter_two.ViewHolder> {
    private Context context;
    private List<Rightbean.databean> list;

    public Adapter_two(Context context, List<Rightbean.databean> list) {
        this.context = context;
        this.list = list;
    }
    @NonNull
    @Override
    public Adapter_two.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(context).inflate(R.layout.item2, viewGroup, false);
        ViewHolder viewHolder=new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull final Adapter_two.ViewHolder viewHolder, int i) {
        Rightbean.databean databean = list.get(i);
        final List<Rightbean.databean.userbean> list = databean.list;
        viewHolder.name.setText(databean.name);
        viewHolder.rv.setLayoutManager(new GridLayoutManager(context,3));
        final Adapter_three adapter3=new Adapter_three(context,list);
        viewHolder.rv.setAdapter(adapter3);
        adapter3.setListener(new Adapter_three.OnRecycleViewClickListener() {
            @Override
            public void onItemClickListener(View view, int position) {

            }

            @Override
            public void onItemLongClickListener(View view, int position) {
                list.remove(position);
                adapter3.notifyItemRemoved(position);
                adapter3.notifyItemRangeChanged(0,adapter3.getItemCount());
            }
        });
    }

    @Override
    public int getItemCount() {
        return list==null?0:list.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        private final TextView name;
        private final RecyclerView rv;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
             name = itemView.findViewById(R.id.name);
             rv = itemView.findViewById(R.id.rc_view);
        }
    }

}

第三个


public class Adapter_three extends RecyclerView.Adapter<Adapter_three.ViewHolder> {
    private Context context;
    private List<Rightbean.databean.userbean> list;

    public Adapter_three(Context context, List<Rightbean.databean.userbean> list) {
        this.context = context;
        this.list = list;
    }
    @NonNull
    @Override
    public Adapter_three.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(context).inflate(R.layout.item3, viewGroup, false);
        ViewHolder viewHolder=new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull final Adapter_three.ViewHolder viewHolder, int i) {
        Rightbean.databean.userbean userbean = list.get(i);
        viewHolder.name.setText(userbean.name);
        Glide.with(context).load(userbean.icon).into(viewHolder.iv);
        viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int pos = viewHolder.getLayoutPosition();
                listener.onItemClickListener(viewHolder.itemView,pos);
            }
        });
        viewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                int pos = viewHolder.getLayoutPosition();
                listener.onItemLongClickListener(viewHolder.itemView,pos);
                return false;
            }
        });
    }

    @Override
    public int getItemCount() {
        return list==null?0:list.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        private final ImageView iv;
        private final TextView name;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
             iv = itemView.findViewById(R.id.iv);
             name = itemView.findViewById(R.id.name);

        }
    }
    public interface OnRecycleViewClickListener{
        void onItemClickListener(View view,int position);
        void onItemLongClickListener(View view,int position);
    }
    private OnRecycleViewClickListener listener;

    public void setListener(OnRecycleViewClickListener listener) {
        this.listener = listener;
    }
}

以及适配器的布局文件


public class OneFragment extends Fragment implements ListContract.IView {
    private RecyclerView rv_left,rv_right;
    private String cid="1";
    private List<Leftbean.databean> list;
    private ListPresenter presenter;
    private Adapter_one adapter1;
    private Adapter_two adapter2;
    private HashMap<String, String> p2;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view=View.inflate(getActivity(),R.layout.frag01,null);
         rv_left = view.findViewById(R.id.rv_left);
        rv_right = view.findViewById(R.id.rv_right);
        return view;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        initData();
    }

    private void initData() {
        rv_left.setLayoutManager(new LinearLayoutManager(getActivity()));
        rv_right.setLayoutManager(new LinearLayoutManager(getActivity()));
        presenter=new ListPresenter(this);
        getLeft();
        presenter.getLeftList(new HashMap<String, String>());
    }

    private void getLeft() {
        list= new ArrayList<>();
        p2= new HashMap<>();
        p2.put("cid",cid);
        presenter.getRightList(p2);
    }

    @Override
    public void leftSucess(List<Leftbean.databean> leftbean) {
        if (adapter1==null){
             adapter1= new Adapter_one(getActivity(),leftbean);
             rv_left.setAdapter(adapter1);
             adapter1.setListener(new Adapter_one.OnRecycleViewClickListener() {
                 @Override
                 public void onItemClickListener(View view, int position) {
                    getLeft();
                 }

                 @Override
                 public void onItemLongClickListener(View view, int position) {

                 }
             });
        }else{
            adapter1.notifyDataSetChanged();
        }
    }

    @Override
    public void rightSucess(List<Rightbean.databean> rightbean) {
        adapter2= new Adapter_two(getActivity(),rightbean);
        rv_right.setAdapter(adapter2);
    }

    @Override
    public void leftFailure(String error) {

    }

    @Override
    public void rightFailure(String error) {

    }

    @Override
    public void onResume() {
        super.onResume();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值