2012-03-24 71 views
4

我的自定義ArrayAdapter中的getView方法被多次調用,我認爲這是它的意思。問題是,我有一個數量TextView是動態設置的,但是當您滾動並且該框離開屏幕時,該值將消失。我不確定我做錯了什麼,Google也沒有證明會有很大的幫助。希望這裏有人能幫助我。多次調用Android自定義ArrayAdapter getView方法 - 重置動態TextView值

的adapater被稱爲:

adapter = new MenuAdapter(thisActivity, R.layout.menu, list); 
setListAdapter(adapter); 

我的自定義ArrayAdapter:

public MenuAdapter(Context context, int textViewResourceId, ArrayList<Object> menu) { 
    super(context, textViewResourceId, menu); 
    this.menu = menu; 
    vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
      View v = convertView; 

      Object cat = menu.get(position); 
      if (cat.getClass().equals(Category.class)) { 
       v = vi.inflate(R.layout.category, null); 
       Category item = (Category)cat; 
       v.setOnClickListener(null); 
      v.setOnLongClickListener(null); 
      v.setLongClickable(false); 

       TextView tt = (TextView) v.findViewById(R.id.category); 
       tt.setText(item.getName());  

      } else if (cat.getClass().equals(OrderItem.class)) { 
       v = vi.inflate(R.layout.menu, null); 
       OrderItem orderItem = (OrderItem)cat; 
       Item item = orderItem.getItem(); 
       TextView tt = (TextView) v.findViewById(R.id.title); 
       tt.setText(item.getName()); 

       TextView bt = (TextView) v.findViewById(R.id.desc); 
       bt.setText(item.getDescription()); 

       TextView qty = (TextView) v.findViewById(R.id.qty); 
       qty.setId(item.getId()); 


       ImageButton minus = (ImageButton) v.findViewById(R.id.qtyMinus); 
       minus.setTag(item); 
       ImageButton plus = (ImageButton) v.findViewById(R.id.qtyPlus); 
       plus.setTag(item);   
      } 

      return v; 
    } 

菜單佈局:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="?android:attr/listPreferredItemHeight" 
    android:padding="6dip" 
    android:background="#FFFFFF"> 

    <RelativeLayout 
     android:orientation="vertical" 
     android:layout_width="0dip" 
     android:layout_weight="1" 
     android:layout_height="fill_parent" 
     android:cacheColorHint="#FFFFFF" 
     android:background="#FFFFFF"> 

     <TextView 
      android:id="@+id/title" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:gravity="center_vertical" 
      android:textSize="16px" 
      android:textColor="#000000" 
     /> 
     <TextView 
      android:id="@+id/desc" 
      android:layout_below="@id/title" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:textSize="11px" 
      android:textStyle="italic" 
      android:textColor="#000000" 
     /> 
    </RelativeLayout> 
    <ImageButton 
    android:id="@+id/qtyMinus" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:src="@drawable/minus" 
    android:paddingTop="15px" 
    android:onClick="minusQty" /> 
    <TextView 
    android:id="@+id/qty" 
    android:layout_width="50px" 
    android:layout_height="50px" 
    android:textColor="#000000" 
    android:textSize="18px" 
    android:gravity="center_vertical|center_horizontal" 
    android:freezesText="true" 
    android:background="@android:drawable/editbox_background"/> 
    <ImageButton 
    android:id="@+id/qtyPlus" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:src="@drawable/plus" 
    android:paddingTop="15px" 
    android:onClick="addQty" /> 
</LinearLayout> 

任何幫助將不勝感激。

很多謝謝。

+0

你有兩種類型的意見?正如你有一個類別項目和訂單項目?如果那是真的,那麼你需要改變你處理它們的方式。你的設計需要更多的工作。 – Shubhayu 2012-03-24 18:13:47

回答

5

getView()將按照您的提示進行多次調用。它應該沒關係,因爲你的數組適配器是基於它的內部數據模型(數組,對象列表等等)的狀態。 getView()應該是冪等的,因爲多次調用它不應該改變結果。

你說:「當你滾動和框中屏幕價值消失」。注意確定是什麼意思。當您將在getView()中生成的視圖之一滾動到可見區域外,並且當您向後滾動時,該值不同?沒有任何其他信息,我不得不說這是不可能的。原因是,除非您正在修改適配器的內部狀態或更改適配器,否則您將始終爲給定位置生成相同的視圖。

順便說一下,convertView可以爲空,所以你想要做這樣的事情,

View v = convertView; 
if (v == null) { 
    v = inflater.inflate(...); 
} 

// now use v in the rest of the method 
+0

感謝您的快速響應!你是對的。如果我將一個項目的數量設置爲5,如果向下滾動,並且該項目在屏幕上顯示時我向後滾動,則該值現在爲空。 – 2012-03-24 16:45:26

+0

一種可能性是,適配器中「菜單」集合中的對象類型既不是一個類別,也不是一個訂購商品。不知道如何會發生。我建議您將日誌記錄添加到getView()中,以便您可以看到每個呼叫的每個位置正確生成的內容。視圖可能爲空的唯一方法是如果您生成空視圖。 – 2012-03-24 16:50:28

+0

奇怪的是,如果我添加if語句來檢查v是否爲null在膨脹之前,當我滾動到列表的底部時,我在此行上得到一個空指針異常:tt.setText(item.getName());有任何想法嗎? – 2012-03-24 17:20:18

-1

在您的列表視圖設置android:height = "match_parent"。現在getview稱爲您的數據集計數。我們可以重複使用convertview。檢查convertview是否是NULL誇大您的觀點。否則,寫下你的剩餘代碼。

if(convertView ! = null) 
{ 
//rest of your Code 
} 
else 
{ 
//inflate that view 
} 
相關問題