21

ユーザーが更新できるリストがありますが、にnotifyDataSetChanged()関連付けられたアダプターで動作していませんlistView。私はそれを断片的に使用しています。Datbaseは更新されますが、adpaterは更新されません。以下は私の実装です:

私の主なファージ:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    myArrayList = new ArrayList<myList>();
    myArrayList = Database.getSharedObject(getActivity()).getMyList();
    if (myArrayList != null && myArrayList.size() > 0) {
        adapter = new myListAdapter(getActivity(), 0, myArrayList);
    }

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View v = inflater.inflate(R.layout.mainfragment, container, false);
    myListView = (ListView) v.findViewById(R.id.my_list_view);
    myListView.setOnItemClickListener(this);
    if (adapter != null) {
        myListView.setAdapter(adapter);
    }

    return v;
}

いくつかのナビゲーションプロセスリストが更新された後、私のメソッドでデータベースから更新されたリストを取得し、ビューを更新しないメソッドをonResume()呼び出しますが、DBからの対応する配列が更新されます。notifyDatasetChanged()

@Override
public void onResume() {
    super.onResume();
    myArrayList = Database.getSharedObject(getActivity()).getMyList();
    adapter.setItems (myArrayList);
    adapter.notifyDataSetChanged();

}

MyListAdapter

public class MyListAdapter extends ArrayAdapter<Message> {

    private ArrayList<Message> myList;

    /* Context */
    private Context context;

    public void setItems (ArrayList<Message> myList) {
        this.myList = myList;
    }

    public MyListAdapter (Context context, int textViewResourceId, ArrayList<Message> myList) {
        super(context, textViewResourceId, myList);
        this.context = context;
        this.myList = myList;
    }

    @Override
    public View getView (int position, View v, ViewGroup parent) {
        // Keeps reference to avoid future findViewById()
        MyViewHolder viewHolder;

        if (v == null) {
            LayoutInflater li = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = li.inflate(R.layout.list_row, parent, false);

            viewHolder = new MyViewHolder();
            viewHolder.txtImage = (ImageView) v.findViewById(R.id.message_icon);
            viewHolder.txtMessage = (TextView) v.findViewById(R.id.message);
            viewHolder.txtDate = (TextView) v.findViewById(R.id.date);

            v.setTag(viewHolder);
        } else {
            viewHolder = (MyViewHolder) v.getTag();
        }

        Message myMessage = new Message();
        myMessage = myList.get(position);
        if (myMessage != null) {
            viewHolder.txtMessage.setText(myMessage.getText());
            viewHolder.txtDate.setText(myMessage.getDate());
        }
        return v;
    }

    static class MyViewHolder {
        ImageView txtImage;
        TextView txtMessage;
        TextView txtDate;
    }
}

何が悪いのかについて何か考えはありますか?リストビューが更新されないのはなぜですか?どんな助けでも大歓迎です。

4

5 に答える 5

36

notifyDataSetChanged()あなたのために働くことはありません。理由

  1. アダプタはリストへの参照を失います。
  2. 常に新しいリストを作成してアダプタに追加します。次のようにします。グローバルに宣言しながらArrayListを初期化します。

ArrayList<MyItemType> myArrayList=new ArrayList<>();//グローバル変数として

nullおよび空の状態をチェックせずに、リストをアダプタに直接追加します。アダプターをリストに直接設定します(条件をチェックしないでください)

myListView.setAdapter(adapter);

  1. myArrayListにデータを毎回追加します(データが完全に新しい場合は、実際にリストにデータを追加する前に、adapter.clear()とmyArrayList.clear()を呼び出すことができます)が、アダプターを設定しないでください。つまり、新しいデータの場合myArrayListに入力され、次にadapter.notifyDataSetChanged()

     adapter = new myListAdapter(getActivity(), 0, myArrayList);
    
  2. この行を削除します

    adapter.setItems (myArrayList);

于 2013-02-22T19:01:56.000 に答える
13

getCountメソッドをオーバーリグするだけです

    @Override
    public int getCount() {
        return myArrayList.count();
    }
于 2014-07-17T15:35:42.177 に答える
7

setItemsメソッドで、古いArrayListをクリアしてみてください。

これの代わりに:

public void setItems(ArrayList<Message> myList) {
this.myList = myList;
}

これを試して:

public void setItems(ArrayList<Message> myList) {
this.myList.clear();
this.myList.addAll(myList);
notifyDataSetChanged();
}
于 2016-07-25T12:37:07.300 に答える
0

問題はMyListAdapterのコンストラクターにあります

それ以外の

public MyListAdapter(Context context, int textViewResourceId, ArrayList<Message> myList) {
    super(context, textViewResourceId, scheduledMessageList);
    this.context = context;
    this.myList = myList;
}

試す

public MyListAdapter(Context context, int textViewResourceId, ArrayList<Message> myList) {
    super(context, textViewResourceId, myList);
    this.context = context;
    this.myList = myList;
}

また、独自のメソッドsetItemsの代わりに、adapter.clear();その後に呼び出す必要がありますadapter.addAll(myArrayList);

于 2013-02-22T11:55:19.803 に答える
-2

notifyDataSetChanged()アダプターで使用できる場合は!内部に小さなメソッドを作成します

于 2013-02-22T11:11:30.007 に答える