最近项目遇到一个功能,类似淘宝的购物颜色,尺码联动。
说重点吧,感受比较深的是数据驱动吧,类似前端的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方法里即可。代码太多就不一一贴了。