gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:30:27 24 4
gpt4 key购买 nike

我有一个自定义光标适配器,它基于 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com