java - 为什么我的 ListView 适配器在新 View 上没有显示正确的布局?

标签 java android

我有一个自定义光标适配器,它基于 android 中的彩信和短信数据库。代码如下所示:

@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 用于接收消息。 但是看看我的消息, ListView 正确显示时首先显示的行,但是当我将 ListView 转到新 View 时,布局会混合在一起。接收布局是发送布局应该在的位置,反之亦然。有谁知道为什么会出现这种问题吗?

* 编辑 **

@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
}

最佳答案

But looking at my messages, the rows that are first shown when the listview are shown correctly, but when I go up the listview to new views, the layouts are mixed up.

发生这种情况可能是因为您没有正确处理 ListView 回收机制。 newView 方法不会为每一行调用,而是在没有可用于行布局的回收 View 时调用(例如首次显示 ListView 时,这就是行以正确顺序出现的原因)。否则,ListView 将使用回收的 View ,该 View 可能是也可能不是正确的 View 类型。

您应该使用方法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;
    }
}

关于java - 为什么我的 ListView 适配器在新 View 上没有显示正确的布局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11567585/

相关文章:

android - 如何将样式应用于所有按钮而不是 ImageButtons?

java - 将字符串设置为 long[] 以实现振动功能

c# - 使用 .NET 的 Xamarin iOS 本地化

java - 正则表达式使用分隔符分割文本,但当分隔符位于 () 之间时不分割

java - 循环屏障无法实现同步

java - Android 正确的变量声明

java - 如何避免 NoClassDefFoundError : android/os/PersistableBundle on pre-L?

android - 是否存在谷歌将 webgl 列入黑名单的所有设备的列表?

java - 如何对原始数据类型数组调用java内置TimSort

java - 使用 Fragment 类中的数据库填充 android ListView 时发生意外错误