在ArrayAdapter的自定义列表视图中滚动时微调重置价值(Spinner reset valu

2019-07-18 01:37发布

我在Android的初学者....我需要你的帮助。

在我的应用我创建使用自定义适配器和自定义行布局的列表视图。 我成功地这样做 - 我增加了一个形象,TextView的和微调下拉中的所有行。 在下拉有物品的数目(从0到9为例如)。

但我的问题是,当我选择下拉菜单并设置一些值,上滚动旋转复位为初始值(这里是0)名单..我用值0〜9微调的字符串。

我能做些什么来避免这个问题? 任何帮助将不胜感激....在此先感谢。

//This is my custom adapter code....

public class MyProductsArrayAdapter extends ArrayAdapter<Products> {
Context context;
int resourceId;

Products data[] = null;

public MyProductsArrayAdapter(Context context, int resourceId,
        Products data[]) {
    super(context, resourceId, data);
    this.context = context;
    this.resourceId = resourceId;

    this.data = data;
}

static class ProductsItemViewHolder {

    ImageView image;
    TextView name;
    Spinner number;
}

String[] mArray = new String[] { "0", "1", "2", "3", "4", "5", "6", "7",

        "8", "9" };

public View getView(final int position, View convertView, ViewGroup parent) {
    View rowView = convertView;
    ProductsItemViewHolder holder = null;

    LayoutInflater mInflater = (LayoutInflater) context

            .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    if (rowView == null) {

        rowView = mInflater.inflate(R.layout.main2, parent, false);
        holder = new ProductsItemViewHolder();
        holder.image = (ImageView) rowView.findViewById(R.id.item_icon);

        holder.name = (TextView) rowView.findViewById(R.id.tvListItemText);
        holder.number = (Spinner) rowView.findViewById(R.id.NumberSpinner);

        rowView.setTag(holder);

    } else {


        holder = (ProductsItemViewHolder) rowView.getTag();
    }

    Products f = data[position];
    holder.image.setImageResource(f.itemIcon);
    holder.name.setText(f.itemName);

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(context,

            android.R.layout.simple_spinner_item, mArray);

    holder.number.setAdapter(adapter);

    return rowView;

}
}

//这里是我的row_layout代码

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"

android:orientation="horizontal" >

<ImageView
    android:id="@+id/item_icon"
    android:layout_width="40dp"
    android:layout_height="40dip"

    android:layout_alignParentLeft="true"
    android:layout_centerVertical="true"
    android:layout_marginLeft="10dip"
    android:gravity="center_vertical"

    android:src="@drawable/ic_launcher" >
</ImageView>

<TextView
    android:id="@+id/tvListItemText"
    android:layout_width="wrap_content"

    android:layout_height="wrap_content"
    android:layout_centerVertical="true"
    android:layout_marginLeft="10dp"
    android:layout_toRightOf="@id/item_icon"

    android:maxWidth="180dp"
    android:maxLines="2"
    android:text="Hello testing"
    android:textColor="@color/brown"
    android:textSize="15dp"

    android:typeface="normal" />

<Spinner
    android:id="@+id/NumberSpinner"
    android:layout_width="80dp"
    android:layout_height="wrap_content"

    android:layout_alignParentRight="true"
    android:layout_centerVertical="true"
    android:layout_marginLeft="0dp" />

</RelativeLayout>

Answer 1:

getView()您名单的适配器,则必须调用YOUR_SPINNER.setSelected(position you set earlier);

这是因为发生的事情,一旦创建列表,你总是得到convertViewgetView和在它旋转的其默认stae是0的位置到达那里。

此外,你在做setAdapter在getView方法总是微调器,因此这将始终初始化当过getView()将被调用,即。 上滚动列表。

我的意思是设置setOnItemSelectedListener()在你的spinneronItemSelected()这个监听器的方法设置的值作为你的微调对象的标签。 holder.number.setTag(POSITION)

会后声明holder.number.setAdapter()holder.number.setSelection(Integer.parseInt(number.getTag));

这样,您要保存您选择的值,而你相同的索引设置,就当有史以来getView()被调用。

Editted:

是的,你设置了如方法参数的值onItemSelected(View v, int arg2) 这Arg2为位置系统告诉你,这一立场是你为这个微调(由系统提供简单的回调)选择。 现在,在同一方法的实现,必须设置这个值作为这个观点的对象,这是这个回调的第一个参数的标签。

另外,如果你没有得到在该标签值getView()你必须每次初始化微调,而不是从convertView得到它,因为它可能含有不考虑行的重用视图。

另外,如果你继续在执行我刚才所说的得到的问题,您面包车遵循另一种方法,使静态HashTable<integer, integer> ,其中关键是行的索引和值将微调项的选择索引。

所以,在getView可以设置holder.number.setSelection(hashtable.get(position));



Answer 2:

宣布 'LayoutInflater mInflater;' 为全局变量。

初始化 'mInflater =(LayoutInflater)上下文.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);' 内部构造。



文章来源: Spinner reset value when scrolling in a custom listview with ArrayAdapter