2016-11-04 30 views
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; 
} 

}

+0

你應該保持複選框的狀態..爲此,你應該維護一個布爾變量來檢查是否爲 –

+0

我確實持有這個狀態。這就是我在做的OnCheckedChangeListener – Ninja7rock

+0

我沒有在代碼中提到Model類,但它與鏈接的代碼相似。 – Ninja7rock

回答

0
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();

相關問題