2013-01-10 66 views
3

滚动当我在Android的初学者....我需要你的帮助。微调复位值在自定义列表视图与ArrayAdapter

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

回答

2
在列表中的适配器的 getView()

,你必须调用YOUR_SPINNER.setSelected(position you set earlier);

这是因为发生的事情,一旦列表中创建您在getView并作为其微调其默认stae总是得到convertView是0的位置到达那里。

此外,你正在做setAdapter总是在getView方法,所以这将始终初始化时,将永远getView()将被称为ie。在滚动列表。

我想说的设置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得到它的,因为它可能含有不考虑行的重用视图。另外,如果您在实现我所说的内容时仍然遇到问题,请按照另一种方法创建静态HashTable<integer, integer>,其中key将作为行的索引,并且value将作为选择的spinner项目的索引。

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

+0

@Sibin:你试过了吗? – akkilis

+0

我试过你的解决方案。但我在第一行的微调值,第一等的值为0 ...直到最后一行(我想这是索引)...但是当我改变值并再次滚动它重置它。我认为我没有正确地使用你的方法...请举一些例子。 – sibi

+0

@Sibin:editted my ans – akkilis

0

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

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

+0

没有为我工作 –