2016-11-04 6 views
0

BaseAdapterを使用してリストビューにチェックボックスを作成するときに問題が発生しました。 次のリンクのコードを使用して、一度に1つのチェックボックスを変更する方法を見つけました。http://lalit3686.blogspot.tw/2012/06/today-i-am-going-to-show-how-to-deal.html#android 1つのチェックボックスをクリックするだけで、複数のチェックボックスの状態を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

でやっているstate.Thatのものを保持しなかった。..チェックボックスの状態を保持する必要があり、私はコードでモデルクラスを言及していませんそれはリンクのコードに似ています。 – 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();

関連する問題