gpt4 book ai didi

android - 使用 ArrayAdapter 在自定义 ListView 中滚动时微调器重置值

转载 作者:太空狗 更新时间:2023-10-29 13:32:18 27 4
gpt4 key购买 nike

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

在我的应用程序中,我使用自定义适配器和自定义行布局创建了一个 ListView 。我成功地这样做了并且我在所有行中添加了一个图像、 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>

最佳答案

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

发生这种情况是因为,一旦创建了列表,您总是会得到 convertViewgetView作为微调器的默认状态,它到达那里的位置为 0。

此外,您总是在 getView 方法中对微调器执行 setAdapter,因此这将始终初始化它 getView()将被称为即。滚动列表。

我说的是set setOnItemSelectedListener()在你的 spinneronItemSelected()此监听器的方法将值设置为微调器对象的标记。 holder.number.setTag(POSITION)

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

这样您就可以保存您选择的值,并且在 getView() 时为其设置相同的索引。被称为。

编辑:

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

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

此外,如果您在实现我所说的内容时仍然遇到问题,您可以采用另一种方法来生成静态 HashTable<integer, integer>。其中键是行的索引,值是所选微调项的索引。

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

关于android - 使用 ArrayAdapter 在自定义 ListView 中滚动时微调器重置值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14258866/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com