2013-01-10 64 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

沒有爲我工作 –