#android如何在Baseadapter中对多个复选框进行状态更改,只需点击一个复选框?

问题描述:

我在使用BaseAdapter构建listview复选框时遇到了一个问题。 我没有找到方法使用下面的链接的代码更改一次一个复选框:http://lalit3686.blogspot.tw/2012/06/today-i-am-going-to-show-how-to-deal.html#android如何在Baseadapter中对多个复选框进行状态更改,只需点击一个复选框?

但是,我无法弄清楚如何使多个复选框用一个简单的点击来改变自己的状态在BaseAdapter上的一个它,因为我会发现一些复选框有时会在我滚动时再次转向错误的状态。

This is what I want to accomplish

这里是我的代码:

public class NewSongAdapter extends BaseAdapter implements Filterable{ 


Context context; 
LayoutInflater inflater; 
static List<Model> list = new ArrayList<Model>(); 
static List<Model> listFiltered = new ArrayList<Model>(); 
static NewSongAdapter newsongadp; 

CustomFilter3 filter; 
static Holder holder; 
static boolean fromclick; 
static int posi; 

public NewSongAdapter(Context context, List<Model> list) { 
    this.context = context; 
    this.inflater = LayoutInflater.from(context); 
    this.list = list; 
    this.listFiltered=list; 

    newsongadp=this; 

} 





@Override 
public int getCount() { 
    return listFiltered.size(); 
} 

@Override 
public Object getItem(int pos) { 
    return listFiltered.get(pos); 
} 

@Override 
public long getItemId(int pos) { 
    return 0; 
} 

@Override 
public View getView(int pos, View convertView, ViewGroup parent) { 
    View v; 

    Holder holder; 
    posi = pos; 
    int id = Resources.getSystem().getIdentifier("btn_check_holo_light", "drawable", "android"); 

    if (inflater == null) { 
     inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    } 


    if (convertView == null) { 
     v=LayoutInflater.from(context).inflate(R.layout.newsongadp_view, null); 
     holder = new Holder(); 
     holder.text = (TextView) v.findViewById(R.id.nstext); 
     holder.checkBox = (CheckBox) v.findViewById(R.id.nscheckBox); 
     holder.image=(ImageView) v.findViewById(R.id.nsimageView); 
     holder.checkBox.setButtonDrawable(id); 
     holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 

       int getPosition = (Integer) buttonView.getTag(); 

       int posi=getPosition; 



       listFiltered.get(getPosition).setSelected(buttonView.isChecked()); 
        if(listFiltered.get(posi).isDirect()==true) 
        { 
         posi++; 
         while (posi < listFiltered.size() && listFiltered.get(posi).isDirect() != true) { 

           listFiltered.get(posi).setSelected(buttonView.isChecked()); 
           posi++; 
          } 

        } 


       NewSongActivity.newsongadp.notifyDataSetChanged(); 

      } 
     }); 


     v.setTag(holder); 
     v.setTag(R.id.nstext, holder.text); 
     v.setTag(R.id.nscheckBox, holder.checkBox); 
    } else { 
     v = convertView; 
     holder = (Holder) v.getTag(); 


    } 


    holder.checkBox.setTag(pos); 
    holder.text.setTag(pos); 


    holder.text.setText(listFiltered.get(pos).getName()); 

     if (listFiltered.get(pos).isSelected() == true) { 


      holder.checkBox.setChecked(true); 
      holder.text.setTextColor(Color.rgb(0, 191, 255)); 

     } else { 


      holder.checkBox.setChecked(false); 
      holder.text.setTextColor(Color.rgb(0, 0, 0)); 


     } 




     if(listFiltered.get(pos).isDirect() == true) { 
     holder.text.setTypeface(null, Typeface.BOLD); 
     holder.image.setImageResource(R.drawable.folder_fig); 
     holder.image.setVisibility(View.VISIBLE); 



    return v; 
} 





class Holder { 

    CheckBox checkBox; 
    TextView text; 
    ImageView image; 
} 

@Override 
public Filter getFilter() { 

    if(filter==null) 
     filter=new CustomFilter3(listFiltered,this); 


    return filter; 
} 

}

编辑: Model.class:

public class Model { 

private String name; 
private boolean selected=false; 
private boolean direct=false; 


public Model(String name) { 
    this.name = name; 
} 

public Model(String name, Boolean direct) 
{ this.name=name; 
    this.direct=direct; 
} 


public String getName() { 
    return name; 
} 

public boolean isSelected() { 
    return selected; 
} 

public void setSelected(boolean selected) { 
    this.selected = selected; 
} 

public boolean isDirect(){return direct; } 

public void setIs_direct(boolean direct){ 
    this.direct = direct; 
} 

}

+0

你应该保持复选框的状态..为此,你应该维护一个布尔变量来检查是否为 –

+0

我确实持有这个状态。这就是我在做的OnCheckedChangeListener – Ninja7rock

+0

我没有在代码中提到Model类,但它与链接的代码相似。 – Ninja7rock

class Model 
    { 
    String text; 
    boolean isChecked=false; 

Model(String text,boolean isChecked) 
    { 
    this.text=text; 
    this.isCheccked=isChecked; 
    } 


    //write getters and setters for the given variables. 
    } 

在您的适配器。

单击复选框时。

arraylist.setisChecked(true); notifyDataSetChanged();