recycleview改变条目的颜色并加载字条目

博客介绍了如何利用BaseRecyclerViewAdapterHelper库在RecycleView中实现点击父条目时改变条目颜色,并加载子条目数据。详细讲解了项目需求、实现步骤和关键代码,包括初始化数据、子adapter的创建以及点击事件的处理。通过接口回调,实现了在页面加载时自动触发第一条目的颜色变化和子条目数据加载。

元旦刚过去。有一年不知道一年都干了什么。就这么过去了,反正没事就把以前的东西总结一下吧。以后使用起来也能直接粘贴复制

首先我先将是我使用的库贡献出来供大家使用:

https://github.com/CymChad/BaseRecyclerViewAdapterHelper/wiki/%E9%A6%96%E9%A1%B5 

这个库是自己感觉是很好用的。里面基本都能够实现你想要的东西。好了下面上代码:

xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_service_navigation_two"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:orientation="vertical">

    <include layout="@layout/item_title_one" />

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:id="@+id/ll_navigation_rv"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginTop="8dp"
            android:orientation="horizontal">

            <android.support.v7.widget.RecyclerView
                android:id="@+id/rv_navigation_title"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1" />

            <android.support.v7.widget.RecyclerView
                android:id="@+id/rv_navigation_content"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1" />
        </LinearLayout>

        <include layout="@layout/item_net_404" />
        <include layout="@layout/item_net_no"/>
    </RelativeLayout>
</LinearLayout>
adapter:(第一级)

package com.shifanghuihai.customer.mvp.views.adapter;

import android.support.annotation.LayoutRes;
import android.support.annotation.Nullable;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.shifanghuihai.customer.Base.BaseApplication;
import com.shifanghuihai.customer.R;
import com.shifanghuihai.customer.mvp.model.bean.ClassesBean;
import com.shifanghuihai.customer.mvp.model.bean.NavigationTwoBean;
import com.shifanghuihai.customer.util.GlideCircleTransform;

import java.util.List;

/**
 * Created by Administrator on 2017/11/14.
 */

public class GuideTitleAdapter extends BaseQuickAdapter<ClassesBean.DataBean, BaseViewHolder> {
    public GuideTitleAdapter(@LayoutRes int layoutResId, @Nullable List<ClassesBean.DataBean> data) {
        super(layoutResId, data);
    }

    @Override
    protected void convert(BaseViewHolder helper, ClassesBean.DataBean item) {
        helper.setText(R.id.tv_navigation_content,item.getServiceItemName());
        //加载图片
        Glide.with(BaseApplication.getContext())
                .load(item.getServiceItemPic())
                .placeholder(R.drawable.img_loading)
                .bitmapTransform(new GlideCircleTransform(BaseApplication.getContext()))
                .into((ImageView) helper.getView(R.id.iv_navigation_head));

        //回调数据
        int position = helper.getPosition();
        if(position == 0 && onClickFirstView != null){
            onClickFirstView.showFirstView((RelativeLayout) helper.getView(R.id.rl_navigation));
        }
    }

    /**
     * 获取第一个item的tv
     */
    public interface OnClickFirstView {
        void showFirstView(RelativeLayout rlFirst);
    }

    //设置内部回调接口
    private OnClickFirstView onClickFirstView;

    public void setOnClickFirstView(OnClickFirstView onClickFirstView) {
        this.onClickFirstView = onClickFirstView;
    }
}

这个地方需要叙述一下。项目需求是点击父条目。条目颜色改变,然后重新加载字条目的数据。

如果想要完成这个需要,应该考虑的有:

1.我进入页面的时候第一个条目应该变色同时字条目应该加载出来。

2.当我进入页面后我点击父条目的时候能够将第一个条目颜色改变,同时字条目数据改变。

3.如果我想要对点击条目进行记录和绑定的话。我需要记录我每次点击的位置,(将点击位置和集合位置进行统一)

现在讲你的需要考虑清楚了下面就要实现你分析的步骤了。如果想要在进入页面的时候将条目变色和加载字条目那么就需要进入页面就通知条目进行触发。同时需要将第一个条目的view(我这个地方仅仅有个子view textview)给传递到activity中(因为我当前的布局卸载activity中。如果你写在fragment中就如要传递到fragment中)供你点击其他条目的时候改变颜色,因此我这个地方写了接口回调

,回调的作用就是将第一个条目点击的textview传递给activity。供以后改变颜色使用。在adapter中我改变条目颜色是根据位置进行判定的

//回调数据
int position = helper.getPosition();
if(position == 0 && onClickFirstView != null){
    onClickFirstView.showFirstView((RelativeLayout) helper.getView(R.id.rl_navigation));
}
如果你需要实现第3个需求需要传递个adapter一个位置参数。这个地方的0就替换为你传递的位子参数。接口完成后我们就在activity中初始化数据后进行接口的回调,

/**
 * 父类监听
 */
private int parentPosition = 0;//点击父类的位置。默认为0

private void parentListener() {
    //回调数据
    guideTitleAdapter.setOnClickFirstView(new GuideTitleAdapter.OnClickFirstView() {
        @Override
        public void showFirstView(RelativeLayout rlFirst) {
            rlFirst.setBackgroundDrawable(getResources().getDrawable(R.drawable.ract_white));
            oldRl = rlFirst;
        }
    });
parentPosition是为了记录你点击的位置。如果你有需要满足第三个需要需要将这个位置进行记录。这个地方就是设置回调获取到第一个条目的view这个地方我获取的是relativeLayout。由于我的需要是改变背景边框。如果你需要不同。可以返还的View或者其他子view.回调里面的第一句话是改变颜色。第二行是记录子view.并设置为全局变量供以后使用。

初始话数据:

@Override
public void getNetDate(Serializable serializable) {
    ClassesBean classesBean = (ClassesBean) serializable;
    data = classesBean.getData();
    rvNavigationTitle.setLayoutManager(new LinearLayoutManager(this));
    guideTitleAdapter = new GuideTitleAdapter(R.layout.item_navigation_title, data);
    rvNavigationTitle.setAdapter(guideTitleAdapter);

    if (data.size() > 0) {//当存在字条目的时候才进行显示加载
        //显示字条目的数据
        List<ClassesBean.DataBean.ListBean> list = data.get(0).getList();//获取到第一条数据关于字条目的集合
        if (data.get(0).getList() != null) {
            childList.addAll(list);
        }
        rvNavigationContent.setLayoutManager(new LinearLayoutManager(this));

        stringAdapter = new NavigationStringAdapter(R.layout.item_navigation_content, childList);

        rvNavigationContent.setAdapter(stringAdapter);

        setChildClicked();
    }
    parentListener();
}
我这个地方是请求的网络如果你需要可改成模拟数据也是同样的。setchildClidked是对字条目的点击事件。

子adapter:

package com.shifanghuihai.customer.mvp.views.adapter;

import android.support.annotation.LayoutRes;
import android.support.annotation.Nullable;
import android.view.View;

import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.shifanghuihai.customer.R;
import com.shifanghuihai.customer.mvp.model.bean.ClassesBean;

import java.util.List;

/**
 * Created by Administrator on 2017/11/14.
 */

public class NavigationStringAdapter extends BaseQuickAdapter<ClassesBean.DataBean.ListBean,BaseViewHolder> {
    public NavigationStringAdapter(@LayoutRes int layoutResId, @Nullable List<ClassesBean.DataBean.ListBean> data) {
        super(layoutResId, data);
    }

    @Override
    protected void convert(BaseViewHolder helper, ClassesBean.DataBean.ListBean item) {
        int position = helper.getPosition();
        if(position == 0){
            helper.getView(R.id.view_content).setVisibility(View.GONE);
        }
        helper.setText(R.id.tv_content_name,item.getServiceName());
    }
}

完整的parentListener:

 private void parentListener() {
        //回调数据
        guideTitleAdapter.setOnClickFirstView(new GuideTitleAdapter.OnClickFirstView() {
            @Override
            public void showFirstView(RelativeLayout rlFirst) {
                rlFirst.setBackgroundDrawable(getResources().getDrawable(R.drawable.ract_white));
                oldRl = rlFirst;
            }
        });
        //设置点击事件
        guideTitleAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
                parentPosition = position;//记录位置
//                ToastUtil.show(ServiceNavigationTwoActivity.this,"点击了。。。");
                //改变背景颜色
                oldRl.setBackgroundDrawable(getResources().getDrawable(R.drawable.ract_white_gray));
                RelativeLayout rlNew = view.findViewById(R.id.rl_navigation);
                rlNew.setBackgroundDrawable(getResources().getDrawable(R.drawable.ract_white));
                oldRl = rlNew;
                //刷新数据,首先将数据清空。如果是赋值的话就改变了指针的指向地址。
                // 就无法刷新数据。所以在保存当前地址的同时将更新数据添加到集合中
                childList.clear();
                if (data.get(position) != null) {
                    childList.addAll(data.get(position).getList());
                }
                if (stringAdapter != null) {
                    stringAdapter.notifyDataSetChanged();
                } else {
                    stringAdapter = new NavigationStringAdapter(R.layout.item_navigation_content, childList);
                    rvNavigationContent.setAdapter(stringAdapter);
                }
            }
        });
    }
这个里面包含接口的回调和点击条目改变颜色和改变字条目的数据操作。

下面是子条目的点击事件:

private void setChildClicked() {
    stringAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
        @Override
        public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
            ToastUtil.show(ServiceNavigationTwoActivity.this, "点击了");
            //todo 首先注释了
            Intent intent = new Intent();
            intent.putExtra("id", data.get(parentPosition).getList().get(position).getType());
            setResult(100, intent);
            finish();
        }
    });
}
这个地方就是一个页面跳转的情况,如果这个看不懂的话可以评论。我会进行一些修改和论述。希望大神进行指点。共同学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值