2013-09-21 3 views
1

Я столкнулся с реализацией макета чата.chat-bubble ListView с CursorAdapter: неправильное положение при прокрутке

У меня есть некоторые данные, которые приходят из БД SQLite, курсор адаптера и 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> 

Layout покинул

<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); 
    } 
} 

Так у меня есть нормальный behaviur в изображении 1 и после прокрутки вниз и вернуться в верхней части я вижу сообщение, как на картинке 2 и для каждого прокручивать изменения экрана.

image 1 image 2

Что не так ??? Благодаря!!

ответ

0

добавить окончательным в текстовом поле или держатель для использования текстового поля

+0

Я пробовал им образец держателя плеера, но пока не работает. Поскольку я знаю, что шаблон держателя не нужен внутри CursorAdapter http://stackoverflow.com/questions/4567969/viewholder-pattern-correctly-implemented-in-custom-cursoradapter Я знаю, что что-то не в порядке, но это странно ... – helldron

1

Вы Шоуд использовать один вид для левых и правых сообщений и изменение гравитации в BindView, когда данные bindet для отображения.

Теперь у вас есть метод NewView, который создает вид, но при прокрутке вида повторно используются (иногда оранжевые, иногда зеленый цвет)

Удалить NewView Metod в творит все в BindView (используйте один вид) - будет более простой и чистый ;-)

Я делаю, что в моем списке сообщений - изменение гравитации из LinearLayout

но если Вы должны использовать 2 вида использования GetView раздувать вид - но тогда Вы потеряли эффективное создание вида (повторное использование)

+0

Я даю вам +1 для ответа, но теперь я не могу проверить вашу подсказку, потому что я заменил эту функцию другим. Сожалею. – helldron

Смежные вопросы