我是android的初学者....我需要你的帮助。
在我的应用中,我使用自定义适配器和自定义行布局创建了一个列表视图。我这样做是成功的&我在所有行中添加了一个图像,textview和一个微调器。在下拉列表中有多个项目(例如,从0到9)
但我的问题是当我选择下拉并设置一些值时,在滚动列表时,微调器将自身重置为初始值(此处为0)..我正在为Spinner使用值为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>
答案 0 :(得分:2)
在列表适配器的getView()
中,您必须拨打YOUR_SPINNER.setSelected(position you set earlier);
这种情况正在发生,因为一旦创建了列表,您始终会在convertView
中获得getView
,并且它的默认值是旋转器位于它的0位置。
另外,你总是在getView方法中使用setAdapter到spinner,所以这将始终在调用getView()
时初始化它。滚动列表。
我所说的是在setOnItemSelectedListener()
上设置spinner
并在此侦听器的onItemSelected()
方法中将值设置为您的微调器对象的标记。
holder.number.setTag(POSITION)
声明holder.number.setAdapter()
后holder.number.setSelection(Integer.parseInt(number.getTag));
这样您就可以保存所选的值,并且在调用getView()
时设置相同的索引。
Editted:
是的,将您获得的值设置为方法onItemSelected(View v, int arg2)
中的参数。
这个arg2是位置系统告诉你这个位置是由你为这个微调器选择的(系统提供的简单回调)。
现在,在同一方法的实现中,您必须将此值设置为此视图对象的标记,这是此回调的第一个参数。
此外,如果您未在getView()
中获取此标记值,则必须每次都初始化您的微调器而不是从convertView获取它,因为它可能包含不在视图中的行的重用视图。 / p>
另外,如果你在实现我所说的内容时仍然遇到问题,你可以使用另一种方法来创建一个静态HashTable<integer, integer>
,其中key是行的索引,value将是所选spinner项的索引
因此,在getView
中,您可以设置holder.number.setSelection(hashtable.get(position));
答案 1 :(得分:0)
声明'LayoutInflater mInflater;'作为全球变量。
初始化'mInflater =(LayoutInflater)上下文.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);'内 构造