一、效果
用左右两个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));
}
}
}