【问题标题】:Spinner reset value when scrolling in a custom listview with ArrayAdapter使用 ArrayAdapter 在自定义列表视图中滚动时微调器重置值
【发布时间】:2013-01-10 13:19:00
【问题描述】:

我是安卓初学者....我需要你的帮助。

在我的应用程序中,我使用自定义适配器和自定义行布局创建了一个列表视图。我成功地这样做了,我在所有行中添加了一个图像、文本视图和一个微调器下拉菜单。在下拉列表中有项目数(例如从 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>

【问题讨论】:

    标签: android listview android-spinner


    【解决方案1】:

    在您的列表适配器的getView() 中,您必须调用YOUR_SPINNER.setSelected(position you set earlier);

    发生这种情况是因为,一旦创建了列表,您总是会在 getView 中获得 convertView,并且它的默认微调器状态是 0 位置。

    此外,您始终在 getView 方法中对微调器执行 setAdapter,因此当调用 getView() 时,它将始终初始化它,即。在滚动列表时。

    我所说的是在您的spinner 上设置setOnItemSelectedListener(),并在此侦听器的onItemSelected() 方法中将值设置为您的微调器对象的标记。 holder.number.setTag(POSITION)

    在声明holder.number.setAdapter()之后做holder.number.setSelection(Integer.parseInt(number.getTag));

    这样,您将保存您选择的值,并在每次调用 getView() 时为其设置相同的索引。

    已编辑:

    是的,将您获得的值设置为方法onItemSelected(View v, int arg2) 中的参数。 这个 arg2 是位置系统告诉你这个位置是你为这个微调器选择的(系统提供的简单回调)。 现在,在同一个方法的实现中,你必须设置这个值作为这个视图对象的标签,这是这个回调的第一个参数。

    另外,如果您没有在 getView() 中获取此标记值,则必须每次都初始化微调器,而不是从 convertView 中获取它,因为它可能包含不在视图中的行的重用视图。

    此外,如果您在实施我所说的内容时继续遇到问题,您可以采用另一种方法,制作静态 HashTable&lt;integer, integer&gt;,其中键是行的索引,值是所选微调项的索引。

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

    【讨论】:

    • 我尝试了您的解决方案。但是我在第一行的微调器中获得值 0,在第二行中获得值 1 等等......直到最后一行(我猜它是索引)......但是当我改变值并再次滚动它时,它也会重置它。我想我没有正确理解你的方法......请举个例子。
    • @akilis:感谢您的编辑...但是当我使用 gettag() 时,我得到了空值。就我而言,在 settag(position) 中我必须设置什么。我从微调器或其索引中选择的值?我很迷惑。我尝试了 settag(微调器中的选定值)和 settag(选定微调器的位置)。在一种情况下,当我更改一个微调器值并滚动列表时,它在其他微调器中显示该值……出了什么问题?我无法找到...帮帮我
    【解决方案2】:

    声明'LayoutInflater mInflater;'作为全局变量。

    初始化'mInflater = (LayoutInflater) 上下文.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);'里面 构造函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多