gpt4 book ai didi

android - 带有 CursorAdapter : wrong position when scroll 的聊天气泡 ListView

转载 作者:行者123 更新时间:2023-11-30 03:22:15 24 4
gpt4 key购买 nike

我正面临聊天布局的实现。

我有一些来自 sqlite DB 的数据、一个 Cursor Adapter 和 2 个布局:- 一个在右边显示数据- 在左侧显示数据的

如您所见,布局只有两个区别:背景和方向(左、右)。如果消息是我的或来自与我交谈的用户,我将以编程方式选择布局。

这是 ListView 行的 2 种布局。

右侧布局:

<RelativeLayout  xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">

<TextView
android:id="@+id/roomLisViewtMessageText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:background="@drawable/speech_bubble_green"
android:layout_margin="5dip"
android:textColor="#FFF"
android:textSize="20sp" /></RelativeLayout>

左布局

<RelativeLayout  xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">

<TextView
android:id="@+id/roomLisViewtMessageText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:background="@drawable/speech_bubble_orange"
android:layout_margin="5dip"
android:textColor="#FFF"
android:textSize="20sp" /></RelativeLayout>

如您所见,我根据参数切换了布局。最初一切正常,但是,当我开始滚动 ListView 时,布局以错误的方式分配,就好像适配器丢失了一些东西一样。

public class MyCursorAdapter extends CursorAdapter {

private static final String tag = "ADAPTER";
private LayoutInflater layoutInflater;
private Context mContext;

public MyCursorAdapter (Context context, Cursor c, int flags) {
super(context, c, flags);
mContext = context;
layoutInflater = LayoutInflater.from(context);
}

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

int isMine = cursor.getInt(cursor.getColumnIndexOrThrow(DatabaseHelper._IS_MINE));
if(isMine==1) return layoutInflater.inflate(R.layout.room_list_view_left, parent, false);
else return layoutInflater.inflate(R.layout.room_list_view_right, parent, false);
}

/**
* @param view: The view in which the elements we set up here will be displayed.
* @param context: The running context where this ListView adapter will be active.
* @param cursor: The Cursor containing the query results we will display.
*/
@Override
public void bindView(View view, Context context, Cursor cursor) {

Log.v(tag,"position---->"+cursor.getPosition());
int isMine = cursor.getInt(cursor.getColumnIndexOrThrow(DatabaseHelper.IS_MINE));
String mess = cursor.getString(cursor.getColumnIndexOrThrow(DatabaseHelper.MESSAGE));

TextView messText = (TextView) view.findViewById(R.id.myLisViewtMessageText);
if (messText != null){
if(isMine==1){
Log.d(tag,"mess = "+mess+" isMine = "+isMine);
}
else{
Log.d(tag,"mess = "+mess+" isMine = "+isMine);
}
messText.setText(mess);
}
}

所以我在图片 1 中有一个正常的行为,在向下滚动并返回顶部后,我看到类似图片 2 的消息,并且每次滚动屏幕都会发生变化。

image 1 image 2

怎么了???谢谢!!

最佳答案

您应该对左右消息使用一个 View ,并在绑定(bind)显示数据时在 bindView 中更改引力。

现在你有创建 View 的方法 newView 但是当你 ScrollView 时会被重用(有时有橙色,有时有绿色)

删除 newView 方法并在 bindView 中创建所有内容(使用一个 View )- 将更加简单和干净;-)

我在我的消息列表中做了 - 改变 LinearLayout 的引力

但是,如果您必须使用 2 个 View ,请使用 getView 来扩充 View - 但是您会失去高效的 View 创建(重用)

关于android - 带有 CursorAdapter : wrong position when scroll 的聊天气泡 ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18931135/

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