Android Eclipse ListView в AlertDialog, скрывающий определенные текстовые представления при прокрутке - PullRequest
0 голосов
/ 06 марта 2012

У меня есть представление списка внутри alertDialog. Я заполняю свое представление списка пользовательским resourceCursorAdapter, и каждая строка содержит заголовок textView, date textView и изображение.

Все работает хорошо, за исключением того, что кажется, что когда вы прокручиваете просмотр списка, некоторые из текстовых представлений даты в некоторых строках исчезают. Я выяснил, почему они исчезают, но не как это исправить ... Некоторые элементы не предназначены для отображения дат, поэтому у меня есть оператор if в bindview, который определяет, должны ли даты отображаться или нет. Это работает для любого списка за пределами модуля alerttdialog, но некоторые даты, которые должны отображаться, исчезают. Кто-нибудь знает, почему это происходит?

Мой код для диалогового окна оповещения и просмотра списка:

itemSendPickerDialog = new Dialog(this);
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("Select Item to Send");

        ListView lv = new ListView(this);
        lv.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long i) {


                }
            });
        AlertDialog sendOptionAlert = sendOptionBuilder.create();

                         sendOptionAlert.show();

                    System.out.println("ID is: " + iid + " and position is: " + position);
                    itemSendPickerDialog.dismiss();
                    }
            });
        Cursor c = mDbHelper.fetchItemsByDate(id);
        c.moveToFirst();

        int i = R.layout.send_item_menu_row;
        MyListAdapter ia = new MyListAdapter(this, i, c);
        lv.setAdapter(ia);

        builder.setView(lv);
        itemSendPickerDialog = builder.create();
        itemSendPickerDialog.show();

И мой пользовательский список Адаптер:

class MyListAdapter extends ResourceCursorAdapter {
    public MyListAdapter(Context context, int i, Cursor cursor) {
        super(context, i, cursor);
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {

        TextView title = (TextView) view.findViewById(R.id.item_name);

        title.setText(cursor.getString(cursor.getColumnIndex(TripsDbAdapter.KEY_ITEM_TITLE)));

        Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
        int width = display.getWidth();
        width = width - 150;
        ViewGroup.LayoutParams params = title.getLayoutParams();
        params.width = width;
        title.setLayoutParams(params);

        String cat = cursor.getString(cursor.getColumnIndex(TripsDbAdapter.KEY_ITEM_CATEGORY));

        if (cat.equalsIgnoreCase("trip notes")) {   
            LinearLayout ll = (LinearLayout) view.findViewById(R.id.item_datetime_holder);
            ll.setVisibility(View.INVISIBLE);
        }
        TextView date = (TextView) view.findViewById(R.id.item_date);
        date.setText(cursor.getString(cursor.getColumnIndex(TripsDbAdapter.KEY_DEP_DATE)));

        TextView time = (TextView) view.findViewById(R.id.item_time);
        time.setText(cursor.getString(cursor.getColumnIndex(TripsDbAdapter.KEY_DEP_TIME)));

        ImageView iv = (ImageView) view.findViewById(R.id.image_icon);
        if (iv != null) {
            int index = cursor.getColumnIndex(TripsDbAdapter.KEY_ITEM_TYPE);

            String type = cursor.getString(index);
            if (type != null) {

            } else {
                type = "notes";
            }

            iv.setImageResource(getTypeResource(type));
        }

    }

    public static int getTypeResource(String type) {
        if (type.equalsIgnoreCase("flight")) {
            return R.drawable.airplaneicon;
        }
        if (type.equalsIgnoreCase("boat/ship")) {
            return R.drawable.boatshipicon;
        }
        if (type.equalsIgnoreCase("bus")) {
            return R.drawable.busicon;
        }
        if (type.equalsIgnoreCase("rail")) {
            return R.drawable.railicon;
        }
        if (type.equalsIgnoreCase("auto or other rentals")) {
            return R.drawable.caricon;
        }
        if (type.equalsIgnoreCase("other transportation")) {
            return R.drawable.othertransicon;
        }
        if (type.equalsIgnoreCase("hotel")) {
            return R.drawable.hotelicon;
        }
        if (type.equalsIgnoreCase("resort")) {
            return R.drawable.resorticon;
        }
        if (type.equalsIgnoreCase("bed & breakfast")) {
            return R.drawable.bandbicon;
        }
        if (type.equalsIgnoreCase("camp ground")) {
            return R.drawable.campgroundicon;
        }
        if (type.equalsIgnoreCase("vacation rental")) {
            return R.drawable.vacationrentalicon;
        }
        if (type.equalsIgnoreCase("other lodging")) {
            return R.drawable.otherlodgingicon;
        }
        if (type.equalsIgnoreCase("rail")) {
            return R.drawable.railicon;
        }
        if (type.equalsIgnoreCase("cruise")) {
            return R.drawable.cruiseicon;
        }
        if (type.equalsIgnoreCase("tour")) {
            return R.drawable.touricon;
        }
        if (type.equalsIgnoreCase("dining")) {
            return R.drawable.diningicon;
        }
        if (type.equalsIgnoreCase("spa")) {
            return R.drawable.spaicon;
        }
        if (type.equalsIgnoreCase("class")) {
            return R.drawable.classicon;
        }
        if (type.equalsIgnoreCase("other activity")) {
            return R.drawable.eventicon;
        } else {
            return R.drawable.notesicon;
        }
    }

}

Конкретный код, который делает текст исчезающим, находится в переопределении bindview:

String cat = cursor.getString(cursor.getColumnIndex(TripsDbAdapter.KEY_ITEM_CATEGORY));

        if (cat.equalsIgnoreCase("trip notes")) {   
            LinearLayout ll = (LinearLayout) view.findViewById(R.id.item_datetime_holder);
            ll.setVisibility(View.INVISIBLE);
        }

1 Ответ

1 голос
/ 06 марта 2012

Представления в ListView перерабатываются, когда строка исчезает внизу, она появляется вверху списка. Это не воссоздание, это такая оптимизация. В bindView() вы устанавливаете только текущие значения.

Вы забыли о настройке видимого вида.

    LinearLayout ll = (LinearLayout) view.findViewById(R.id.item_datetime_holder);
    if (cat.equalsIgnoreCase("trip notes")) {   
        ll.setVisibility(View.INVISIBLE);
    } else {
        ll.setVisibility(View.VISIBLE);
    }

Стоит посмотреть: http://www.google.com/events/io/2010/sessions/world-of-listview-android.html

...