Пользовательский метод ArrayAdapter Android getView вызывается несколько раз - сбрасывает динамическое значение TextView - PullRequest
4 голосов
/ 24 марта 2012

Метод getView в моем собственном ArrayAdapter вызывается несколько раз, что, я полагаю, предназначено для него. Проблема в том, что у меня есть количество TextView, которое динамически устанавливается, но когда вы прокручиваете и окно выключается, значение исчезает. Я не уверен, что я делаю неправильно, и Google не окажет особой помощи. Надеюсь, кто-то здесь может мне помочь.

Адаптер называется:

adapter = new MenuAdapter(thisActivity, R.layout.menu, list);
setListAdapter(adapter);

Мой пользовательский ArrayAdapter:

public MenuAdapter(Context context, int textViewResourceId, ArrayList<Object> menu) {
    super(context, textViewResourceId, menu);
    this.menu = menu;
    vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public View getView(int position, View convertView, ViewGroup parent) {
            View v = convertView;

            Object cat = menu.get(position);
            if (cat.getClass().equals(Category.class)) {
                v = vi.inflate(R.layout.category, null);
                Category item = (Category)cat;
                v.setOnClickListener(null);
            v.setOnLongClickListener(null);
            v.setLongClickable(false);

                TextView tt = (TextView) v.findViewById(R.id.category);
                tt.setText(item.getName());      

            } else if (cat.getClass().equals(OrderItem.class)) {
                v = vi.inflate(R.layout.menu, null);
                OrderItem orderItem = (OrderItem)cat;
                Item item = orderItem.getItem();
                TextView tt = (TextView) v.findViewById(R.id.title);
                tt.setText(item.getName());   

                TextView bt = (TextView) v.findViewById(R.id.desc);
                bt.setText(item.getDescription());

                TextView qty = (TextView) v.findViewById(R.id.qty);
                qty.setId(item.getId());


                ImageButton minus = (ImageButton) v.findViewById(R.id.qtyMinus);
                minus.setTag(item);
                ImageButton plus = (ImageButton) v.findViewById(R.id.qtyPlus);
                plus.setTag(item);          
            }

            return v;
    }

Макет меню:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:padding="6dip"
    android:background="#FFFFFF">

    <RelativeLayout
        android:orientation="vertical"
        android:layout_width="0dip"
        android:layout_weight="1"
        android:layout_height="fill_parent"
        android:cacheColorHint="#FFFFFF"
        android:background="#FFFFFF">

        <TextView
            android:id="@+id/title"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center_vertical"
            android:textSize="16px"
            android:textColor="#000000"
        />
        <TextView
            android:id="@+id/desc"
            android:layout_below="@id/title"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:textSize="11px"
            android:textStyle="italic"
            android:textColor="#000000"
        />
    </RelativeLayout>
    <ImageButton
    android:id="@+id/qtyMinus"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/minus"
    android:paddingTop="15px"
    android:onClick="minusQty"  />
    <TextView
    android:id="@+id/qty"
    android:layout_width="50px"
    android:layout_height="50px"
    android:textColor="#000000"
    android:textSize="18px"
    android:gravity="center_vertical|center_horizontal"
    android:freezesText="true"
    android:background="@android:drawable/editbox_background"/>
    <ImageButton
    android:id="@+id/qtyPlus"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/plus"
    android:paddingTop="15px"
    android:onClick="addQty" />
</LinearLayout>

Любая помощь будет принята с благодарностью.

Большое спасибо.

Ответы [ 2 ]

5 голосов
/ 24 марта 2012

getView() будет вызываться несколько раз, как вы заметили. это не должно иметь значения, потому что ваш адаптер массива основан на состоянии его внутренней модели данных (массив, список объектов, что угодно). getView() должно быть идемпотентным, так как его многократный вызов не должен изменять результат.

вы говорите: «когда вы прокручиваете и окно выключается, значение исчезает». обратите внимание, конечно, что значит. когда вы прокручиваете одно из представлений, созданных в getView(), вне видимой области, и когда вы прокручиваете его назад, значение отличается? без какой-либо другой информации, я бы сказал, что это невозможно. причина снова в том, что если вы не изменяете внутреннее состояние адаптера или не меняете адаптер, вы всегда будете генерировать одно и то же представление для данной позиции.

кстати, convertView может быть нулевым, так что вы хотите сделать что-то вроде,

View v = convertView;
if (v == null) {
  v = inflater.inflate(...);
}

// now use v in the rest of the method
0 голосов
/ 13 сентября 2013

В вашем списке просмотра установлено android:height = "match_parent". Теперь getview назвал ваш набор данных. мы можем повторно использовать convertview. Проверьте convertview, если это NULL надуйте ваш взгляд. В противном случае напишите оставшийся код.

if(convertView ! = null)
{
 //rest of your Code
}
else
{
//inflate that view
}
...