使用CursorAdapter进行聊天泡泡ListView:滚动时位置错误

时间:2013-09-21 09:40:17

标签: android android-listview android-cursoradapter

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

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

正如您所看到的那样,布局只有两个区别:背景和方向(左,右)。我将以编程方式选择布局,如果消息是我的,或者是我正在谈话的用户。

这是列表视图行的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>

如您所见,我在参数的基础上切换布局。最初一切都还可以,但是当我开始滚动列表视图时,布局会以错误的方式分配,就像适配器丢失了一样。

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

有什么问题?谢谢!

2 个答案:

答案 0 :(得分:1)

当数据是要显示的bindet时,你应该使用一个视图来显示左右消息并在bindView中更改重力。

现在你有方法newView谁创建视图但滚动视图时重复使用(有时会有橙色,有时会有绿色)

删除newView metod,使所有东西都在bindView中(使用一个视图) - 将更简单干净; - )

我在我的消息列表中创建它 - 改变LinearLayout的重力

但是如果你必须使用2视图使用getView来扩展视图 - 但是你失去了有效的视图创建(重用)

答案 1 :(得分:0)

在文本框中添加final或使用文本框的holder