#android #listview #cursoradaper
Здравствуйте. Заполняю ListView из адаптера. По условию, меняю Layout эл-та списка. При скроле списка, эл-ты перемешиваются, не могу понять, как это победить. Код адаптера: public class OrderAdapter extends CursorAdapter { private LayoutInflater inflater; private class ViewHolder { TextView name; } public OrderAdapter(Context context, Cursor c, int flags) { super(context, c, flags); this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public void bindView(View view, Context context, Cursor cursor) { ViewHolder holder = (ViewHolder) view.getTag(); holder.name.setText(cursor.getString(cursor.getColumnIndex("mitm_Name"))); //holder.time.setText(cursor.getString(holder.timeIndex)); } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { ViewHolder holder = new ViewHolder(); View v = null; if (cursor.getInt(cursor.getColumnIndex("State")) == 0) { v = inflater.inflate(R.layout.cellordername, parent, false); holder.name = (TextView) v.findViewById(R.id.txtmitmname); } else { v = inflater.inflate(R.layout.cellorder, parent, false); holder.name = (TextView) v.findViewById(R.id.txtmitmname); } v.setTag(holder); return v; } } Переписал адаптер: public Cursor getOrderData() { SQLiteDatabase database = dbHelper.getWritableDatabase(); String buildSQL = "SELECT * FROM elf_Orders ORDER BY _id"; return database.rawQuery(buildSQL, null); } public class OrderAdapter extends CursorAdapter { private LayoutInflater inflater; private class ViewHolder { TextView name; } public OrderAdapter(Context context, Cursor c, int flags) { super(context, c, flags); this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public void bindView(View view, Context context, Cursor cursor) { } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { ViewHolder holder = new ViewHolder(); if (cursor.getInt(cursor.getColumnIndex("State")) == 0) { View v = inflater.inflate(R.layout.cellordername, parent, false); holder.name = (TextView) v.findViewById(R.id.txtmitmname); v.setTag(holder); holder.name.setText(cursor.getString(cursor.getColumnIndex("mitm_Name"))); return v; } else { View v = inflater.inflate(R.layout.cellorder, parent, false); holder.name = (TextView) v.findViewById(R.id.txtmitmname); v.setTag(holder); holder.name.setText(cursor.getString(cursor.getColumnIndex("mitm_Name"))); return v; } } } Теперь разметки назначаются правильно, но вот данные выводятся в хаотичном порядке при скроле. В каком направлении копать?
Ответы
Ответ 1
Рабочий код адаптера: public Cursor getOrderData() { SQLiteDatabase database = dbHelper.getWritableDatabase(); String buildSQL = "SELECT * FROM elf_Orders ORDER BY _id"; return database.rawQuery(buildSQL, null); } public class OrderAdapter extends CursorAdapter { private LayoutInflater inflater; private class ViewHolder { TextView name; } public OrderAdapter(Context context, Cursor c, int flags) { super(context, c, flags); this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } private int getItemViewType(Cursor cursor) { String type = cursor.getString(cursor.getColumnIndex("State")); if (type.equals("1")) { return 0; } else { return 1; } } @Override public int getItemViewType(int position) { Cursor cursor = (Cursor) getItem(position); return getItemViewType(cursor); } @Override public int getViewTypeCount() { return 2; } @Override public void bindView(View view, Context context, Cursor cursor) { ViewHolder holder = (ViewHolder) view.getTag(); holder.name.setText(cursor.getString(cursor.getColumnIndex("mitm_Name"))); } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { ViewHolder holder = new ViewHolder(); View v = null; if (cursor.getInt(cursor.getColumnIndex("State")) == 0) { v = inflater.inflate(R.layout.cellordername, parent, false); holder.name = (TextView) v.findViewById(R.id.txtmitmname); } else { v = inflater.inflate(R.layout.cellorder, parent, false); holder.name = (TextView) v.findViewById(R.id.txtmitmname); } v.setTag(holder); return v; } } Большое спасибо!Ответ 2
Так, на будущее. Если в Курсор адаптере заполняете if, то обязательно нужно заполнить else, так как listview рандомно меняет сделанные изменения. Я тоже мучался, менял по id элемента цвет textView через if, прокручивал и при возврате был уже хаос. Потом мне подсказали заполнить else тем цветом, что должен быть по стандарту - помогло. Думаю, мой ответ кому-нибудь да поможет. Код класса Adapter, меняющего цвет по id элемента: package ru.diit.healthychildrenfree.adapters; import android.content.Context; import android.database.Cursor; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.CursorAdapter; import android.widget.TextView; import ru.diit.healthychildrenfree.R; /** * Created by zaynulabid on 12.01.16. */ public class GroupAdapter extends CursorAdapter { private LayoutInflater mInflater; public GroupAdapter(Context context, Cursor cursor){ super(context, cursor, 1); mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { return mInflater.inflate(R.layout.item, parent,false); } @Override public void bindView(View view, Context context, Cursor cursor) { TextView txName = (TextView) view.findViewById(R.id.textViewNameOfGrup); // инициализировали textView String name = cursor.getString(cursor.getColumnIndex("name_gruppi"));// достали строку в переменную txName.setText(name);// присвоили значение TextView tvOpisanieGruppi = (TextView) view.findViewById(R.id.textViewOpisanieGrup); String opisanieGruppi = cursor.getString(cursor.getColumnIndex("opisanie_gruppi")); tvOpisanieGruppi.setText(opisanieGruppi); long idGroup = cursor.getLong(cursor.getColumnIndex("id_gruppi")); //нашли айди элемента с БД //Log.e("GAdapter", "bindView: idGroup = " + idGroup); if (idGroup == 11){ // если id = 11, меняем цвета текстов на те, что есть в файле colors //Log.e("GAdapter", "bindView: idGroup == 11\nзакрашиваем строчки"); txName.setTextColor(context.getResources().getColor(R.color.textColorTitleFilled)); tvOpisanieGruppi.setTextColor(context.getResources().getColor(R.color.textColorTitleFilled)); } else { // если не равен 11 (как раз этот блок не даст цветам меняться при прокрутке) txName.setTextColor(context.getResources().getColor(R.color.textColorTitle)); tvOpisanieGruppi.setTextColor(context.getResources().getColor(R.color.textColorTitle)); } } } Нет, я не считаю, что это решение правильное, но оно рабочее и при разработке простых задач в курсор-адаптере это решение легко использовать
Комментариев нет:
Отправить комментарий