安卓入门项目-模仿某商城day02-仿拼多多搜索页面多列表联动

一、效果

用左右两个RecyclerView实现:

二、核心代码

package com.alibaba.pinduoduo.controller.fragment;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.SimpleItemAnimator;

import com.alibaba.pinduoduo.R;
import com.alibaba.pinduoduo.controller.adapter.CategoryRecyclerViewAdapter;
import com.alibaba.pinduoduo.controller.adapter.TextViewRecyclerViewAdapter;
import com.alibaba.pinduoduo.model.bean.CategoryBean;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


public class SearchFragment extends Fragment {
    private static List specs;
    private RecyclerView rv_search_leftlist;
    private RecyclerView rv_search_rightlist;
    private static List categorys;
    private LinearLayoutManager rightLayoutManager;
    private int rightPosition;
    private int lastPosition = -1;
    private LinearLayoutManager leftLayoutManager;
    private TextView tv_search;
    private static String currentSpec = "";

    static {
        specs = new ArrayList();
        specs.addAll(Arrays.asList("水果", "百货", "食品", "女装", "鞋包", "手机", "内衣", "男装", "美妆", "母婴", "家电", "运动", "科技", "电脑", "健康", "充值"));

        categorys = new ArrayList<>();
        categorys.add(new CategoryBean("水果", new int[]{R.drawable.search_spec01_001, R.drawable.search_spec01_002, R.drawable.search_spec01_003, R.drawable.search_spec01_004, R.drawable.search_spec01_005, R.drawable.search_spec01_006, R.drawable.search_spec01_007, R.drawable.search_spec01_008, R.drawable.search_spec01_009}, new String[]{"新鲜水果", "蛋及蛋制品", "海鲜水产", "品质肉禽", "瓜果桃梨", "热带水果", "熟食凉菜", "新果尝鲜", "蔬菜及制品"}));
        categorys.add(new CategoryBean("百货", new int[]{R.drawable.search_spec02_001, R.drawable.search_spec02_002, R.drawable.search_spec02_003, R.drawable.search_spec02_004, R.drawable.search_spec02_005, R.drawable.search_spec02_006, R.drawable.search_spec02_007, R.drawable.search_spec02_008}, new String[]{"图书教育", "日用百货", "个护洗浴", "鲜花绿植", "餐具茶具", "洗衣清洁", "烹饪用具", "纸品湿巾"}));
        categorys.add(new CategoryBean("食品", new int[]{R.drawable.search_spec03_001, R.drawable.search_spec03_002, R.drawable.search_spec03_003, R.drawable.search_spec03_004, R.drawable.search_spec03_005, R.drawable.search_spec03_006, R.drawable.search_spec03_007, R.drawable.search_spec03_008, R.drawable.search_spec03_009}, new String[]{"饼干膨化", "糕点点心", "地方特产", "无辣不欢", "麦片谷物", "坚果炒货", "汤粥罐头", "豆干辣条", "肉干肉脯", "牛奶酸奶"}));

        categorys.add(new CategoryBean("女装", new int[]{R.drawable.search_spec01_001, R.drawable.search_spec01_002, R.drawable.search_spec01_003, R.drawable.search_spec01_004, R.drawable.search_spec01_005, R.drawable.search_spec01_006, R.drawable.search_spec01_007, R.drawable.search_spec01_008, R.drawable.search_spec01_009}, new String[]{"新鲜水果", "蛋及蛋制品", "海鲜水产", "品质肉禽", "瓜果桃梨", "热带水果", "熟食凉菜", "新果尝鲜", "蔬菜及制品"}));
        categorys.add(new CategoryBean("鞋包", new int[]{R.drawable.search_spec02_001, R.drawable.search_spec02_002, R.drawable.search_spec02_003, R.drawable.search_spec02_004, R.drawable.search_spec02_005, R.drawable.search_spec02_006, R.drawable.search_spec02_007, R.drawable.search_spec02_008}, new String[]{"图书教育", "日用百货", "个护洗浴", "鲜花绿植", "餐具茶具", "洗衣清洁", "烹饪用具", "纸品湿巾"}));
        categorys.add(new CategoryBean("手机", new int[]{R.drawable.search_spec03_001, R.drawable.search_spec03_002, R.drawable.search_spec03_003, R.drawable.search_spec03_004, R.drawable.search_spec03_005, R.drawable.search_spec03_006, R.drawable.search_spec03_007, R.drawable.search_spec03_008, R.drawable.search_spec03_009}, new String[]{"饼干膨化", "糕点点心", "地方特产", "无辣不欢", "麦片谷物", "坚果炒货", "汤粥罐头", "豆干辣条", "肉干肉脯", "牛奶酸奶"}));
        categorys.add(new CategoryBean("内衣", new int[]{R.drawable.search_spec01_001, R.drawable.search_spec01_002, R.drawable.search_spec01_003, R.drawable.search_spec01_004, R.drawable.search_spec01_005, R.drawable.search_spec01_006, R.drawable.search_spec01_007, R.drawable.search_spec01_008, R.drawable.search_spec01_009}, new String[]{"新鲜水果", "蛋及蛋制品", "海鲜水产", "品质肉禽", "瓜果桃梨", "热带水果", "熟食凉菜", "新果尝鲜", "蔬菜及制品"}));
        categorys.add(new CategoryBean("男装", new int[]{R.drawable.search_spec02_001, R.drawable.search_spec02_002, R.drawable.search_spec02_003, R.drawable.search_spec02_004, R.drawable.search_spec02_005, R.drawable.search_spec02_006, R.drawable.search_spec02_007, R.drawable.search_spec02_008}, new String[]{"图书教育", "日用百货", "个护洗浴", "鲜花绿植", "餐具茶具", "洗衣清洁", "烹饪用具", "纸品湿巾"}));
        categorys.add(new CategoryBean("美妆", new int[]{R.drawable.search_spec03_001, R.drawable.search_spec03_002, R.drawable.search_spec03_003, R.drawable.search_spec03_004, R.drawable.search_spec03_005, R.drawable.search_spec03_006, R.drawable.search_spec03_007, R.drawable.search_spec03_008, R.drawable.search_spec03_009}, new String[]{"饼干膨化", "糕点点心", "地方特产", "无辣不欢", "麦片谷物", "坚果炒货", "汤粥罐头", "豆干辣条", "肉干肉脯", "牛奶酸奶"}));
        categorys.add(new CategoryBean("母婴", new int[]{R.drawable.search_spec01_001, R.drawable.search_spec01_002, R.drawable.search_spec01_003, R.drawable.search_spec01_004, R.drawable.search_spec01_005, R.drawable.search_spec01_006, R.drawable.search_spec01_007, R.drawable.search_spec01_008, R.drawable.search_spec01_009}, new String[]{"新鲜水果", "蛋及蛋制品", "海鲜水产", "品质肉禽", "瓜果桃梨", "热带水果", "熟食凉菜", "新果尝鲜", "蔬菜及制品"}));
        categorys.add(new CategoryBean("家电", new int[]{R.drawable.search_spec02_001, R.drawable.search_spec02_002, R.drawable.search_spec02_003, R.drawable.search_spec02_004, R.drawable.search_spec02_005, R.drawable.search_spec02_006, R.drawable.search_spec02_007, R.drawable.search_spec02_008}, new String[]{"图书教育", "日用百货", "个护洗浴", "鲜花绿植", "餐具茶具", "洗衣清洁", "烹饪用具", "纸品湿巾"}));
        categorys.add(new CategoryBean("运动", new int[]{R.drawable.search_spec02_001, R.drawable.search_spec02_002, R.drawable.search_spec02_003, R.drawable.search_spec02_004, R.drawable.search_spec02_005, R.drawable.search_spec02_006, R.drawable.search_spec02_007, R.drawable.search_spec02_008}, new String[]{"图书教育", "日用百货", "个护洗浴", "鲜花绿植", "餐具茶具", "洗衣清洁", "烹饪用具", "纸品湿巾"}));
        categorys.add(new CategoryBean("科技", new int[]{R.drawable.search_spec03_001, R.drawable.search_spec03_002, R.drawable.search_spec03_003, R.drawable.search_spec03_004, R.drawable.search_spec03_005, R.drawable.search_spec03_006, R.drawable.search_spec03_007, R.drawable.search_spec03_008, R.drawable.search_spec03_009}, new String[]{"饼干膨化", "糕点点心", "地方特产", "无辣不欢", "麦片谷物", "坚果炒货", "汤粥罐头", "豆干辣条", "肉干肉脯", "牛奶酸奶"}));
        categorys.add(new CategoryBean("电脑", new int[]{R.drawable.search_spec01_001, R.drawable.search_spec01_002, R.drawable.search_spec01_003, R.drawable.search_spec01_004, R.drawable.search_spec01_005, R.drawable.search_spec01_006, R.drawable.search_spec01_007, R.drawable.search_spec01_008, R.drawable.search_spec01_009}, new String[]{"新鲜水果", "蛋及蛋制品", "海鲜水产", "品质肉禽", "瓜果桃梨", "热带水果", "熟食凉菜", "新果尝鲜", "蔬菜及制品"}));
        categorys.add(new CategoryBean("健康", new int[]{R.drawable.search_spec03_001, R.drawable.search_spec03_002, R.drawable.search_spec03_003, R.drawable.search_spec03_004, R.drawable.search_spec03_005, R.drawable.search_spec03_006, R.drawable.search_spec03_007, R.drawable.search_spec03_008, R.drawable.search_spec03_009}, new String[]{"饼干膨化", "糕点点心", "地方特产", "无辣不欢", "麦片谷物", "坚果炒货", "汤粥罐头", "豆干辣条", "肉干肉脯", "牛奶酸奶"}));
        categorys.add(new CategoryBean("充值", new int[]{R.drawable.search_spec01_001, R.drawable.search_spec01_002, R.drawable.search_spec01_003, R.drawable.search_spec01_004, R.drawable.search_spec01_005, R.drawable.search_spec01_006, R.drawable.search_spec01_007, R.drawable.search_spec01_008, R.drawable.search_spec01_009}, new String[]{"新鲜水果", "蛋及蛋制品", "海鲜水产", "品质肉禽", "瓜果桃梨", "热带水果", "熟食凉菜", "新果尝鲜", "蔬菜及制品"}));


    }


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.frag_search, container, false);
        initView(view);

        //为左边RecyclerView设置适配器
        TextViewRecyclerViewAdapter leftRecyclerViewAdapter = new TextViewRecyclerViewAdapter(specs);
        leftLayoutManager = new LinearLayoutManager(getActivity(), RecyclerView.VERTICAL, false);
        rv_search_leftlist.setLayoutManager(leftLayoutManager);
        rv_search_leftlist.setAdapter(leftRecyclerViewAdapter);

        //为左边RecyclerView的适配器设置监听,当左边点击了某个item,右边RecyclerView对应的item置顶
        leftRecyclerViewAdapter.setOnItemClickListener(new TextViewRecyclerViewAdapter.OnRecyclerViewItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                String spec = specs.get(position);
                rightLayoutManager.scrollToPositionWithOffset(position, 0);
                Toast.makeText(getActivity(), spec, Toast.LENGTH_SHORT).show();

                rightPosition = position - leftLayoutManager.findFirstVisibleItemPosition();
//                leftDeHighlight(lastPosition);//发现点完item再滑动左边RecyclerView,上个位置会失效

                //对上个位置取消高亮,暂时只能全部更改
                for (int i = leftLayoutManager.findFirstVisibleItemPosition(); i <= leftLayoutManager.findLastVisibleItemPosition(); i++) {
                    leftDeHighlight(i - leftLayoutManager.findFirstVisibleItemPosition());
                }
                leftHighlight(rightPosition);

            }
        });


        //为左边设置滚动监听
        rv_search_leftlist.setOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                leftDeHighlightAll();
            }
        });

        ((SimpleItemAnimator) rv_search_rightlist.getItemAnimator()).setSupportsChangeAnimations(false);
        ((SimpleItemAnimator) rv_search_leftlist.getItemAnimator()).setSupportsChangeAnimations(false);


        //为右边RecyclerView设置适配器
        CategoryRecyclerViewAdapter categoryRecyclerViewAdapter = new CategoryRecyclerViewAdapter(getActivity(), categorys);
        rightLayoutManager = new LinearLayoutManager(getActivity(), RecyclerView.VERTICAL, false);
        rv_search_rightlist.setLayoutManager(rightLayoutManager);
        rv_search_rightlist.setAdapter(categoryRecyclerViewAdapter);


        //为右边RecyclerView设置滚动监听
        rv_search_rightlist.setOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                rightPosition = (rightLayoutManager.findFirstVisibleItemPosition() + rightLayoutManager.findLastVisibleItemPosition()) / 2;

                //如果已经滚动到顶部,那么应该让右边第一个item对应的左侧item高亮
                if (!rv_search_rightlist.canScrollVertically(-1)) {
                    rightPosition = rightLayoutManager.findFirstVisibleItemPosition();
                }
                //如果已经滚动到底部,那么应该让右边最后一个item对应的左侧item高亮
                if (!rv_search_rightlist.canScrollVertically(1)) {
                    rightPosition = rightLayoutManager.findLastVisibleItemPosition();
                }


                leftSlide(rightPosition);//左边滑动

                rightPosition = rightPosition - leftLayoutManager.findFirstVisibleItemPosition();
                //滚动如果切换到新的种类
                if (lastPosition != rightPosition) {
                    //获取右边rightPosition位置的item所对应的左侧item,并高亮显示
                    leftHighlight(rightPosition);

                    //记得把左边上一个高亮显示过的item取消高亮显示                
                    leftDeHighlightAll();

                }
                lastPosition = rightPosition;

            }
        });

        return view;
    }

    //根据文本内容取消高亮显示
    private void leftDeHighlightAll() {
        for (int i = leftLayoutManager.findFirstVisibleItemPosition(); i <= leftLayoutManager.findLastVisibleItemPosition(); i++) {
            int j = i - leftLayoutManager.findFirstVisibleItemPosition();
            Object obj = leftLayoutManager.getChildAt(j);
            if (null != obj && !("".equals(currentSpec))) {
                TextView tv = (TextView) obj;
                if (!tv.getText().toString().equals(currentSpec)) {
                    leftDeHighlight(j);
                } else {
                    leftHighlight(j);
                }

            }
        }
    }


    private void initView(View view) {
        rv_search_leftlist = view.findViewById(R.id.lv_search_leftlist);
        rv_search_rightlist = view.findViewById(R.id.rv_search_rightlist);
        tv_search = view.findViewById(R.id.tv_search);
    }

    //左边ListView滑动到相应的位置
    private void leftSlide(final int pos) {
        if (pos < leftLayoutManager.findFirstCompletelyVisibleItemPosition() || pos > leftLayoutManager.findLastCompletelyVisibleItemPosition())
            leftLayoutManager.scrollToPositionWithOffset(pos, 0);
    }

    //高亮显示
    private void leftHighlight(int pos) {
        if (null != rv_search_leftlist.getChildAt(pos)) {
            TextView leftView = (TextView) rv_search_leftlist.getChildAt(pos);
            currentSpec = leftView.getText().toString();//记录下被选中的种类的文本
            leftView.setTextColor(getResources().getColor(R.color.red));
            leftView.setBackgroundColor(getResources().getColor(android.R.color.white));
            tv_search.setText(currentSpec);
        }
    }

    //取消高亮显示
    private void leftDeHighlight(int pos) {
        if (null != rv_search_leftlist.getChildAt(pos)) {
            TextView tv_search_leftlist_item = (TextView) rv_search_leftlist.getChildAt(pos);
            tv_search_leftlist_item.setTextColor(getResources().getColor(R.color.bg_Black));
            tv_search_leftlist_item.setBackgroundColor(getResources().getColor(R.color.bg_Gray_light));
        }
    }


}

 

你可能感兴趣的:(安卓)