Я столкнулся с реализацией макета чата.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 и для каждого прокручивать изменения экрана.
Что не так ??? Благодаря!!
Я пробовал им образец держателя плеера, но пока не работает. Поскольку я знаю, что шаблон держателя не нужен внутри CursorAdapter http://stackoverflow.com/questions/4567969/viewholder-pattern-correctly-implemented-in-custom-cursoradapter Я знаю, что что-то не в порядке, но это странно ... – helldron