-1

カスタム リストビュー アダプターを使用して、同じドメイン クラス 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;
    }

}

そして、このリストビューを調整する私の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 を取得できますか?

4

1 に答える 1

0

ホルダーを使用していない場合、 getView() メソッドは、行がビューから外れる回数だけ findViewById() を呼び出します。したがって、List に 1000 行あり、990 行がビューから外れる場合、990 回 findViewById() が再度呼び出されます。

ホルダー デザイン パターンはビューのキャッシュに使用されます。ホルダー (任意) オブジェクトは各行の子ウィジェットを保持し、行がビューの外にある場合、findViewById() は呼び出されませんが、ビューはリサイクルされ、ウィジェットはホルダーから取得されます。

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`
于 2016-02-15T13:54:49.093 に答える