2016-06-19 9 views
3

私はとても混乱しています。私はネット上でいくつかの提案を見つけましたが、私はこのコードで実装することはできません。ここに私の問題がある。私がスクロールするたびに、リストビューの順序が狂ってしまいます。私は何をすべきか分かりません。私は本当に助けが必要です。私は本当にあなたの優しさを感謝します。ここに私のコードは次のとおりです。アンドロイドでListViewAdapterは、スクロールするとCursorAdapterの順序が狂ってしまいます

public class ListViewAdapterMeasurement extends CursorAdapter { 
    TextView lblContent, lblDate; 
    DBHelper dbHelper; 
    Button btnSelect; 

    public ListViewAdapterMeasurement(Context context, Cursor c) { 
     super(context, c, FLAG_REGISTER_CONTENT_OBSERVER); 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     View view = LayoutInflater.from(context).inflate(R.layout.details_feed, parent, false); 

     lblContent = (TextView) view.findViewById(R.id.lblContent); 
     lblDate = (TextView) view.findViewById(R.id.lblDate); 

     return view; 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 

     View convertView = view; 
     if (convertView == null) 
     { 
      LayoutInflater vi = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      view = vi.inflate(R.layout.details_feed, null); 
     } 

     dbHelper = new DBHelper(getApplicationContext()); 

     int intContentIndex = cursor.getColumnIndex((Tables.FeedTable.COLUMN_CONTENT)); 
     String strContentIndex = cursor.getString(intContentIndex); 
     int intDateIndex = cursor.getColumnIndex((Tables.FeedTable.COLUMN_DATE)); 
     String strDateIndex = cursor.getString(intDateIndex); 

     lblContent.setText(strContentIndex); 
     lblDate.setText(strDateIndex); 


    } 
} 
+2

あなたのアダプタがすべてのビューのために使用されています! uiコンポーネントをメンバー変数として使用せず、bindViewメソッドで参照してください。 –

+0

@HenningLutherは、newViewで初期化を削除してbindViewメソッドに転送する必要があることを意味しますか? newViewの –

+1

:return LayoutInflater.from(コンテキスト).inflate(R.layout.details_feed、parent、false); in bindView: TextView lblContent =(TextView)view.findViewById(R.id.lblContent); TextView lblDate =(TextView)view.findViewById(R.id.lblDate); –

答えて

2

ビューは「newView」から既にインスタンスビューは「bindView」once.Toは明確である以上で使用することができることを意味、数回使用することができます:「newView」であり、 bindViewより頻繁には呼ばれない(< =)。そのために状態を「newView」に保存することは、あなたができることではありません。 "newView"では、このアダプタからインスタンス化されたすべてのビューのうち、 "bindView"で操作されなかったビューをカウントするプロパティのみを操作できます。再利用されたビューが出現する可能性があるので、各行(またはアイテム)のすべての動的値は「bindView」で設定されます。アダプターに行(または項目)の単一の内部ビューを保管すると、予期しない動作が発生し、実行できなくなります。これがあなたの問題です。 "view-object-pool"にまだインスタンス化されていないフリー(表示/リサイクル不可)ビューが存在しない場合、 "newView"が呼び出されます。また、すでに埋め込まれたビューがここに来て、特殊な状況で特定の行/アイテムのプロパティが設定されていない場合、 "bindView"の特定のサブビューをリセットすることを検討する必要があります。最後に:指定されたビューが新しく構築またはリサイクルされたビューであるかどうかを "bindView"で知ることはできません。そのことを希望する。ハッピーコーディング

+0

非常によく言った。ありがとうございました! –

2

コードの主な問題は、lblContentlblDateがアダプタのメンバーであり、newView()が呼び出されるといつでも上書きされるということです。代わりに、それぞれのViewに対してこれらの変数のペアを格納し、newView()にインスタンス化し、bindView()で使用する必要があります。

これを達成するには、いわゆるViewHolder patternを使用できます。このパターンの背後にある一般的な考え方は、以下のコードで見ることができます(元のコードに基づいていますが、私はそれをテストしていない):

public class ListViewAdapterMeasurement extends CursorAdapter { 

    /** 
    * One instance of this class will be attached to each View in order to prevent 
    * repeated calls to findViewById() 
    */ 
    private static class ViewHolder { 
     private TextView lblContent; 
     private TextView lblDate; 

     public ViewHolder(TextView content, TextView date) { 
      lblContent = content; 
      lblDate = date; 
     } 

    } 


    DBHelper dbHelper; 

    public ListViewAdapterMeasurement(Context context, Cursor c) { 
     super(context, c, FLAG_REGISTER_CONTENT_OBSERVER); 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     View view = LayoutInflater.from(context).inflate(R.layout.details_feed, parent, false); 

     TextView lblContent = (TextView) view.findViewById(R.id.lblContent); 
     TextView lblDate = (TextView) view.findViewById(R.id.lblDate); 

     ViewHolder viewHolder = new ViewHolder(lblContent, lblDate); // put references to sub-Views into ViewHolder 

     view.setTag(viewHolder); // attach ViewHolder to each newly created View 

     return view; 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 

     dbHelper = new DBHelper(getApplicationContext()); 

     int intContentIndex = cursor.getColumnIndex((Tables.FeedTable.COLUMN_CONTENT)); 
     String strContentIndex = cursor.getString(intContentIndex); 
     int intDateIndex = cursor.getColumnIndex((Tables.FeedTable.COLUMN_DATE)); 
     String strDateIndex = cursor.getString(intDateIndex); 

     ViewHolder viewHolder = (ViewHolder) view.getTag(); // retrieve View's ViewHolder 

     viewHolder.lblContent.setText(strContentIndex); 
     viewHolder.lblDate.setText(strDateIndex); 
    } 

} 
+0

助けてくれてありがとう。 :) –

関連する問題