0
我在使用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;
}
}
你應該保持複選框的狀態..爲此,你應該維護一個布爾變量來檢查是否爲 –
我確實持有這個狀態。這就是我在做的OnCheckedChangeListener – Ninja7rock
我沒有在代碼中提到Model類,但它與鏈接的代碼相似。 – Ninja7rock