ArrayAdapter.NotifyDataSetChanged()不起作用?

时间:2013-02-22 11:05:43

标签: android listview android-arrayadapter

我有一个可由用户更新的列表,但notifyDataSetChanged()无法处理与listView关联的适配器。我在一个片段中使用它。数据库会更新,但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()方法中,我从数据库中获取更新的列表并调用不更新我的视图的notifyDatasetChanged()方法,但是来自DB的相应数组更新了一个。

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

有什么想法会出错吗?为什么listview不会更新?任何帮助表示赞赏。

5 个答案:

答案 0 :(得分:30)

notifyDataSetChanged()不适合您。

的原因
  1. 您的适配器会丢失对您的列表的引用。
  2. 始终在适配器上创建并添加新列表。这样做: 在全局声明的同时初始化ArrayList。

    ArrayList<myList> myArrayList=new ArrayList<myList>(); //作为全局变量

    直接向适配器添加列表,不检查null和空条件。直接将适配器设置为列表(不检查任何条件)

    myListView.setAdapter(adapter);

  3. 将数据添加到myArrayList每次(如果您的数据完全是新的,您可以在实际向列表中添加数据之前调用adapter.clear()和myArrayList.clear())但不要设置适配器 即如果新数据填充在myArrayList中而不仅仅是adapter.notifyDataSetChanged()

    adapter = new myListAdapter(getActivity(), 0, myArrayList);
    
  4. 删除此行

    adapter.setItems (myArrayList);

答案 1 :(得分:8)

刚过来的getCount方法

    @Override
    public int getCount() {
        return myArrayList.count();
    }

答案 2 :(得分:5)

在你的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();
}

答案 3 :(得分: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;
}

您也应该调用adapter.clear();,然后调用adapter.addAll(myArrayList);

而不是您自己的方法setItems

答案 4 :(得分:-2)

如果你可以在适配器中使用notifyDataSetChanged()! 在

中创建一个小方法