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()将返回两个(因为您有两种类型的行?!?),然后实现逻辑以确定正确的行类型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 回答