0

AndroidのMMSおよびSMSデータベースに基づくカスタムカーソルアダプターがあります。コードは次のようになります。

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

    Message m = Message.getMessage(context, cursor); // gets message from cursor
    int t = m.getType(); // this gets the type of message it is .. 2 = recv, 1 = sent

    switch(t){
    case Message.MMS_IN: // 128
        return mInflater.inflate(R.layout.messagelist_item_recv, parent, false);
    case Message.MMS_OUT: // 132
        return mInflater.inflate(R.layout.messagelist_item_sent, parent, false);
    case Message.SMS_IN: // 2
        return mInflater.inflate(R.layout.messagelist_item_recv, parent, false);
    case Message.SMS_OUT: // 1
        return mInflater.inflate(R.layout.messagelist_item_sent, parent, false);
    default:
        return null;
    }
}

R.layout.messagelist_item_sent送信済みメッセージ用で、R.layout.messagelist_item_recvは受信済みメッセージ用です。しかし、私のメッセージを見ると、リストビューが正しく表示されたときに最初に表示される行ですが、リストビューを新しいビューに移動すると、レイアウトが混同されます。recvレイアウトは、送信されたレイアウトがあるはずの場所であり、その逆も同様です。なぜこの種の問題が発生するのか誰もが知っていますか?

* 編集 **

@Override
public int getItemViewType(int position) {
     // move the cursor to the position
Cursor c = (Cursor)getItem(position);
Message m = Message.getMessage(context, c);

if (isInbox(m.getType())){
   inflater.inflate(recv view);
 // it's been shortened 
} else {
   inflater.inflate(send view);   
// and determine the correct type of row layout
     // return 0 or 1
     // use the code that you currently have from the newView method
}
4

1 に答える 1

5

しかし、私のメッセージを見ると、リストビューが正しく表示されたときに最初に表示される行ですが、リストビューを新しいビューに移動すると、レイアウトが混同されます。

これは、ListViewリサイクルメカニズムを正しく処理していないために発生している可能性があります。このnewViewメソッドは行ごとに呼び出されるのではなく、行のレイアウトに使用される再利用されたビューがない場合に呼び出されます(ListView最初に表示されたときのように、行が正しい順序で表示されるのはそのためです)。それ以外の場合はListView、適切なタイプのビューである場合とそうでない場合があるリサイクルビューを使用します。

メソッドgetViewTypeCount()とを使用する必要がありgetItemViewType()ます。このメソッドgetViewTypeCount()は2つを返し(2つのタイプの行があるので?!?)、ロジックを実装して:の正しい行タイプを判別しますgetItemViewType

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

@Override
public int getItemViewType(int position) {
     Cursor c = (Cursor)getItem(position);
     Message m = Message.getMessage(context, c);
     switch(m.getType()){
         case Message.MMS_IN: // 128
             return 1;
         case Message.MMS_OUT: // 132
             return 0;
         case Message.SMS_IN: // 2
             return 1;
         case Message.SMS_OUT: // 1
             return 0;
         default:
             return 0;
      }
}

次に、newViewメソッドで:

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    int rowType = getItemViewType(cursor.getPosition());
    if (rowType == 0){
        return mInflater.inflate(R.layout.messagelist_item_sent, parent, false);
    } else if (rowType == 1){    
        return mInflater.inflate(R.layout.messagelist_item_recv, parent, false);
    } else {
        return null;
    }
}
于 2012-07-19T19:53:44.510 に答える