元旦刚过去。有一年不知道一年都干了什么。就这么过去了,反正没事就把以前的东西总结一下吧。以后使用起来也能直接粘贴复制
首先我先将是我使用的库贡献出来供大家使用:
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(); } }); }这个地方就是一个页面跳转的情况,如果这个看不懂的话可以评论。我会进行一些修改和论述。希望大神进行指点。共同学习