2016-08-02 8 views
0

CursorAdapterでのAndroidのnewViewとgetViewの動作について混乱します。 私がこれまでに見た実装のほとんどはgetViewを実装していますが、多くのオンラインソースはそれが道ではないことを示唆しています。例えばhereです。 bindView画像を設定しながらCursorAdapterがnewViewとbindViewの間で矛盾します

私の問題は、コードnewViewは、(画像の左または右に位置合わせを含む)のレイアウトを設定すること

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 

    // Decide if message was sent by Me or Other 
    View chatRow; 
    if(cursor.getInt(cursor.getColumnIndexOrThrow(DbChat.KEY_SENDER_ID)) == 0) { 
     chatRow = LayoutInflater.from(context.getApplicationContext()) 
        .inflate(R.layout.listrow_chat_me,parent,false); 
    } else { 
     chatRow = LayoutInflater.from(context.getApplicationContext()) 
        .inflate(R.layout.listrow_chat_other,parent,false); 
    } 

    return chatRow; 
} 

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

    TextView chatText = (TextView) view.findViewById(R.id.chat_text); 
    ImageView imageView = (ImageView) view.findViewById(R.id.chat_img); 

    chatText.setText(cursor.getString(cursor.getColumnIndexOrThrow(DbChat.KEY_TEXT))); 

    if(cursor.getInt(cursor.getColumnIndexOrThrow(DbChat.KEY_SENDER_ID)) == 0) { 
     imageView.setImageDrawable(ChatActivity.sIconBlue); 
    } else { 
     imageView.setImageDrawable(ChatActivity.sIconRed); 
    } 

注の次のビットに要約(この場合には青または赤) 。 したがって、(色と位置の両方がカーソル上の同じIDチェックを照会するため)すべての赤い四角が左に、青の四角が右にあることが予想されます。 は代わりに、私は次のようなレイアウトを得る:

enter image description here

は基本的に、私の問題は、このquestionと同じですが、私は私の問題を解決するための提案のいずれかを見つけることができませんでした。

この奇妙な動作や問題の解決方法についてお返事いただき、ありがとうございます。デフォルトでは、ListView(できるだけ頻繁にビューを再利用するCursorAdapterトライを取り、他のソースによって

答えて

1

したがって

newView()は十分なビューが作成されるまでの間だけと呼ばれ、その後、唯一bindView()はあなたと呼ばれています

ビュータイプが複数ある場合は、getViewTypeCount()getItemViewType()を上書きする必要があります。これらのメソッドは、アダプタに同じタイプを再利用して、listrow_chat_meは、将来のlistrow_chat_me行にのみ使用され、listrow_chat_other行には再利用されません。デフォルトでは

@Override 
public int getViewTypeCount() { 
    return 2; 
} 

@Override 
public int getItemViewType(int position) { 
    // getItem(position) returns a Cursor at the given position 
    Cursor cursor = (Cursor) getItem(position); 
    if (cursor.getInt(cursor.getColumnIndexOrThrow(DbChat.KEY_SENDER_ID)) == 0) { 
    return 0; 
    } else { 
    return 1; 
    } 
} 
+0

をオーバーライド調査! getItemViewType(int pos)メソッド内の個々のデータ要素にアクセスするために、getCursor()。moveToPosition(pos)を使用しました。 – untergam

+0

'cursor =(Cursor)getItem(pos)'と 'getCursor()。moveToPosition(pos)'の間の効率については、コードに答えを追加しましたか? – untergam

+0

どちらも機能します! [getItem()のコード](https://android.googlesource.com/platform/frameworks/support/+/refs/heads/master/v4/java/android/support/v4/widget/CursorAdapter)に注目します。 .java#208)は非常に簡単です。 – ianhanniballake

0

、カーソルアダプターを使用すると、左の子供たちを見ているので、なぜ、行タイプに基づいて意見を一列のみのレイアウトを想定して再利用します。

二つの選択肢があります:魔法のように動作し、迅速な応答をありがとうつのビューを使用すると、ちょうど結合する際、必要に応じてノートを隠し、または方法

getItemViewType(int position) 

getViewTypeCount() 
関連する問題