2012-12-03 1 views
0

Когда я нажимаю флажок внутри ListView, также проверяется второй элемент в списке. В качестве примера, если я проверю 1-й элемент, 7-й список будет проверен. Вот мой код для размещения ячейки:CheckBox внутри ListView внутри спискаFragment

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout android:id="@+id/relativeLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android"> 

    <ImageView 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:id="@+id/imgDisclosureIndicator" 
     android:src="@drawable/disclosureon" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentRight="true" 
     android:paddingRight="6dp"></ImageView> 

    <ImageView 
     android:id="@+id/imgTaskState" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:src="@drawable/taskok" /> 

    <CheckBox 
     android:id="@+id/chkTaskImage" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBottom="@+id/imgTaskState" 
     android:layout_toLeftOf="@+id/imgDisclosureIndicator" 
     android:layout_toRightOf="@+id/imgTaskState" 
     android:focusable="false" /> 

</RelativeLayout> 

Я присоединился образом, чтобы помочь вам:

Checkbox problem

В качестве примечания, то ListView находится внутри ListFragment.

EDIT: Ниже приведен код, который отображает мою ячейку с ее данными.

String[] from = {"taskId", "taskStateId", "taskText", "disclosureIndicatorId"}; 
        int[] to = {0, R.id.imgTaskState, R.id.chkTaskImage, R.id.imgDisclosureIndicator}; 
SimpleAdapter adapter = new SimpleAdapter(mContext, mList, R.layout.task_cell, from, to); 
setListAdapter(adapter); 

EDIT # 2: Эта ситуация не происходит, если ListView отображается вертикально.

ListView problem

EDIT # 3: Даже если я использую SimpleAdapter, с помощью следующего кода, когда ListView горизонтальна я получаю ту же ошибку.

private class CellInspectionAdapter extends BaseAdapter 
    { 
      private Vector<InspectionCell> cells; 
      private Context context; 

      public CellInspectionAdapter(Context context, Vector<InspectionCell> cells) 
      { 
       this.cells = cells; 
       this.context = context; 
     } 

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

     @Override 
     public Object getItem(int position) 
     { 
      return null; 
     } 

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

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) 
     { 
      // Map data from the ArrayList from the adapter 
      LayoutInflater inflater = (LayoutInflater) context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

      View celluleTask; 

      if (convertView == null) 
      { 
       celluleTask = new View(context); 
       celluleTask = inflater.inflate(R.layout.laprise_task_cell, null); 

       // Assign data to the cell 
       ImageView imgEtat = (ImageView)celluleTask.findViewById(R.id.imgTaskState); 
       imgEtat.setImageResource(cells.get(position).getStateDrawable()); 

       // Assign text 
       CheckBox chkCell = (CheckBox)celluleTask.findViewById(R.id.chkTaskImage); 
       chkCell.setText(cells.get(position).getTexte()); 

       // Disclosure 
       ImageView imgDisclosure = (ImageView)celluleTask.findViewById(R.id.imgDisclosureIndicator); 
       imgDisclosure.setImageResource(cells.get(position).getDisclosureDrawable());  
      } 
      else 
      { 
       celluleTask = (View)convertView; 
      } 

      return celluleTask; 
     } 
    } 

EDIT # 5: Вот решение! Переопределите методы getViewTypeCount() и getItemViewType (int position). Я добавил эти строки в SimpleAdapter, и он работает.

@Override 
public int getViewTypeCount() {     

    return getCount(); 
} 

@Override 
public int getItemViewType(int position) { 

    return position; 
} 
+0

В чем заключен ваш код? Можете ли вы опубликовать методы getView() и onItemClick()? – znat

+0

Я еще не запускаю метод OnItemClick. –

+0

Я чувствую, что SimpleAdapter испортился с просмотром видов в вашем ListView. Это объясняет, почему это работает в портрете, а не в пейзаже. Попробуйте определить свой собственный адаптер (простой способ расширить ArrayAdapter ) – znat

ответ

2

0 Вы используете convertView неправильно. Непустой convertView только позаботится о создании нового представления и создания макета, но у вас есть, чтобы установить содержимое всех дочерних элементов convertView для соответствия текущему элементу. Это также объясняет, почему оно работает в вертикальном направлении, потому что одновременно обе строки видны одновременно.

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

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // Map data from the ArrayList from the adapter 
     LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     View celluleTask = convertView; 

     if (celluleTask == null) { 
      celluleTask = inflater.inflate(R.layout.laprise_task_cell, null); 
     } 

     // Assign data to the cell ALWAYS! 
     ImageView imgEtat = (ImageView)celluleTask.findViewById(R.id.imgTaskState); 
     imgEtat.setImageResource(cells.get(position).getStateDrawable()); 

     // Assign text 
     CheckBox chkCell = (CheckBox)celluleTask.findViewById(R.id.chkTaskImage); 
     chkCell.setText(cells.get(position).getTexte()); 

     // Disclosure 
     ImageView imgDisclosure = (ImageView)celluleTask.findViewById(R.id.imgDisclosureIndicator); 
     imgDisclosure.setImageResource(cells.get(position).getDisclosureDrawable());  

     return celluleTask; 
} 

P.S .: Вы также должны переместить выборку макета Inflater из метода getView так он не должен делать снова и снова.

P.P.S .: Для того, чтобы избежать вызова findViewById снова и снова, посмотрите на View Holder Pattern.