2013-08-22 2 views
2

Я пытаюсь изменить состояние CheckBox (которое размещается внутри ListView с помощью специального адаптера). Возможно ли это?Состояние галочки в действии

Я пытаюсь получить View из CheckBox используя его метку, но он возвращает null.

  View v = new View(this); 
      ck = (CheckBox) v.findViewWithTag(tag); //Here ck is null 
      ck.setChecked(true); 

Обновление для кода:

OnCreate()

{ 
    .... 
    populateListView(id); 
    .... 
} 

private void populateListView(int id) 
{ 
    String errorDescriptionQuery = "SELECT error_description FROM " + TABLE_ERROR + " JOIN " + TABLE_REPAIR_ERROR + " ON " + 
               TABLE_REPAIR_ERROR + ".error_id = " + TABLE_ERROR + "._id" + 
               " WHERE " + TABLE_REPAIR_ERROR + ".repair_id = " + id; 

    errorList = new ArrayList<Error>(); 

    Cursor c = db.rawQuery(errorDescriptionQuery, null); 

    if(c.getCount() > 1) 
    { 
     c.moveToFirst(); 
     do 
     { 
      Error e = new Error(); 
      e.setDescription(c.getString(0)); 
      e.setChecked(false); 
      errorList.add(e); 
     } 
     while(c.moveToNext()); 
    } 
    else if(c.getCount() == 1) 
    { 
     c.moveToFirst(); 

     Error e = new Error(); 
     e.setDescription(c.getString(0)); 
     e.setChecked(false); 
     errorList.add(e); 
    } 
    else 
    { 
     //Exception - no errors found with that id. 
    } 
    while(c.moveToNext()); 

    adapter = new RepairErrorListChkBoxAdapter(this, R.layout.repairerrorcontent, errorList, passedID); 
    lvError.setAdapter(adapter); 
} 

Пользовательский адаптер

public class RepairErrorListChkBoxAdapter extends BaseAdapter 
{ 
String TABLE_ERROR = "tbl_Error"; 
String TABLE_MATERIAL = "tbl_Material"; 

DatabaseImplementation myDB; 
SQLiteDatabase db; 

private ArrayList<String> materialList; 

ViewHolder holder; 
int testcount = 0; 
public ArrayList<Error> list; 
private Context mContext; 
private LayoutInflater mInflator; 
private int repairID; 
boolean moreThanOne; 

public RepairErrorListChkBoxAdapter(Context context, int textViewResourceId, ArrayList<Error> list, int repairID) 
{ 
    this.mContext = context; 
    this.list = list; 
    this.repairID = repairID; 

    this.materialList = new ArrayList<String>(); 

    myDB = new DatabaseImplementation(this.mContext); 
    db = myDB.getWritableDatabase(); 

    mInflator = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

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

@Override 
public Object getItem(int position) 
{ 
    return list.get(position); 
} 

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

@Override 
public View getView(int position, View convertView, ViewGroup parent) 
{ 
    if(convertView == null) 
    { 
     holder = new ViewHolder(); 

     convertView = mInflator.inflate(R.layout.repairerrorcontent, null); 

     //holder.text = (TextView)convertView.findViewById(R.id.txtErrorDesc); 
     holder.chk = (CheckBox)convertView.findViewById(R.id.chkSelected); 
     holder.chk.setOnClickListener(new MyClickListener(holder.chk)); 

     convertView.setTag(holder); 
    } 
    else 
    { 
     holder = (ViewHolder)convertView.getTag(); 
    } 

    holder.chk.setText(" " + list.get(position).getDescription()); 
    holder.chk.setClickable(true); 
    holder.chk.setFocusable(true); 
    holder.chk.setTag(testcount); 

    if(list.get(position).isChecked() == true) 
    { 
     holder.chk.setChecked(true); 
    } 
    else 
    { 
     holder.chk.setChecked(false); 
    } 

    String materialNameQuery = "SELECT material_name FROM " + TABLE_MATERIAL + ";"; 

    Cursor getMaterialName = db.rawQuery(materialNameQuery, null); 
    getMaterialName.moveToFirst(); 
    do 
    { 
     materialList.add(getMaterialName.getString(0)); 
    } 
    while(getMaterialName.moveToNext()); 

    return convertView; 
} 

public void changeCheckBoxState(String tag) 
{ 

} 

private class MyClickListener implements OnClickListener 
{ 
    CheckBox checkbox = null; 

    public MyClickListener(CheckBox cb) 
    { 
     checkbox = cb; 
    } 
    @Override 
    public void onClick(final View v) 
    { 

     final AlertDialog.Builder builder = new AlertDialog.Builder(mContext); 
     builder.setTitle("Materials"); 
     builder.setMessage("Did you require any materials to fix this error?"); 
     builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() 
     { 
      @Override 
      public void onClick(DialogInterface dialog, int which) 
      { 
       v.setTag("clickedBox"); 
       CheckBox cb = new CheckBox(mContext); 
       cb = (CheckBox) v; 
       String clickedError; 
       clickedError = cb.getText().toString() ; 
       String tag = (String) v.getTag(); 

       Intent intent = new Intent(mContext, Material.class); 
       intent.putStringArrayListExtra("materialList", materialList); 
       intent.putExtra("clickedError", clickedError); 
       intent.putExtra("repairID", repairID); 
       intent.putExtra("tag", tag); 
       ((Activity) mContext).startActivityForResult(intent, 1);    
      } 
     }); 
     builder.setNegativeButton("No", new DialogInterface.OnClickListener() 
     { 
      @Override 
      public void onClick(DialogInterface dialog, int which) 
      { 
       if(checkbox.getTag() == v.getTag()) 
       { 
        checkbox.setChecked(true); 
       } 
      }    
     }); 
     builder.show(); 
    } 
} 

static class ViewHolder 
{ 
    CheckBox chk; 
} 

} 
+0

http://lalit3686.blogspot.in/2012/06/today-i-am-going-to-show-how-to-deal.html –

+0

@LalitPoptani спасибо за ответ на. Это не проблема переработки. Мне просто нужно установить флажок для проверки активности. Есть ли способ сохранить все флажки, добавленные адаптером, в Список из активности? – ClaireG

+0

Этот пост включает в себя ваши ответы также :-) –

ответ

1

решаемые сам.

У меня был предыдущий ArrayList содержащий весь текст, который будет представлен каждым checkbox. Я использовал ArrayList, чтобы сравнить значение щелчка checkbox, а затем заново создал адаптер для listview с обновленным списком.

Спасибо всем за помощь.

for(Error temp : errorList) 
      { 
       if(temp.getDescription().equals(clicked)) 
       { 
        temp.setChecked(true); 
       } 
      } 
      adapter = new RepairErrorListChkBoxAdapter(this, R.layout.repairerrorcontent, errorList, passedID); 
      lvError.setAdapter(adapter); 
1

Попробуйте это:

View rowView = listView.getChildAt(viewID); 
    if(rowView != null) 
    { 
    // do whatever you want here 
    ck = (CheckBox) v.findViewWithTag(tag); 
    ck.setChecked(true); 
    } 

Надеюсь, что это поможет!

+0

Привет, спасибо за ответ. Вы можете реализовать это только в пользовательском классе адаптера? Мне нужно установитьCheckChecked из активности, а не класса адаптера. – ClaireG

+0

вы также можете получить его из класса активности, если ваша активность имеет listview. –

0

Try ниже код

for(int i=0; i < mListViewObject.getChildCount(); i++){ 
    RelativeLayout itemLayout = (RelativeLayout)mListViewObject.getChildAt(i); 
    CheckBox cb = (CheckBox)itemLayout.findViewById(R.id.checkBox); 
    cb.setChecked(true); 
} 

mListViewObject является список вашего объекта вид

Приведенный выше код работает в деятельности не адаптере. Я использую его.

Update RelativeLayout с макетом, который вы используете для ListView в коде выше

+0

Красивый подход. Пробовал это и как-то lvError.getChildCount() равен 0. У меня есть 4 элемента внутри. – ClaireG

+0

друг этот код работает отлично для меня. Это точная копия, я думаю, что еще одна проблема. Просто проверьте свой код один раз. Где вы добавляете код –

+0

в действие onActivityResult(). Потому что мне нужно сделать это выше, исходя из результата другого действия. – ClaireG

Смежные вопросы