Android 商品筛选功能实现

Android 商品筛选功能实现

前段时间做了个网上商城项目,里面含有类似京东商品搜索功能,感觉此功能普遍适用所有在此贴出实现步骤

先看效果

Android 商品筛选功能实现_第1张图片

主页面的布局

Android 商品筛选功能实现_第2张图片

由于布局简单,就不多啰嗦了,只是在外面放了一个 DrawerLayout 布局,让筛选页面作为 DrawerLayout 的一个菜单页显示。

筛选页面布局


<RelativeLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent">

  <LinearLayout
    android:id="@+id/bottom_parent"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:orientation="horizontal">

    <TextView
      android:id="@+id/reset_btn"
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:layout_weight="1.0"
      android:paddingTop="13dp"
      android:paddingBottom="13dp"
      android:background="@color/white_f4"
      android:gravity="center"
      android:text="重置"
      android:textColor="@color/gray"
      android:textSize="@dimen/content_text_size_14"/>

    <TextView
      android:id="@+id/confirm_btn"
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:layout_weight="1.0"
      android:paddingTop="13dp"
      android:paddingBottom="13dp"
      android:background="@color/talk_text_red"
      android:gravity="center"
      android:text="确定"
      android:textColor="@color/white"
      android:textSize="@dimen/content_text_size_14"/>
  LinearLayout>

  <ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_above="@id/bottom_parent">

    <LinearLayout
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:orientation="vertical">

      <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="20dp"
        android:paddingBottom="8dp"
        android:paddingStart="15dp"
        android:paddingEnd="15dp"
        android:orientation="vertical">

        <LinearLayout
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:orientation="horizontal">

          <LinearLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1.0"
            android:layout_gravity="center">

            <com.mylinkbuy.android.view.TagWidget
              android:id="@+id/tag1"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"/>
          LinearLayout>

          <LinearLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1.0"
            android:layout_gravity="center">

            <com.mylinkbuy.android.view.TagWidget
              android:id="@+id/tag2"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"/>
          LinearLayout>

          <LinearLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1.0"
            android:layout_gravity="center">

            <com.mylinkbuy.android.view.TagWidget
              android:id="@+id/tag3"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"/>
          LinearLayout>
        LinearLayout>

        <com.mylinkbuy.android.view.TagWidget
          android:id="@+id/tag4"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_marginTop="15dp"/>
      LinearLayout>

      <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="@color/line_color_grey"/>

      <LinearLayout
        android:id="@+id/address_parent"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="8dp"
        android:paddingBottom="8dp"
        android:paddingStart="15dp"
        android:paddingEnd="0dp"
        android:background="@drawable/white_buttom"
        android:baselineAligned="false"
        android:gravity="center_vertical"
        android:orientation="horizontal">

        <LinearLayout
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:gravity="center_vertical"
          android:orientation="horizontal">

          <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="配送至"
            android:textColor="@color/blacking"
            android:textSize="@dimen/content_text_size_14"/>

          <ImageView
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:layout_marginStart="20dp"
            android:layout_gravity="center_vertical"
            android:contentDescription="@string/app_name"
            android:src="@mipmap/icon_location_small"/>
        LinearLayout>


        <RelativeLayout
          android:layout_width="0dp"
          android:layout_height="wrap_content"
          android:layout_weight="1.0"
          android:layout_marginStart="10dp"
          android:layout_gravity="center_vertical"
          android:gravity="center_vertical"
          android:orientation="horizontal">

          <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentEnd="true"
            android:layout_centerVertical="true"
            android:padding="8dp"
            android:contentDescription="@string/app_name"
            android:src="@mipmap/more_icon"/>

          <TextView
            android:id="@+id/location_txv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginEnd="30dp"
            android:layout_gravity="center_vertical"
            android:padding="4dp"
            android:lines="1"
            android:text="上海市 青浦区 徐泾镇"
            android:textColor="@color/talk_text_red"
            android:textSize="12sp"/>
        RelativeLayout>
      LinearLayout>

      <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="13dp"
        android:paddingBottom="13dp"
        android:paddingStart="13dp"
        android:paddingEnd="13dp"
        android:background="@color/white"
        android:gravity="center_vertical"
        android:orientation="horizontal">

        <TextView
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="价格区间"
          android:textColor="@color/black"
          android:textSize="@dimen/content_text_size_14"/>

        <RelativeLayout
          android:layout_width="0dp"
          android:layout_height="wrap_content"
          android:layout_weight="1.0"
          android:layout_marginStart="10dp"
          android:layout_marginEnd="10dp">

          <EditText
            android:id="@+id/min_price_edt"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentStart="true"
            android:paddingTop="4dp"
            android:paddingBottom="4dp"
            android:paddingStart="13dp"
            android:paddingEnd="13dp"
            android:background="@drawable/shape_gray"
            android:hint="最低价"
            android:inputType="numberDecimal"
            android:lines="1"
            android:maxEms="6"
            android:maxLength="6"
            android:textColor="@color/black"
            android:textColorHint="@color/gray"
            android:textSize="@dimen/content_text_size_12"/>

          <EditText
            android:id="@+id/max_price_edt"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentEnd="true"
            android:paddingTop="4dp"
            android:paddingBottom="4dp"
            android:paddingStart="13dp"
            android:paddingEnd="13dp"
            android:background="@drawable/shape_gray"
            android:hint="最高价"
            android:inputType="numberDecimal"
            android:lines="1"
            android:maxEms="6"
            android:maxLength="6"
            android:textColor="@color/black"
            android:textColorHint="@color/gray"
            android:textSize="@dimen/content_text_size_12"/>

          <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text=""/>

        RelativeLayout>

      LinearLayout>

      <ListView
        android:id="@+id/filter_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="8dp"
        android:layout_marginStart="15dp"
        android:layout_marginEnd="15dp"
        android:scrollbars="none"/>
    LinearLayout>

  ScrollView>
RelativeLayout>

TagWidget 控件实现

该控件用于显示筛选页面各个筛选条件,当点击标签时,其状态改变。该控件对外抛出的方法都给与了说明,都很简单。

package com.mylinkbuy.android.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.mylinkbuy.android.R;

/**
 * **********************************************
 * 

* Date: 2018-01-30 22:07 *

* Author: SinPingWu *

* Email: [email protected] *

* brief: 标签控件 *

* history: *

* ********************************************** */ public class TagWidget extends LinearLayout { private ImageView mImg; private TextView mTxv; private boolean isSelected = false; private float mDensity = 1.0f; public TagWidget(Context context) { super(context); initView(); } public TagWidget(Context context, @Nullable AttributeSet attrs) { super(context, attrs); initView(); } public TagWidget(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initView(); } private void initView() { setOrientation(HORIZONTAL); setGravity(Gravity.CENTER); mDensity = getScreenDensity(); setMinimumHeight((int) mDensity * 28); setMinimumWidth((int) mDensity * 80); setBackgroundResource(R.drawable.shape_gray); mImg = new ImageView(getContext()); mImg.setScaleType(ScaleType.CENTER_INSIDE); mImg.setImageResource(R.mipmap.ic_check); mImg.setVisibility(View.GONE); addView(mImg); mTxv = new TextView(getContext()); mTxv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12); mTxv.setTextColor(Color.GRAY); mTxv.setGravity(Gravity.CENTER); mTxv.setText(""); addView(mTxv); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); LinearLayout.LayoutParams parentParams = (LayoutParams) getLayoutParams(); parentParams.width = (int) mDensity * 80; parentParams.height = (int) mDensity * 28; setLayoutParams(parentParams); LinearLayout.LayoutParams params = (LayoutParams) mImg.getLayoutParams(); params.setMarginEnd((int) mDensity * 4); mImg.setLayoutParams(params); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); } /** * 切换标签选中状态 */ public void toggle() { isSelected = !isSelected; if (isSelected) { mImg.setVisibility(View.VISIBLE); mTxv.setTextColor(Color.RED); setBackgroundResource(R.drawable.shape_red); } else { mImg.setVisibility(View.GONE); mTxv.setTextColor(Color.GRAY); setBackgroundResource(R.drawable.shape_gray); } } /** * 获取标签里面的内容 */ public String getContent() { return mTxv == null ? "" : mTxv.getText().toString().trim(); } /** * 设置标签内容 */ public void setContent(String content) { mTxv.setText(content); } /** * 设置标签内容 * * @param res 内容对应的资源地址 */ public void setContent(int res) { mTxv.setText(getContext().getString(res)); } /** * 获取标签的选中状态 * * @return 如果选中返回 true,否则返回 false。 */ public boolean getStatus() { return isSelected; } private float getScreenDensity() { WindowManager manager = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE); DisplayMetrics dm = new DisplayMetrics(); manager.getDefaultDisplay().getMetrics(dm); return dm.density; } }

筛选功能实现

该类与适配器结合实现筛选功能。setMenuData()用于设置筛选菜单内容,getFilter()用于获取筛选项。

package com.mylinkbuy.android.fragment;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.GridView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;
import com.mylinkbuy.android.R;
import com.mylinkbuy.android.adapter.GoodsMenuAdapter;
import com.mylinkbuy.android.adapter.GoodsMenuAdapter.ViewHolder;
import com.mylinkbuy.android.adapter.GoodsSubMenuAdapter;
import com.mylinkbuy.android.callback.OnAdapterDataNotifiedListener;
import com.mylinkbuy.android.model.GoodsFilterInfo;
import com.mylinkbuy.android.model.GoodsFilterInfo.Brand;
import com.mylinkbuy.android.model.GoodsFilterInfo.Spec;
import com.mylinkbuy.android.utils.ScreenUtil;
import com.mylinkbuy.android.view.TagWidget;
import java.util.ArrayList;
import java.util.HashMap;

/**
 * **********************************************
 * 

* Date: 2018-01-30 22:58 *

* Author: SinPingWu *

* Email: [email protected] *

* brief: 商品列表的过滤页面 *

* history: *

* ********************************************** */ public class GoodsMenuFragment extends Fragment implements OnAdapterDataNotifiedListener, OnClickListener { private TagWidget[] mTAGWidget; private TextView mLocationTxv; private EditText mMinPriceEdt, mMaxPriceEdt; private ListView mListView; private GoodsMenuAdapter mMenuAdapter; private GoodsFilterInfo mGoodsFilterInfo; private OnGoodsSearchListener mGoodsSearchCallback; public static final String SEPARATOR = "@"; public interface OnGoodsSearchListener { /** * 根据过滤条件进行商品搜索。 * * supplier:供应商,供应商1@供应商2. * price:价格区间,低价@高价. * spec: 参数,spec1@spec2 * brand: 品牌,brand1@brand2 */ void onFilterCompleted(); } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.goods_filter_menu, container, false); } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); initView(view); } public void setSearchCallbackListener(OnGoodsSearchListener callbackListener) { this.mGoodsSearchCallback = callbackListener; } /** * 设置菜单的内容 * * @param goodsFilterInfo 菜单内容所持有的数据类型。 */ public void setMenuData(GoodsFilterInfo goodsFilterInfo) { this.mGoodsFilterInfo = goodsFilterInfo; mMenuAdapter.setData(mGoodsFilterInfo); } private void initView(View view) { mTAGWidget = new TagWidget[4]; mTAGWidget[0] = (TagWidget) view.findViewById(R.id.tag1); mTAGWidget[1] = (TagWidget) view.findViewById(R.id.tag2); mTAGWidget[2] = (TagWidget) view.findViewById(R.id.tag3); mTAGWidget[3] = (TagWidget) view.findViewById(R.id.tag4); mLocationTxv = (TextView) view.findViewById(R.id.location_txv); mMinPriceEdt = (EditText) view.findViewById(R.id.min_price_edt); mMaxPriceEdt = (EditText) view.findViewById(R.id.max_price_edt); mListView = (ListView) view.findViewById(R.id.filter_list); mMenuAdapter = new GoodsMenuAdapter(getContext(), mGoodsFilterInfo); mMenuAdapter.setDataNotifyListener(this); mListView.setAdapter(mMenuAdapter); setTAGWidgetsContent(); setParams(view); } /** * 设置顶部标签内容 */ private void setTAGWidgetsContent() { String[] contents = {"自营", "仅看有货", "新品", "促销"}; for (int i = 0; i < mTAGWidget.length; i++) { mTAGWidget[i].setContent(contents[i]); } } /** * 初始化页面数据,并设置事件 */ private void setParams(View view) { for (TagWidget widget : mTAGWidget) { widget.setOnClickListener(this); } mLocationTxv.setText(""); view.findViewById(R.id.reset_btn).setOnClickListener(this); view.findViewById(R.id.confirm_btn).setOnClickListener(this); } @Override public void onDataNotified() { setListViewHeightBasedOnChildren(mListView); } /** * 修改ListView 的高度. */ private void setListViewHeightBasedOnChildren(ListView listView) { //获取listView的适配器 ListAdapter listAdapter = listView.getAdapter(); //item的高度 if (listAdapter == null) { return; } int totalHeight = 0; for (int i = 0; i < listAdapter.getCount(); i++) { View listItem = listAdapter.getView(i, null, listView); listItem.measure(0, 0); //计算子项View 的宽高 //统计所有子项的总高度 totalHeight += ScreenUtil.dip2px(getContext(), listItem.getMeasuredHeight()) + listView.getDividerHeight(); } //TODO 这里计算高度的方式不正确,待修改 totalHeight += ScreenUtil.dip2px(getContext(), 150); ViewGroup.LayoutParams params = listView.getLayoutParams(); params.height = totalHeight; listView.setLayoutParams(params); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.tag1: mTAGWidget[0].toggle(); break; case R.id.tag2: mTAGWidget[1].toggle(); break; case R.id.tag3: mTAGWidget[2].toggle(); break; case R.id.tag4: mTAGWidget[3].toggle(); break; case R.id.reset_btn: resetFilter(); break; case R.id.confirm_btn: filterConfirm(); break; } } /** * 重置筛选条件 */ private void resetFilter() { int size = mListView.getCount(); for (int i = 0; i < size; i++) { View view = mListView.getChildAt(i); GoodsMenuAdapter.ViewHolder viewHolder = (ViewHolder) view.getTag(); if (viewHolder.menuAdapter != null) { viewHolder.menuAdapter.clearSelectedIndex(); } } mMenuAdapter.notifyDataSetChanged(); for (TagWidget widget : mTAGWidget) { if (widget.getStatus()) { widget.toggle(); } } mMinPriceEdt.setText(""); mMaxPriceEdt.setText(""); } /** * 确认筛选条件 */ private void filterConfirm() { if (mGoodsSearchCallback == null) { return; } mGoodsSearchCallback.onFilterCompleted(); } /** * 获取筛选信息 */ public HashMap<String, String> getFilter() { HashMap<String, String> filterParams = new HashMap<>(); String supplier = getSupplierFilter(); if (supplier.length() > 0) { filterParams.put("supplier", supplier); } String price = getPriceFilter(); if (price.length() > 0) { filterParams.put("price", price); } String spec = getSpecFilter(); if (spec.length() > 0) { filterParams.put("spec", spec); } String brand = getBrandFilter(); if (brand.length() > 0) { filterParams.put("brand", brand); } return filterParams; } /** * 获取供应商筛选信息 */ private String getSupplierFilter() { return ""; } /** * 获取价格筛选信息 */ public String getPriceFilter() { try { String minPrice = mMinPriceEdt.getText().toString().trim(); String maxPrice = mMaxPriceEdt.getText().toString().trim(); if (minPrice.length() == 0 | maxPrice.length() == 0) return ""; else return minPrice + SEPARATOR + maxPrice; } catch (Exception e) { return ""; } } /** * 获取参数筛选信息 */ public String getSpecFilter() { try { int size = mListView.getCount(); if (size <= 1) return ""; StringBuilder strBuild = new StringBuilder(); for (int i = 1; i < size; i++) { View childView = mListView.getChildAt(i); ViewHolder viewHolder = (ViewHolder) childView.getTag(); GridView childGridView = viewHolder.gridView; if (childGridView == null) { continue; } Spec spec = mGoodsFilterInfo.getFilter_spec().get(i - 1); for (int j = 0; j < childGridView.getCount(); j++) { View childGridViewItem = childGridView.getChildAt(j); GoodsSubMenuAdapter.ViewHolder gridViewHolder = (GoodsSubMenuAdapter.ViewHolder) childGridViewItem.getTag(); boolean isSelected = gridViewHolder.widget.getStatus(); if (!isSelected) { continue; } String specValue; try { //specValue = spec.getItem().get(j).getApp().getSpec(); specValue = spec.getItem().get(j).getId(); } catch (Exception e) { specValue = ""; } if (specValue != null && specValue.length() > 0) { strBuild.append(specValue).append(SEPARATOR); } } } String result = ""; if (strBuild.length() > SEPARATOR.length()) { int endIndex = strBuild.lastIndexOf(SEPARATOR); result = strBuild.substring(0, endIndex); } return result; } catch (Exception e) { return ""; } } /** * 获取参数筛选信息 */ public String getBrandFilter() { try { StringBuilder strBuild = new StringBuilder(); View childView = mListView.getChildAt(0); ViewHolder viewHolder = (ViewHolder) childView.getTag(); GridView childGridView = viewHolder.gridView; if (childGridView == null) { return ""; } ArrayList<Brand> brands = mGoodsFilterInfo.getFilter_brand(); for (int j = 0; j < childGridView.getCount(); j++) { View childGridViewItem = childGridView.getChildAt(j); GoodsSubMenuAdapter.ViewHolder gridViewHolder = (GoodsSubMenuAdapter.ViewHolder) childGridViewItem.getTag(); boolean isSelected = gridViewHolder.widget.getStatus(); if (!isSelected) { continue; } String brandId; try { //brandId = brands.get(j).getApp().getBrand_id(); brandId = brands.get(j).getId(); } catch (Exception e) { brandId = ""; } if (brandId != null && brandId.length() > 0) { strBuild.append(brandId).append(SEPARATOR); } } String result = ""; if (strBuild.length() > SEPARATOR.length()) { int endIndex = strBuild.lastIndexOf(SEPARATOR); result = strBuild.substring(0, endIndex); } return result; } catch (Exception e) { return ""; } } }

package com.mylinkbuy.android.adapter;

import android.content.Context;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;
import com.mylinkbuy.android.R;
import com.mylinkbuy.android.callback.OnAdapterDataNotifiedListener;
import com.mylinkbuy.android.model.GoodsFilterInfo;
import com.mylinkbuy.android.model.GoodsFilterInfo.Brand;
import com.mylinkbuy.android.model.GoodsFilterInfo.Spec;
import com.mylinkbuy.android.model.GoodsFilterInfo.SpecItem;
import java.util.ArrayList;

/**
 * **********************************************
 * 

* Date: 2018-01-31 10:30 *

* Author: SinPingWu *

* Email: [email protected] *

* brief: 商品列表菜单适配器 *

* history: *

* ********************************************** */ public class GoodsMenuAdapter extends BaseAdapter { private Context mContext; private GoodsFilterInfo mFilterInfo; private OnAdapterDataNotifiedListener mNotifiedCallback = null; public GoodsMenuAdapter(Context context, GoodsFilterInfo filterInfo) { this.mContext = context; this.mFilterInfo = filterInfo; } public void setDataNotifyListener(OnAdapterDataNotifiedListener callback) { this.mNotifiedCallback = callback; } public void setData(GoodsFilterInfo filterInfo) { this.mFilterInfo = filterInfo; notifyDataSetChanged(); } @Override public View getView(int position, View convertView, ViewGroup parent) { final ViewHolder viewHolder; if (convertView == null) { convertView = View.inflate(mContext, R.layout.goods_filter_menu_item, null); viewHolder = new ViewHolder(); viewHolder.title = (TextView) convertView.findViewById(R.id.title); viewHolder.subTitle = (TextView) convertView.findViewById(R.id.sub_title); viewHolder.img = (ImageView) convertView.findViewById(R.id.img); viewHolder.gridView = (GridView) convertView.findViewById(R.id.grid_view); viewHolder.menuAdapter = new GoodsSubMenuAdapter(mContext, null); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.img.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { viewHolder.isExpanded = !viewHolder.isExpanded; notifyDataSetChanged(); } }); String title; ArrayList<String> subFilterData; if (position == 0) { title = "品牌"; ArrayList<GoodsFilterInfo.Brand> brands = mFilterInfo.getFilter_brand(); subFilterData = transferBrandInfo(brands, !viewHolder.isExpanded); } else { Spec spec = mFilterInfo.getFilter_spec().get(position - 1); title = spec.getName(); ArrayList<SpecItem> specItems = spec.getItem(); subFilterData = transferSpecItemInfo(specItems, !viewHolder.isExpanded); } viewHolder.title.setText(title); viewHolder.subTitle.setText(""); if (viewHolder.menuAdapter == null) { viewHolder.menuAdapter = new GoodsSubMenuAdapter(mContext, subFilterData); } else { viewHolder.menuAdapter.setData(subFilterData); } //GoodsSubMenuAdapter menuAdapter = new GoodsSubMenuAdapter(mContext, subFilterData); viewHolder.gridView.setAdapter(viewHolder.menuAdapter); return convertView; } @Override public int getCount() { if (mFilterInfo == null) return 0; int size = mFilterInfo.getFilter_spec().size(); if (mFilterInfo.getFilter_brand() != null) { size = size + 1; } /*if (mFilterInfo.getFilter_price() != null) { size = size + 1; }*/ return size; } @Override public Object getItem(int position) { if (position == 0) { return mFilterInfo.getFilter_brand(); } else { return mFilterInfo.getFilter_spec().get(position - 1); } /*int specSize = mFilterInfo.getFilter_spec().size(); if (position < specSize) { return mFilterInfo.getFilter_spec().get(position); } else if (position == specSize) { return mFilterInfo.getFilter_brand(); } else { return mFilterInfo.getFilter_price(); }*/ } @Override public long getItemId(int position) { return position; } @Override public void notifyDataSetChanged() { super.notifyDataSetChanged(); if (mNotifiedCallback != null) { mNotifiedCallback.onDataNotified(); } } public static class ViewHolder { public TextView title; TextView subTitle; ImageView img; public GridView gridView; public GoodsSubMenuAdapter menuAdapter; /** * 代表 GridView 是否为展开的。默认false. */ boolean isExpanded; } private ArrayList<String> transferBrandInfo(ArrayList<GoodsFilterInfo.Brand> brands, boolean isOmitted) { ArrayList<String> result = new ArrayList<>(); if (brands == null) return result; int size; if (isOmitted && brands.size() > 3) { size = 3; } else { size = brands.size(); } for (int i = 0; i < size; i++) { Brand brand = brands.get(i); result.add(brand.getName()); } return result; } private ArrayList<String> transferSpecItemInfo(ArrayList<GoodsFilterInfo.SpecItem> specItems, boolean isOmitted) { ArrayList<String> result = new ArrayList<>(); int size; if (isOmitted && specItems.size() > 3) { size = 3; } else { size = specItems.size(); } for (int i = 0; i < size; i++) { SpecItem specItem = specItems.get(i); result.add(specItem.getName()); } return result; } }

package com.mylinkbuy.android.adapter;

import android.content.Context;
import android.util.SparseBooleanArray;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import com.mylinkbuy.android.R;
import com.mylinkbuy.android.view.TagWidget;
import java.util.ArrayList;

/**
 * **********************************************
 * 

* Date: 2018-01-31 11:17 *

* Author: SinPingWu *

* Email: [email protected] *

* brief: *

* history: *

* ********************************************** */ public class GoodsSubMenuAdapter extends BaseAdapter { private Context mContext; private ArrayList<String> mMenuItems; private SparseBooleanArray mSelectedIndex = new SparseBooleanArray(); GoodsSubMenuAdapter(Context context, ArrayList<String> menuItems) { this.mContext = context; setParam(menuItems); } /** * 清除选中的项目 */ public void clearSelectedIndex() { if (mSelectedIndex != null) { mSelectedIndex.clear(); } } public void setData(ArrayList<String> menuItems) { setParam(menuItems); notifyDataSetChanged(); } private void setParam(ArrayList<String> menuItems) { if (menuItems == null) { mMenuItems = new ArrayList<>(); } else { mMenuItems = new ArrayList<>(menuItems); } } @Override public View getView(final int position, View convertView, ViewGroup parent) { final ViewHolder viewHolder; if (convertView == null) { convertView = View.inflate(mContext, R.layout.goods_filter_menu_sub_item, null); viewHolder = new ViewHolder(); viewHolder.widget = (TagWidget) convertView.findViewById(R.id.tag_widget); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } String content = mMenuItems.get(position); viewHolder.widget.setContent(content); boolean isSelected; try { isSelected = mSelectedIndex.get(position); } catch (Exception e) { isSelected = false; } if (isSelected != viewHolder.widget.getStatus()) { viewHolder.widget.toggle(); } viewHolder.widget.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { viewHolder.widget.toggle(); mSelectedIndex.put(position, viewHolder.widget.getStatus()); } }); return convertView; } @Override public int getCount() { return mMenuItems.size(); } @Override public Object getItem(int position) { return mMenuItems.get(position); } @Override public long getItemId(int position) { return position; } public static class ViewHolder { public TagWidget widget; } }

你可能感兴趣的:(Android)