我正在使用自定义列表视图适配器来捕获同一域类 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`