最近项目遇到一个功能,类似淘宝的购物颜色,尺码联动。 说重点吧,感受比较深的是数据驱动吧,类似前端的Vue.js。 先看一下适配器数据模型吧
public class DemoModel implements Serializable{ private String id; private String content; private boolean isSelect;//是否选中 private List<String> mlist;//对应关联 private boolean isEnableClick;//是否可点 public List<String> getMlist() { return mlist; } public void setMlist(List<String> mlist) { this.mlist = mlist; } public boolean isSelect() { return isSelect; } public void setSelect(boolean select) { isSelect = select; } public boolean isEnableClick() { return isEnableClick; } public void setEnableClick(boolean enableClick) { isEnableClick = enableClick; } public DemoModel(String id, String content,boolean isSelect,boolean isEnableClick,List<String> mlist) { super(); this.id = id; this.content = content; this.isEnableClick =isEnableClick; this.isSelect =isSelect; this.mlist = mlist; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } }通过修改状态值来刷新适配器notifyDataSetChanged(); 适配器类
/** * Created by xulei on 2017/7/18. */ public class GoodsPopupGridAdapter extends SingleAdapter{ private Activity activity; private List<DemoModel> demodels; private LayoutInflater inflater; private int pos; private int lastPosition = -1;//记录上一次选中的图片位置,-1表示未选中 private Vector<Boolean> vector = new Vector<Boolean>(); // 定义一个向量作为选中与否容器 public GoodsPopupGridAdapter(Activity activity , List<DemoModel> demodels,int L){ super(activity); this.activity = activity; this.demodels = demodels; pos = L; inflater = LayoutInflater.from(activity); for (int i = 0; i < demodels.size(); i++) { vector.add(false); } } @Override public int getCount() { // TODO Auto-generated method stub return demodels.size(); } @Override protected demodelHolder createViewHolder(View root) { // TODO Auto-generated method stub demodelHolder hold = new demodelHolder(); hold.tv_demodel = (Button) root.findViewById(R.id.adapter_item_btncheck); return hold; } @Override protected void fillView(View root, Object item, ViewHolder holder, final int position) { // TODO Auto-generated method stub final demodelHolder hold = (demodelHolder)holder; hold.demodel = demodels.get(position); if(!"".equals(demodels.get(position).getContent())){ hold.tv_demodel.setText(demodels.get(position).getContent()); } if(demodels.get(position).isEnableClick() == true){ hold.tv_demodel.setEnabled(true); if(demodels.get(position).isSelect() == true){ hold.tv_demodel.setBackgroundResource(R.drawable.bg_shape_blue); hold.tv_demodel.setTextColor(activity.getResources().getColor(R.color.white)); //setBackgroundDrawable(activity.getResources().getDrawable(R.drawable.bg_shape_blue)); }else{ hold.tv_demodel.setBackgroundResource(R.drawable.bg_shape_whitesmoke); hold.tv_demodel.setTextColor(activity.getResources().getColor(R.color.text_black)); //setBackgroundDrawable(activity.getResources().getDrawable(R.drawable.bg_shape_grey)); } }else { hold.tv_demodel.setEnabled(false); hold.tv_demodel.setTextColor(activity.getResources().getColor(R.color.lightgray)); hold.tv_demodel.setBackgroundResource(R.drawable.bg_shape_whitesmoke); return; } hold.tv_demodel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { changeState(position,pos); if (pos == 1){ if (demodels.get(position).isSelect()){ int i = 0; if(GoodsDetailActivity.Sizedemodels.size()==1){ GoodsDetailActivity.Sizedemodels.get(i).setEnableClick(true); }else { for(DemoModel mdModel :GoodsDetailActivity.Sizedemodels){ if(i>=GoodsDetailActivity.Sizedemodels.size()) return; if(demodels.get(position).getMlist().contains(mdModel.getContent())){ GoodsDetailActivity.Sizedemodels.get(i).setEnableClick(true); }else { GoodsDetailActivity.Sizedemodels.get(i).setEnableClick(false); } /* for(String str : demodels.get(position).getMlist()){ if(str.equals(mdModel.getContent())){ GoodsDetailActivity.Sizedemodels.get(i).setEnableClick(true); }else { GoodsDetailActivity.Sizedemodels.get(i).setEnableClick(false); } }*/ i++; } } }else { for(int i=0;i<GoodsDetailActivity.Sizedemodels.size();i++){ GoodsDetailActivity.Sizedemodels.get(i).setEnableClick(true); } } Log.i("","x---"+ GoodsDetailActivity.Sizedemodels.toString()); GoodsDetailActivity.adapter_size.notifyDataSetChanged(); }else if(pos ==2){ if (demodels.get(position).isSelect()){ int i = 0; if(GoodsDetailActivity.Colourdemodels.size()==1){ GoodsDetailActivity.Colourdemodels.get(i).setEnableClick(true); }else { for(DemoModel mdModel :GoodsDetailActivity.Colourdemodels){ if(i>=GoodsDetailActivity.Colourdemodels.size()) return; if(demodels.get(position).getMlist().contains(mdModel.getContent())){ GoodsDetailActivity.Colourdemodels.get(i).setEnableClick(true); }else { GoodsDetailActivity.Colourdemodels.get(i).setEnableClick(false); } /*for(String str : demodels.get(position).getMlist()){ if(str.equals(mdModel.getContent())){ GoodsDetailActivity.Colourdemodels.get(i).setEnableClick(true); }else { GoodsDetailActivity.Colourdemodels.get(i).setEnableClick(false); } }*/ i++; } } }else { for(int i=0;i<GoodsDetailActivity.Colourdemodels.size();i++){ GoodsDetailActivity.Colourdemodels.get(i).setEnableClick(true); } } Log.i("","x---"+ GoodsDetailActivity.Colourdemodels.toString()); GoodsDetailActivity.adapter_color.notifyDataSetChanged(); } } }); } @Override protected int getItemViewId() { // TODO Auto-generated method stub return R.layout.adapter_pop_btncheck; } public class demodelHolder extends ViewHolder{ private TextView tv_demodel; private DemoModel demodel; } /** * 修改选中时的状态 * @param position */ public void changeState(int position,int pos){ if(pos == 1){ if(GoodsDetailActivity.Colourdemodels.get(position).isSelect()) { ModifySelectInfo(pos); GoodsDetailActivity.Colourdemodels.get(position).setSelect(false); }else { ModifySelectInfo(pos); GoodsDetailActivity.Colourdemodels.get(position).setSelect(true); } GoodsDetailActivity.adapter_color.notifyDataSetChanged(); }else { if(GoodsDetailActivity.Sizedemodels.get(position).isSelect()) { ModifySelectInfo(pos); GoodsDetailActivity.Sizedemodels.get(position).setSelect(false); }else { ModifySelectInfo(pos); GoodsDetailActivity.Sizedemodels.get(position).setSelect(true); } Log.i("","x---"+ GoodsDetailActivity.Sizedemodels.toString()); GoodsDetailActivity.adapter_size.notifyDataSetChanged(); } } private void ModifySelectInfo(int pos){ if(pos==1){ for(int i=0;i<GoodsDetailActivity.Colourdemodels.size();i++){ GoodsDetailActivity.Colourdemodels.get(i).setSelect(false); } }else { for(int i=0;i<GoodsDetailActivity.Sizedemodels.size();i++){ GoodsDetailActivity.Sizedemodels.get(i).setSelect(false); } } } private void ModifyEnableInfo(){ for(int i=0;i<demodels.size();i++){ demodels.get(i).setEnableClick(true); } } public int getLastPositiont(){ return lastPosition; } }其中fillview其实类似getView方法,写在getview方法里即可。代码太多就不一一贴了。