ti-enxame.com

ArrayAdapter.NotifyDataSetChanged () não está funcionando?

Eu tenho uma lista que pode ser atualizada pelo usuário, mas notifyDataSetChanged() não está funcionando no adaptador associado ao listView. Estou usando em um fragmento. A base de dados é atualizada, no entanto, o revisor não. A seguir está minha implementação:

Meu Far Far Main:

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

Após o processo de algumas navegações, a Lista é atualizada e, no meu método onResume(), eu obtenho a Lista atualizada do banco de dados e chamo o método notifyDatasetChanged() que não atualiza minha visualização, no entanto, a matriz correspondente do DB é atualizada. .

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

Alguma idéia do que está errado? Por que o listview não está sendo atualizado? Qualquer ajuda é apreciada.

15
Usama Sarwar

notifyDataSetChanged() não funcionará para você. Por quais razões

  1. Seu adaptador perde referência à sua lista.
  2. Sempre criando e adicionando uma nova lista ao adaptador. Faça assim: inicialize o ArrayList enquanto declara globalmente.

    ArrayList<myList> myArrayList=new ArrayList<myList>(); // como uma variável global

    Inclua a lista no adaptador diretamente, sem verificar a condição nula e vazia. Defina o adaptador diretamente para a lista (não verifique nenhuma condição)

    myListView.setAdapter(adapter);

  3. Adicione dados ao myArrayList Sempre (se seus dados forem completamente novos, você pode chamar adapter.clear () e myArrayList.clear () antes de realmente adicionar dados à lista), mas não defina o adaptador, ou seja, se os novos dados forem preenchido no myArrayList do que apenas adapter.notifyDataSetChanged()

    adapter = new myListAdapter(getActivity(), 0, myArrayList);
    
  4. Remova esta linha

    adapter.setItems (myArrayList);

30
Pragnani

Apenas overrige o método getCount

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

No seu método setItems, tente limpar o antigo ArrayList.

em vez disso:

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

Tente o seguinte:

public void setItems(ArrayList<Message> myList) {
this.myList.clear();
this.myList.addAll(myList);
notifyDataSetChanged();
}
5
Igor Fridman

O problema está no construtor de MyListAdapter

Ao invés de

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

experimentar

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

também em vez de você possuir o método setItems, você deve chamar adapter.clear(); seguido por adapter.addAll(myArrayList);

0
Yalla T.