2012-10-19 24 views
1

我有问题,我无法找到关于SO的答案 - 所有问题都解决了在哪里太多不同的问题,并没有工作。 问题是 -
1.在ListView中单击行(单击它们后标记为蓝色coolor背景和复选框),在滚动后松开它们点击的标记(复选框和颜色)。
2.甚至更多 - 其他行在滚动期间被标记,即使没有被点击。
ListView绑定到我的自定义简单光标适配器,它从SQLite数据库获取数据。 listview的每一行都有很多带有文本框和一个复选框的列 - 所以在ListView中默认的多选模式选择在我的情况下不起作用 - 我使用onItemClick来获取选定的项目。在ListView活动中,我在列表中自己处理选中的项目。 ListView也在Horizo​​ntalScrollView中。列表视图与检查简单的光标适配器项目未检查滚动

因此,这些都是我的课和布局:

MyListActivity

public class MyListActivity extends ListActivity 
    { ..... 
    public void initComponents() 
    { 
     baza = dbMan.openDB(true); 
     cursorListaFaktur = wyswietlWszystkieTowary(); 
     startManagingCursor(cursorListaFaktur); 
       fakturyLista = this.getListView(); 
     fakturyLista.setScrollContainer(true); 
     fakturyLista.setScrollingCacheEnabled(true); 

     fakturyLista.setItemsCanFocus(false); 
     fakturyLista.setTextFilterEnabled(true); 
     fakturyLista.setItemChecked(0, true); 


     String[] columns = new String[] { "NRDOK", "NAZWADOK", "ANULOWANY", 
       "NAZWASKR", "DATA", "SUMA", "MIEJSCOWOSC", "TERMIN", 
       "WYEKSPORTOWANY", "MSPRZ_DOKUMENT.UWAGI" }; 

     int[] kontrolki = new int[] { R.id.ID_FakturyRow_NrFakt, 
       R.id.ID_FakturyRow_Typ, R.id.ID_FakturyRow_Anulowany, 
       R.id.ID_FakturyRow_DataSprzed, 
           R.id.ID_FakturyRow_Kontrahent, 
       R.id.ID_FakturyRow_Suma, R.id.ID_FakturyRow_Miejscowosc, 
       R.id.ID_FakturyRow_Termin, R.id.ID_FakturyRow_Wyeksp, 
       R.id.ID_FakturyRow_Uwagi }; 

     String[] columnsRaportKasowy = new String[] { "NRDOK", "NAZWADOK", 
       "GOTOWKA", "GOTOWKA", "NAZWASKR", "DATA", "UWAGI" }; 

     int[] kontrolkiRaportKasowy = new int[] { 
       R.id.ID_RaportKasowyRow_NrFakt, 
           R.id.ID_RaportKasowyRow_Typ, 
       R.id.ID_RaportKasowyRow_Wplata, 
       R.id.ID_RaportKasowyRow_Wyplata, 
       R.id.ID_RaportKasowyRow_Kontrahent, 
       R.id.ID_RaportKasowyRow_DataSprzed, 
       R.id.ID_RaportKasowyRow_Uwagi }; 

     if (raportKasowy) 
     { 
      adapterFaktury = new MSprzedazRaportKasowyAdapter(this, 
        R.layout.raportkasowy_row, cursorListaFaktur, 
        columnsRaportKasowy, kontrolkiRaportKasowy); 
     } 
     else 
     { 
      adapterFaktury = new 
         MSprzedazListViewAdapter(this,R.layout.faktury_row, 
         cursorListaFaktur, columns, kontrolki); 
     } 
      fakturyLista.setOnItemClickListener(new OnItemClickListener() { 

       public void onItemClick(AdapterView<?> arg0, View arg1, 
         int arg2, long arg3) 
       { 
        LinearLayout linLay = (LinearLayout) arg1; 
        ArrayList<View> kontrolki = arg1.getTouchables(); 
        CheckBox chBox = (CheckBox) kontrolki.get(0); 
        chBox.setChecked(!chBox.isChecked()); 
        Cursor cursor = adapterFaktury.getCursor(); 
        cursor.moveToPosition(arg2); 
        String tekstKom = ""; 
           if(MSprzedazUtils.znajdzIdWliscieZazn(
           cursor.getInt(cursor.getColumnIndex("_id")) 
           , listaZaznaczonych) == null) 
        { 

      listaZaznaczonych.add(cursor.getInt(cursor.getColumnIndex("_id"))); 

      linLay.setBackgroundColor(Color.rgb(110, 151, 186)); 

         MSprzedazUtils.wpisDoLoga(tekstKom); 

        } 
        else 
        { 
         try 
         { 
         listaZaznaczonych.remove((int) 
              MSprzedazUtils.znajdzIdWliscieZazn(
              cursor.getInt(cursor.getColumnIndex("_id")), 
              listaZaznaczonych)); 
         MSprzedazUtils.wpisDoLoga(tekstKom); 
         } 
         catch(IndexOutOfBoundsException ex) 
         { 


         MSprzedazUtils.wpisDoLoga("Błąd"+tekstKom); 
         } 
        } 
       } 
      }); 

MySimpleCursorAdapter

public class MySimpleCursorAdapter extends SimpleCursorAdapter 
     { 
      class ViewHolder 
     { 
      CheckBox chckBoxZazn; 
      LinearLayout linLay; 
      TextView nrDok; 
      TextView typDok; 
      boolean isSelected; 
      TextView txtData; 
      TextView txtKontrahent; 
      TextView txtSuma; 
      TextView txtAnulowany; 
      TextView txtMiejscowosc; 
      TextView txtTermin; 
      TextView txtWyeksp; 
      TextView txtUwagi; 
     } 

     @Override 
     public void bindView(View convertView, Context context, Cursor cursor) 
     { 
      if (convertView.getTag() != null) 
       holder = (ViewHolder) convertView.getTag(); 
      { 
       // holder.linLay = (LinearLayout)convertView; 
       holder.chckBoxZazn = (CheckBox) convertView.findViewById(R.id.ID_FakturyRow_ChckBoxFakturyWybor); 
       holder.nrDok = (TextView) convertView.findViewById(R.id.ID_FakturyRow_NrFakt); 
       holder.typDok = (TextView) convertView.findViewById(R.id.ID_FakturyRow_Typ); 
       holder.txtAnulowany = (TextView) convertView.findViewById(R.id.ID_FakturyRow_Anulowany); 
       holder.txtData = (TextView) convertView.findViewById(R.id.ID_FakturyRow_Kontrahent); 
       holder.txtKontrahent = (TextView) convertView.findViewById(R.id.ID_FakturyRow_DataSprzed); 
       holder.txtMiejscowosc = (TextView) convertView.findViewById(R.id.ID_FakturyRow_Miejscowosc); 
       holder.txtSuma = (TextView) convertView.findViewById(R.id.ID_FakturyRow_Suma); 
       holder.txtTermin = (TextView) convertView.findViewById(R.id.ID_FakturyRow_Termin); 
       holder.txtWyeksp = (TextView) convertView.findViewById(R.id.ID_FakturyRow_Wyeksp); 
       holder.txtUwagi = (TextView) convertView.findViewById(R.id.ID_FakturyRow_Uwagi); 

      } 

      holder.chckBoxZazn.setTag(cursor.getPosition()); 


      holder.nrDok.setText(cursor.getString(cursor.getColumnIndex("NRDOK"))); 
      holder.typDok.setText(cursor.getString(cursor.getColumnIndex("NAZWADOK"))); 
      if (cursor.getString(cursor.getColumnIndex("DATA")) != null) 
       holder.txtData.setText(cursor.getString(cursor.getColumnIndex("DATA")).substring(0, 10)); 
      else 
       holder.txtData.setText("-"); 
      if (cursor.getInt(cursor.getColumnIndex("ANULOWANY")) == 0) 
       holder.txtAnulowany.setText("NIE"); 
      else 
       holder.txtAnulowany.setText("TAK"); 

      if (cursor.getString(cursor.getColumnIndex("NAZWASKR")) != null) 
       holder.txtKontrahent.setText(cursor.getString(cursor.getColumnIndex("NAZWASKR"))); 
      else 
       holder.txtKontrahent.setText("-"); 
      if (cursor.getString(cursor.getColumnIndex("MIEJSCOWOSC")) != null) 
       holder.txtMiejscowosc.setText(cursor.getString(cursor.getColumnIndex("MIEJSCOWOSC"))); 
      else 
       holder.txtMiejscowosc.setText("-"); 
      holder.txtSuma.setText(cursor.getString(cursor.getColumnIndex("SUMA"))); 
      if (cursor.getInt(cursor.getColumnIndex("WYEKSPORTOWANY")) == 0) 
      { 
       holder.txtWyeksp.setText("NIE"); 
       holder.txtWyeksp.setBackgroundColor(Color.BLACK); 
      } 
      else 
      { 
       holder.txtWyeksp.setText("TAK"); 
       convertView.setBackgroundColor(Color.DKGRAY); 
      } 
      if (cursor.getString(cursor.getColumnIndex("TERMIN")) != null) 
       holder.txtTermin.setText(cursor.getString(cursor.getColumnIndex("TERMIN")).substring(0, 10)); 
      else 
       holder.txtTermin.setText("-"); 
      holder.txtUwagi.setText(cursor.getString(cursor.getColumnIndex("UWAGI"))); 

      if (cursor.getCount() > 0 && cursor.getPosition() < cursor.getColumnCount()) 
       holder.chckBoxZazn.setChecked(jestZaznaczony[cursor.getPosition()]); 

     } 

     @Override 
     public void onClick(View v) 
     { 
      if (v.isFocusable()) 
      { 
       jestZaznaczony[cursor.getPosition()] = !jestZaznaczony[cursor.getPosition()]; 
       holder.chckBoxZazn.setChecked(jestZaznaczony[cursor.getPosition()]); 

      } 
    } 

} 

listview_row.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/ID_FakturyRow_KontrRow" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:orientation="horizontal" 
> 

<CheckBox 
    android:id="@+id/ID_FakturyRow_ChckBoxFakturyWybor" 
    android:layout_width="30dp" 
    android:layout_height="30dp" 
    android:focusable="false" 
    android:focusableInTouchMode="false" 
    android:text="" 
    android:textAppearance="?android:attr/textAppearanceSmall" 
    android:textSize="10dp" 
    true="" /> 

<TextView 
    android:id="@+id/ID_FakturyRow_NrFakt" 
    android:layout_width="120dp" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="0dp" 
    android:layout_marginRight="5dp" 
    android:focusable="false" 
    android:maxLength="10" 
    android:maxLines="1" 
    android:text="NrFakt" 
    android:textAppearance="?android:attr/textAppearanceSmall" 
    true="" /> 

<TextView 
    android:id="@+id/ID_FakturyRow_Typ" 
    android:layout_width="40dp" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="0dp" 
    android:layout_marginRight="5dp" 
    android:focusable="false" 
    android:maxLength="4" 
    android:maxLines="1" 
    android:text="Typ" 
    android:textAppearance="?android:attr/textAppearanceSmall" 
    true="" /> 

<TextView 
    android:id="@+id/ID_FakturyRow_Anulowany" 
    android:layout_width="46dp" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="10dp" 
    android:layout_marginRight="20dp" 
    android:maxLength="8" 
    android:maxLines="1" 
    android:text="Anulowany" 
    android:textAppearance="?android:attr/textAppearanceSmall" 
    android:focusable="false" /> 

<TextView 
    android:id="@+id/ID_FakturyRow_Kontrahent" 
    android:layout_width="80dp" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="0dp" 
    android:layout_marginRight="10dp" 
    android:maxLength="14" 
    android:maxLines="1" 
    android:text="Kontrahent" 
    android:focusable="false" 
    android:textAppearance="?android:attr/textAppearanceSmall" /> 

<TextView 
    android:id="@+id/ID_FakturyRow_DataSprzed" 
    android:layout_width="120dp" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="0dp" 
    android:layout_marginRight="10dp" 
    android:text="Data" 
    android:focusable="false" 
    android:textAppearance="?android:attr/textAppearanceSmall" /> 

<TextView 
    android:id="@+id/ID_FakturyRow_Suma" 
    android:layout_width="65dp" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="10dp" 
    android:layout_marginRight="0dp" 
    android:maxLines="1" 
    android:text="Suma" 
    android:focusable="false" 
    android:textAppearance="?android:attr/textAppearanceSmall" /> 

<TextView 
    android:id="@+id/ID_FakturyRow_Miejscowosc" 
    android:layout_width="80dp" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="10dp" 
    android:layout_marginRight="0dp" 
    android:text="Miejscowosc" 
    android:focusable="false" 
    android:textAppearance="?android:attr/textAppearanceSmall" /> 

<TextView 
    android:id="@+id/ID_FakturyRow_Termin" 
    android:layout_width="75dp" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="35dp" 
    android:layout_marginRight="25dp" 
    android:maxLength="18" 
    android:maxLines="1" 
    android:text="Termin" 
    android:focusable="false" 
    android:textAppearance="?android:attr/textAppearanceSmall" /> 

<TextView 
    android:id="@+id/ID_FakturyRow_Wyeksp" 
    android:layout_width="70dp" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="35dp" 
    android:layout_marginRight="0dp" 
    android:maxLength="16" 
    android:maxLines="1" 
    android:text="Wyeksp" 
    android:focusable="false" 
    android:textAppearance="?android:attr/textAppearanceSmall" /> 

<TextView 
    android:id="@+id/ID_FakturyRow_Uwagi" 
    android:layout_width="40dp" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="10dp" 
    android:layout_marginRight="0dp" 
    android:text="Termin" 
    android:focusable="false" 
    android:textAppearance="?android:attr/textAppearanceSmall" /> 

listview_layout.xml

<HorizontalScrollView 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/scroller" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_marginBottom="10dp" 
     android:fillViewport="true" > 

     <LinearLayout 
      xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/ID_FakturyListaButtons_HeaderLayoutWrapper" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginBottom="25dp" 
      android:orientation="vertical" > 

      ....... // Text Views as Listview header 
     </LinearLayout> 
     <RelativeLayout 
       android:id="@+id/ID_FakturyListaButtons_TabListaLayout" 
       android:layout_width="fill_parent" 
       android:layout_height="match_parent" 
       android:orientation="vertical" 

       > 

       <ListView 
        xmlns:android="http://schemas.android.com/apk/res/android" 
        android:id="@android:id/android:list" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 


        > 
       </ListView> 
      </RelativeLayout> 
     </LinearLayout> 
</HorizontalScrollView> 

我怎么可能让许多列是ListView控件来显示我点击ALL和唯一项目?

+0

在这里发表您的适配器。正如我所知道的,你应该存储自己的检查状态。 – zetsin

+0

我加了我所有的代码。那么我已经将检查状态存储在jestZaznaczony []数组中,其中索引是游标中的位置。对于我的波兰语变量名称抱歉,但将其更改为英语需要花费很多时间,并且与理解 – Prometeus

回答

6

这是因为Android回收了listView中的行。为了克服这个问题,你需要将你的行状态(选中或不选)保存在某个List或某个列表中,并使用它来设置一个选中或未选中的行。 在您的getView()函数中,您可以执行以下检查。这里enabledItems是一个列表

if (enabledItems.contains(eventTime)) { 
viewHolder.getCheckBox().setChecked(true); 
} else { 
viewHolder.getCheckBox().setChecked(false); 
} 

另外,看看下面的文章关于回收。 http://mobile.cs.fsu.edu/the-nuance-of-android-listview-recycling-for-n00bs/

2

您必须亲自存储检查的状态,并通过onItemClicked方法对其进行修改。

如何适配器可能与检查状态数组看起来简单例子:

public class ButtonCursorAdapter extends SimpleCursorAdapter { 

    private Cursor c; 
    private Context context; 
    private Activity activity; 
    public static int[] chkState; 
    private int layout; 

    public ButtonCursorAdapter(Context context, int layout, Cursor c, 
      String[] from, int[] to) { 
     super(context, layout, c, from, to); 

     this.c = c; 
     this.context = context; 
     this.activity = (Activity) context; 
     this.layout = layout; 
     // create an array to hold checked state, use zero for un-checked and 1 for checked 
     chkState = new int[c.getCount()];  // Set array size to # of elements in cursor 
     for(int i=1; i<c.getCount(); i++){  // loop through array 
      chkState[i] = 0;     // set initial state to 0 - not checked 
     } 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView == null) 
      convertView = View.inflate(context, layout, null); 
     final int pos = position; 
     View row = convertView; 

     c.moveToPosition(position); 

     // do your data assignement stuff here 

     // set the state of your checkbox 
     if (chkState[position] == 0) { 
      // set the checkbox to checked 
     } else { 
      // set the checkbox to unchecked 
     } 
    return (row);  
    } 
} 
+0

的机制无关。我在ArrayList中使用了解决方案(在OnClick中,我将db列的id添加到检查项列表中) - 但在我的CursorAdapter中没有运气 - 滚动时随机检查项目 – Prometeus

+0

您不能使用行标识,它与适配器位置不同。您需要使用适配器位置。 – Barak

+1

如果有其他项目被添加,删除或切换到列表会怎么样? chkState列表不会与真实列表不同步吗? –

相关问题