2011-07-17 9 views
2

リストビューが完全に機能していたので、コンテキストメニューを追加することにしました。通常、リストビューでアイテムをクリックするたびに、リスト全体が最初のクリックで反転されます。後続のクリックはオーダーに何も行われませんが、最初のアイテムが再び選択解除されると、リストは正常に戻ります。私が追加したコンテキストメニューのロジックを取り除くと、リストビューの問題は解決されません。 選択時にリストビューのリストが逆になる

私は、デバッガと私のリストアダプタの要素を添付しました

は、並べ替えされることはありませんし、ListViewコントロール自体は、私のonClickリスナーがリストのクリックイベントを処理するために登録されている。ここ .setStackFromBottom()

で逆転するように設定されることはありませんビューアイテム:

public void onClick(View v) { 
    ViewHolder holder = (ViewHolder) v.getTag(); 
    CheckBox b = holder.box; 
    Boolean check = b.isChecked(); 
    b.setChecked(!check); 
    if (!check) { 
     mChecked.add(holder.fu); 
     if (mChecked.size() == 1) { 
     buttonLayout.setVisibility(View.VISIBLE); 
     } 
    } else { 
     mChecked.remove(holder.fu); 
     if (mChecked.size() == 0) { 
     buttonLayout.setVisibility(View.GONE); 
     } 
    } 
} 

ビューホルダークラスは、リストビューで最適化を行うオブジェクトへの参照を保持しています。なぜ私のリストが表示されたときにリストが反転する原因になっているのかわかりません。レイアウト内の別のビューにリスナーを移動しようとしました。リスナーを書き直そうとしましたが、何も動作しません。アドバイスをいただければ幸いです。

編集:[OK]を
、私は視界にそれを絞り込むました:UPDATE

public class FillUpAdapter extends BaseAdapter { 

     ArrayList<FillUp> mElements; 
     ArrayList<FillUp> mChecked; 
     Context mContext; 

     public FillUpAdapter(Context c, ArrayList<FillUp> data) { 
      mContext = c; 
      mElements = data; 
      mChecked = new ArrayList<FillUp>(); 
     } 

     public void clearChecked() { 
      mChecked.clear(); 
     } 

     public ArrayList<FillUp> getChecked() { 
      return mChecked; 
     } 

     public boolean remove(FillUp f) { 
      mChecked.remove(f); 
      return mElements.remove(f); 
     } 

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

     @Override 
     public Object getItem(int arg0) { 
      return mElements.get(arg0); 
     } 

     @Override 
     public long getItemId(int arg0) { 

      return mElements.get(arg0).getId(); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      LinearLayout layout; 
      ViewHolder holder; 
      if (convertView != null) { 
       layout = (LinearLayout) convertView; 
       holder = (ViewHolder) layout.getTag(); 
      } else { 
       layout = (LinearLayout) LayoutInflater.from(mContext).inflate(
         R.layout.fillup_list_item, parent, false); 
       holder = new ViewHolder(); 
       holder.cost = (TextView) layout 
         .findViewById(R.id.fillUpListTotalValue); 
       holder.cpg = (TextView) layout 
         .findViewById(R.id.fillUpListCostPerGal); 
       holder.gallons = (TextView) layout 
         .findViewById(R.id.fillUpListGalValue); 
       holder.mpg = (TextView) layout 
         .findViewById(R.id.fillUpMPGText); 
       holder.date = (TextView) layout 
         .findViewById(R.id.fillUpListDate); 
       holder.box = (CheckBox) layout 
         .findViewById(R.id.fillUpListCheckBox); 
       holder.fu = (FillUp) getItem(position); 
       layout.setTag(holder); 

      } 

      holder.date.setText(holder.fu.getDate()); 
      holder.gallons.setText(holder.fu.getGallonsText()); 
      holder.cpg.setText(holder.fu.getCostText()); 
      holder.cost.setText(holder.fu.getTotalText()); 
      holder.mpg.setText(String.format("%03.1f MPG",holder.fu.getMPG())); 
      if (convertView != null) { 
       holder.box.setChecked(mChecked.contains(holder.fu)); 
      } 

      layout.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        ViewHolder holder = (ViewHolder) v.getTag(); 
        CheckBox b = holder.box; 
        Boolean check = b.isChecked(); 
        b.setChecked(!check); 
        if (!check) { 
         mChecked.add(holder.fu); 
         if (mChecked.size() == 1) { 
          buttonLayout.setVisibility(View.VISIBLE); 
         } 
        } else { 
         mChecked.remove(holder.fu); 
         if (mChecked.size() == 0) { 
          buttonLayout.setVisibility(View.GONE); 
         } 
        } 
       } 
      }); 
      return layout; 
     } 
} 

:ここに表示ホルダー

/** Class to provide a holder for ListViews. Used for optimization */ 
private class ViewHolder { 
    TextView date; 
    TextView gallons; 
    TextView cost; 
    TextView cpg; 
    TextView mpg; 
    CheckBox box; 
    FillUp fu; 
} 

だけでなく、アダプターのコードですアクティビティのレイアウトの下部にあるListViewの下のボタンの線形レイアウトであるbuttonLayoutビューで変更します。そのビューの可視性をView.VISIBLEに変更すると(最初のアイテムがチェックされたときに発生します)、リストの順序が逆になります。ビューの可視性がView.GONE私は:(

+2

おそらくアダプタに何かがあります。コード – Blundell

+1

はい、このような症状の問題は、ほとんどの場合、アダプタのバグを示しています。 – adamp

+0

アダプタコード – Gallal

答えて

1

もう少し範囲を狭める後、私はこの問題は、私のボタンバーの可視性の変更はありませんでしたが、実際に発見されましたFillUpのオブジェクトはholder.fuのにあります。クラス。代わりにアダプタのgetItem(position)メソッドを参照するように変更することで、すべてがうまくいくように見えました。アダプタ自体が要素の順序を変更していないので、かなり奇妙なバグですが、オブジェクトへの参照を渡すと非常に不幸になりました。

-1

かかわらず、あなたのリストビューの背景色が変更された場合、あなたがそれをクリックすると、その原因となるのか見当がつかない

に設定されているときに注文が復元され、私はそれはあなたのテーマについてだと思います。ちょうどあなたのリストビューのキャッシュ色パラメータで遊ぶ、ここでの例です:

<ListView 
      android:layout_width="fill_parent" 
      android:id="@android:id/list" 
      android:scrollingCache="true" 
      android:persistentDrawingCache="all" 
      android:cacheColorHint="#0000" 
      android:layout_height="wrap_content" 
      android:fastScrollEnabled="true" 
      android:stackFromBottom="true" 
      android:smoothScrollbar="true" 
      android:paddingTop="115dip"> 
</ListView> 
+0

色は変更されず、リストの順序が変更されます。 – Sleepybear

関連する問題