列表视图自定义适配器 - 添加新项后行丢失内容



我正在使用自定义列表视图适配器来捕获同一域类 Food 的多个对象。此类是:

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;
    }
}

而我的活动协调此列表视图是:

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?

当你不使用 Holder 时,getView(( 方法将调用 findViewById(( 的次数与你行不在视图之外的次数一样多。因此,如果您在列表中有 1000 行,并且 990 行将不在视图中,那么 990 次将再次称为 findViewById((。

持有者设计模式用于视图缓存 - 持有者(任意(对象保存每行的子小部件,当行不在视图之外时,不会调用 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`

最新更新