【问题标题】:How to use CursorAdapter with better solution?如何使用具有更好解决方案的 CursorAdapter?
【发布时间】:2019-06-13 05:49:16
【问题描述】:

我使用 CursorAdapter 开发了聊天 UI。 几乎它与 CursorAdapter 配合得很好,但有时会出现奇怪的结果。 当我快速滚动 ListView 时,会导致奇怪的问题。

基本上我尝试将 getView 用于 CursorAdapter。 下面的代码是我使用的东西。

private static final String[] PROJECTION = {
        Messages._ID, // 0
        Messages.MESSAGEID, // 1
        Messages.PHONE, // 2
        Messages.BODY, // 3
        Messages.INCOMING, // 4
        Messages.THUMBNAIL, // 5
        Messages.TYPE, // 6
        Messages.TIMESTAMP, // 7
        Messages.STATUS, // 8
        Messages.MESSAGE_KEY, // 9
        Messages.TIMEOUT,   //10
        Messages.MEDIA_SIZE,    //11
        Messages.MEDIAURL, //12
        Messages.MEDIA_NAME, //13
        Messages.USERID, //14
};

public static Loader<Cursor> createCursorLoader(Context context,
                                                String chatId, int showingCount) {

    Uri uri = Messages.CONTENT_URI.buildUpon().appendPath("get_messages_some").appendPath(String.format(Locale.getDefault(), "%d", showingCount)).build();

    return new CursorLoader(context, uri, PROJECTION, Messages.HAS_CHATID +
            " AND " + Messages.TYPE + "!=-1", new String[] { chatId }, Messages._ID +" ASC");
}

private View newView(Context context, int position) {

    Cursor cursor = (Cursor) getItem(position);

    if (cursor == null) {
        return null;
    }

    boolean incoming = cursor.getInt(INCOMING) == 1;
    MessageListItem item = mItemFactory.newItem(context, incoming);
    return item;
}

private void bindView(View view, Context context,int position) {

    final Cursor cursor = (Cursor) getItem(position);

    if (cursor == null) {
        return;
    }

    final MessageListItem item;
    try {
        item = (MessageListItem) view;
    }
    catch(RuntimeException e) {
        return; //load earlier buttons
    }

    final String messageId = cursor.getString(MESSAGE_KEY);
    item.setMessageKey(messageId);
    setTextItem(item, cursor);
}

private void setTextItem(final MessageListItem item, final Cursor cursor) {

    String messageId = item.getMessageKey();
    if (messageId.equals(cursor.getString(MESSAGE_KEY))) {
            //wrong result 1
            //sometime I got wrong text from cursor.getString(BODY)  
            item.setText(cursor.getString(BODY));
    }
    else {
            // here is exist issue. Why two messageId is different???
            //wrong result 2
    }
}

1 路

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View v;
    if (convertView == null) {
        v = newView(mContext, position); //custom function
    } else {
        v = convertView;
    }
    bindView(v, mContext, position); //custom function
    return v;
}

@Override
public View newView(Context context, Cursor cursor, ViewGroup viewGroup)    {
    return null;
}

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

}

2路

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View v;
    if (convertView == null) {
        v = newView(mContext, position);
    } else {
        v = convertView;
    }

    return super.getView(position, v, parent);
}

@Override
public View newView(Context context, Cursor cursor, ViewGroup viewGroup)    {
    return null;
}

@Override
public void bindView(View view, Context context, Cursor cursor) {
    bindView(view, context, cursor.getPosition()); //custom function
}

例如,我想显示如下文本数组。

一个

B

C

D

E

但结果和上面不一样。

错误的结果 1

一个

B

D

D

E

错误的结果 2

一个

B

D

E

什么是最好的解决方案?

提示:我必须使用 getView() 函数。

【问题讨论】:

  • 可以分享给你整个 Adapter 类吗?
  • 谢谢你的回复,我已经更新了我的代码,实际上我的适配器太大了,如果你想看一些代码,我可以分享更多细节
  • 我有点疑惑,所以想看看适配器代码。无论如何,你能在这里解释一下“光标”吗:Cursor cursor = (Cursor) getItem(position);这是数据库游标吗?你想渲染什么?光标列表?
  • 是的,数据库Cursor,我已经更新了CursorLoader
  • setTextItem 函数中,Cursor 好像移到了下一个,为什么?

标签: android android-cursoradapter


【解决方案1】:

我通过传递位置而不是光标对象解决了这个问题。

setTextItem(item, position);

private void setTextItem(final MessageListItem item, final int position) {

   Cursor cursor = (Cursor) getItem(position);

    String messageId = item.getMessageKey();
    if (messageId.equals(cursor.getString(MESSAGE_KEY))) {
        item.setText(cursor.getString(BODY));
    }    
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    • 2021-08-24
    • 2013-10-22
    相关资源
    最近更新 更多