Android custom ArrayAdapter getView method called multiple times - resetting dynamic TextView value

孤人 提交于 2019-12-19 07:48:37

问题


The getView method in my custom ArrayAdapter is getting called multiple times, which I assume it is meant to. Problem is, I have a quantity TextView which is dynamically set but when you scroll and the box goes off screen the value disappears. I am not sure what I am doing wrong and Google is not proving to be much help. Hopefully someone here can help me.

The adapater is called:

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

My Custom 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;
    }

The menu layout:

<?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>

Any help will be greatly appreciated.

Many Thanks.


回答1:


getView() will be called multiple times as you note. it shouldn't matter, because your array adapter is based on the state of it's internal data model (array, list of objects, whatever). getView() should be idempotent in that calling it multiple times shouldn't change the result.

you say "when you scroll and the box goes off screen the value disappears". note sure what mean. when you scroll one of the views generated in getView() off the visible area, and when you scroll it back, the value is different? without any other information, i'd have to say that's not possible. the reason is again that unless you are modifying the internal state of the adapter, or changing the adapter, you will always generate the same view for a given position.

by the way, convertView can be null, so you want to do something like,

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

// now use v in the rest of the method



回答2:


In your listview set android:height = "match_parent". Now getview called your dataset count. we can reuse the convertview. Check the convertview if it is NULL inflate your view. Otherwise, write your remaining code.

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


来源:https://stackoverflow.com/questions/9853397/android-custom-arrayadapter-getview-method-called-multiple-times-resetting-dyn

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!