0

ネガティブリストとポジティブリストを切り替える上部のボタンを使用して、プログラムの途中でListViewデータを変更しようとしています。

private ArrayList<LifeTask> positiveListData = new ArrayList<LifeTask>();
private ArrayList<LifeTask> negativeListData = new ArrayList<LifeTask>();
private ArrayList<LifeTask> currentListData = positiveListData;
private ListAdapter adapter;
private ListView gameList;

デフォルトではcurrentListData、ポジティブ リストを指しています。アプリのonCreate()機能には、次のコードがあります。

adapter = new ListAdapter(this, R.layout.list_item, currentListData);
gameList = (ListView) findViewById(R.id.main_list_view);
gameList.setAdapter(adapter);

否定ボタンが押されたら、次のことを試します。

currentListData = negativeListData;
adapter.notifyDataSetChanged();

しかし、何も変わりません。私は何を間違っていますか?

編集: 要求に応じて追加されたアダプター コード

package cs.ucsb.cs185.dimberman.lifeRPG;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

public class ListAdapter extends ArrayAdapter<LifeTask>{
    Context context; 
    int layoutResourceId;    
    ArrayList<LifeTask> data = null;

    public ListAdapter(Context context, int layoutResourceId, ArrayList<LifeTask> List_Data) {
        super(context, layoutResourceId, List_Data);
        this.layoutResourceId = layoutResourceId;
        this.context = context;
        this.data = List_Data;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        ItemHolder holder = null;
        if(row == null)
        {
            LayoutInflater inflater = ((Activity)context).getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);
            holder = new ItemHolder();
            holder.name = (TextView)row.findViewById(R.id.ItemName);
            row.setTag(holder);
        }
        else
        {
            holder = (ItemHolder)row.getTag();
        }

        LifeTask s = data.get(position);
        holder.name.setText(s.getName());
        return row;

    }

    static class ItemHolder{

        TextView name;

    }
}
4

1 に答える 1

4

次の方法でアダプターを変更することをお勧めします。

public class ListAdapter extends ArrayAdapter<LifeTask> {
    int layoutResourceId;

    public ListAdapter(Context context, int layoutResourceId, ArrayList<LifeTask> List_Data) {
        super(context, layoutResourceId, List_Data);
        this.layoutResourceId = layoutResourceId;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        ItemHolder holder = null;

        if(row == null) {
            LayoutInflater inflater = parent.getContext().getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);
            holder = new ItemHolder();
            holder.name = (TextView)row.findViewById(R.id.ItemName);
            row.setTag(holder);
        } else {
            holder = (ItemHolder)row.getTag();
        }

        final LifeTask s = getItem(position);
        holder.name.setText(s.getName());
        return row;
    }

    static class ItemHolder{
        TextView name;
    }
}

Your implementation の問題は、独自のArrayList<LifeTask> data. ArrayAdapter<LifeTask>ただし、親クラスには既にアイテムのコンテナーがあるため、必要ありません。

そして、次のようなコードを使用してリストを更新します。

adapter.clear();
adapter.addAll(negativeListData);

メソッドclear()およびaddAll()はnotifyDataSetChanged( )を呼び出します。

于 2013-06-04T04:28:08.237 に答える