Страницы

Поиск по вопросам

суббота, 11 января 2020 г.

ListView и Cursor Adapter android

#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)); } } } Нет, я не считаю, что это решение правильное, но оно рабочее и при разработке простых задач в курсор-адаптере это решение легко использовать

Комментариев нет:

Отправить комментарий