2016-02-15 40 views
-1

我正在使用自定義listview適配器來捕獲同一個域類的多個對象食物。這個類是:Listview自定義適配器 - 行添加新項目後丟失內容

public class Food { 
    public String Item; 
    public String Description; 
    public int count; 
} 

我的自定義適配器是:

public class FoodAdapter extends ArrayAdapter<Food> { 
    private final Context context; 
    private final ArrayList<Food> itemsArrayList; 

    EditText item 
    EditText desc 
    EditText count; 


    public ArrayList<Food> getItemsArrayList() { 
     return itemsArrayList; 
    } 

    public FoodAdapter(Context context, ArrayList<Food> itemsArrayList) { 

     super(context, R.layout.fr_row, itemsArrayList); 
     //super(context, itemsArrayList); 

     this.context = context; 
     this.itemsArrayList = itemsArrayList; 

    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     // 1. Create inflater 
     LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     // 2. Get rowView from inflater 
     View rowView = inflater.inflate(R.layout.fr_row, parent, false); 

     // 3. Get the two text view from the rowView 
     item= (EditText) rowView.findViewById(R.id.f_item); 
     desc= (EditText) rowView.findViewById(R.id.f_desc); 
     count = (EditText) rowView.findViewById(R.id.f_count); 


     return rowView; 
    } 

} 

而且我ActivityThat座標此列表視圖是:

package com.example.foodie; 

import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.os.Environment; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.telephony.TelephonyManager; 
import android.view.View; 
import android.widget.ListView; 


public class FoodActivity extends AppCompatActivity { 


    ListView lv; 
    FoodAdapter adapter; 
    ArrayList<Food> fList; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_frmorning); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     setContentView(R.layout.activity_frmorning); 

     lv = (ListView) findViewById(R.id.list); 

     fList = new ArrayList<Food>(); 

     adapter =new FoodAdapter(this, fList); 
     lv.setAdapter(adapter); 

    } 

    public void addItems(View v) { 

     fList.add(new Food()); 
     adapter.notifyDataSetChanged(); 
    } 


} 

這爲addItems是佈局的按鈕(FoodActivity) 。當我點擊添加,我得到新的一排。但是,新行添加後,行會丟失所有內容。他們都是空白的。什麼導致了這種行爲以及如何解決?另外,如何將EditText字段綁定到ArrayList中的數據,以便當我撥打getItemsArrayList()時,我會得到與屏幕顯示對應的正確ArrayList?

+0

如何將EditText中的值添加到ArrayList中的對象? –

回答

0

當您不使用Holder時,getView()方法將調用findViewById()多次,因爲您的row將不在View中。所以如果你在List中有1000行並且990行將不在View中,那麼990次將再次被稱爲findViewById()。

Holder設計模式用於查看緩存 - Holder(任意)對象包含每一行的子窗口小部件,當行超出View窗口時,findViewById()將不會被調用,但View將被回收並獲得窗口小部件來自Holder。

public class FoodAdapter extends ArrayAdapter<Food> 
    { 
     private final Context context; 
     private final ArrayList<Food> itemsArrayList; 
     public FoodAdapter(Context context, ArrayList<Food> itemsArrayList) { 
     { 
     super(context, itemsArrayList); 
     this.context = context; 
     this.itemsArrayList = itemsArrayList; 
     } 
     @Override 
     public int getCount() 
     { 
      return itemsArrayList.size(); 
     } 

     @Override 
     public Object getItem(int position) 
     { 
      return itemsArrayList.get(position); 
     } 

     @Override 
     public long getItemId(int position) 
     { 
      return position; 
     } 

     @Override 
     public View getView(final int position, View convertView, ViewGroup parent) { 
      final ViewHolder holder; 
      if (convertView == null) 
      { 
       holder = new ViewHolder(); 
       LayoutInflater inflater=(LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       convertView = inflater.inflate(R.layout.fr_row, parent, false); 
       holder.text = (EditText) convertView.findViewById(R.id.edittext); 

       convertView.setTag(holder); 
      } else 
      { 
       holder = (ViewHolder) convertView.getTag(); 
      } 
      holder.text.setText(itemsArrayList.get(position)); 


      return convertView; 
     } 

     class ViewHolder 
     { 
      EditText item 
      EditText desc 
      EditText count; 
     } 

    }`enter code here` 
+0

請僅使用代碼避免答案,並解釋它爲什麼會起作用以及爲什麼你要做你在做的事情...... – 2Dee

+0

你也可以編輯我的答案 –

+0

我不是你的看門人......你是負責任的爲你寫的內容。 – 2Dee

相關問題