2013-07-05 21 views
0

在我的應用程序中,我有一個ListViewArrayAdapter。當我在ListView中選擇一個元素時,我可以看到更多的選定元素。android:ListView中的混沌選擇

此外,當我滾動ListView中的元素(選擇後)時,我的選擇消失,並隨機選擇元素。

適配器代碼:

final ListAdapter adapter = new ArrayAdapter<BinLocationsComponent>(activity, R.layout.simple_list_item_multiple_choice, locationComponents) { 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      convertView = layoutInflater.inflate(layout.simple_test_layout_with_one_text_field, null); 
     } 
     return convertView; 
    } 
}; 

看起來像某些參數進行設置。

你能幫我解決這個問題嗎?


UPD1

final ListAdapter adapter = new ArrayAdapter<BinLocationsComponent>(activity, R.layout.simple_list_item_multiple_choice, locationComponents) { 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     final LocationsViewHolder viewHolder; 
     if (convertView == null) { 
      convertView = layoutInflater.inflate(layout.rp_bin_locations_block_element, parent, false); 
      viewHolder = new LocationsViewHolder(); 
      viewHolder.init(convertView); 
      convertView.setTag(viewHolder); 
     } else { 
      viewHolder = (LocationsViewHolder) convertView.getTag(); 
     } 
     final BinLocation binLocation = locationComponents.get(position).getBinLocation(); 
     if (binLocation != null) { 
      viewHolder.provideValues(binLocation); 
     } 
     return convertView; 
    } 

    class LocationsViewHolder { 
     TextView stationName; 
     TextView rackName; 
     TextView binName; 
     TextView volume; 
     NumberPicker numberOfItems; 

     public void init(View view) { 
      stationName = (TextView) view.findViewById(id.ro_station_name); 
      rackName = (TextView) view.findViewById(id.ro_rack_name); 
      binName = (TextView) view.findViewById(id.ro_bin_name); 
      volume = (TextView) view.findViewById(id.ro_volume_value); 
      numberOfItems = (NumberPicker) view.findViewById(id.ro_number_of_items); 
     } 

     public void provideValues(BinLocation location) { 
      stationName.setText(location.getStationName()); 
      rackName.setText(location.getRackName()); 
      binName.setText(location.getBinName()); 
      volume.setText(valueOf(location.getVolume())); 
     } 

    } 
}; 

和simple_list_item_multiple_choice它的Android SDK的文件:

<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1" 
    android:layout_width="match_parent" 
    android:layout_height="?android:attr/listPreferredItemHeightSmall" 
    android:textAppearance="?android:attr/textAppearanceListItemSmall" 
    android:gravity="center_vertical" 
    android:checkMark="?android:attr/listChoiceIndicatorMultiple" 
    android:paddingStart="?android:attr/listPreferredItemPaddingStart" 
    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" 
/> 
+0

請發表'simple_list_item_multiple_choice.xml'源代碼以獲得準確答案。 –

回答

2

哇,它在你第一次面對ListView的第一道關卡。別擔心。首先了解ListView如何工作,其重要。否則,你不能掌握ListView。用最簡單的單詞:ListView創建幾行View s,並將它們用於每一行。因此,如果您的ListView中有50個元素,則可能只有10次getView()被調用時convertView爲空。所以簡而言之,如果你不更新getView()方法中每個位置的視圖狀態,這將是一個混亂。請在您的ListView中使用查看持有人模式。它將大幅增加滾動並將利用更少的資源。更多關於查看持有人模式http://www.jmanzano.es/blog/?p=166

UPDATE:

我說

因此,在短期,如果你不更新內部getView()方法的視圖狀態的每一個位置,這將真正是一個混亂。

private SparseBooleanArray checkedPositions = new SparseBooleanArray();// class variable 


listView.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 
      if(checkedPositions.get(position)){ 
       checkedPositions.put(position, false); 
      }else{ 
       checkedPositions.put(position, true); 
      } 
     } 

    }); 

現在在你的getView()

((CheckedTextView)convertView.findViewById(R.id.checkedTextView)).setChecked(checkedPositions.get(position)); 

根據您的需要調整此代碼。 您可以在您的BinLocation中有一個布爾變量來維護已檢查的職位。但請記住並理解getView()內維護狀態的要點。

+0

感謝您的答覆,我根據模式改變的代碼,但仍然有問題..代碼是在上面更新.. – vetalitet

+0

是的,它的工作原理。非常感謝您的幫助! – vetalitet