Removed items reappear when putting in landscape

0

I have a ArrayAdapter in a Listview and when the user clicks and holds it it displays a Contextmenu with the Delete the favorite option.

The delete function is working, but since I create the Adapter in the onCreateView every time I drop the landscape the items come back because it recreates the View

I would like to know how to avoid this

Fragment displaying the bookmarks

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.list_item, container, false);

        mAdapter = new FavoritosAdapter(getActivity(), carregarFavoritos());

        listView = (ListView) rootView.findViewById(R.id.list_favoritos);

        listView.setAdapter(mAdapter);

        registerForContextMenu(listView);

        listView.setEmptyView(rootView.findViewById(R.id.empty));

        return rootView;
    }


    public ArrayList<Favoritos> carregarFavoritos(){
         ArrayList<Favoritos> favoritos = new ArrayList<Favoritos>();
         favoritos.add(new Favoritos("endereco", 5, false, 7, 22));
         favoritos.add(new Favoritos("endereco", 3.5 , true, 7, 22));
         favoritos.add(new Favoritos("endereco", 2, false, 7, 22));
         favoritos.add(new Favoritos("endereco", 4.5, true, 7, 22));

    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        if (v.getId() == R.id.list_favoritos) {
            //Outras opções
            menu.add(Menu.NONE, 3, Menu.NONE, R.string.txt_excluir);
        }
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
         final AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
         switch (item.getItemId()) {
         //Função das outras opções
         case 3:
            favoritosExcluidos = favoritos.remove(info.position);
            mAdapter.notifyDataSetChanged();

            Snackbar snackbar = Snackbar.make(listView, R.string.txt_favorito_excluido, Snackbar.LENGTH_LONG);
            snackbar.setAction(R.string.txt_desfazer, new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Favoritos favorito = favoritosExcluidos;
                    favoritos.add(info.position, favorito);
                    mAdapter.notifyDataSetChanged();
                }
            });
            snackbar.show();
            break;
    }
    return true;
}

FavoritesAdapter

  public FavoritosAdapter(Context context, ArrayList<Favorito> favoritos){
    super(context, 0, favoritos);
}

public static class ItemViewHolder{
    TextView textView1;
    TextView textView2;
    TextView textView3;
    TextView textView4;
    TextView textView5;
    RatingBar ratingBar;
    ImageView imageView;
    TextView textView6;

    public ItemViewHolder(View view){
        textView1 = (TextView) view.findViewById(R.id.txt1);
        textView2= (TextView) view.findViewById(R.id.txt2);
        textView3= (TextView) view.findViewById(R.id.txt3);
        textView4= (TextView) view.findViewById(txt4);
        textView5= (TextView) view.findViewById(txt5);
        ratingBar= (RatingBar) view.findViewById(R.id.ratingBar);
        imageView= (ImageView) view.findViewById(R.id.img);
        textView6= (TextView) view.findViewById(R.id.txt6);
    }
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View listItemView = convertView;


    if (listItemView == null) {
        listItemView = LayoutInflater.from(getContext()).inflate(
                R.layout.favoritos_item, parent, false);
    }

    Favorito currentFavorito = getItem(position);

    final ItemViewHolder holder;

    if(listItemView.getTag() == null){
        holder = new ItemViewHolder(listItemView);
        listItemView.setTag(holder);
    } else {
        holder = (ItemViewHolder) listItemView.getTag();
    }

    if(currentFavorito.getBooleanTxt6()){
        holder.txt6.setText(currentFavorito.txt1());
    } else {
        holder.txt6.setText(currentFavorito.getTxt1());
    }
    holder.txt1.setText(currentFavorito.getTxt1());
    holder.txt2.setText(currentFavorito.getTxt2());
    holder.txt3.setText(currentFavorito.getTxt3());
    holder.txt4.setText(currentFavorito.getTxt4());
    holder.txt5.setText(currentFavorito.getTxt5());
    holder.ratingBar.setRating(currentFavorito.getAvaliacao());


    if(currentFavorito.getBooleanTxt6()){
        holder.imageView.setImageResource(R.drawable.img);
        holder.txt6.setText(R.string.txt6true);
        holder.txt6.setTextColor(getContext().getResources().getColor(R.color.verde));
    } else {
        holder.imageView.setImageResource(R.drawable.img2);
        holder.txt6.setText(R.string.txt6false);
        holder.txt6.setTextColor(getContext().getResources().getColor(R.color.vermelho));
    }

    return listItemView;
}
    
asked by anonymous 23.09.2017 / 15:14

1 answer

2

What happens is that you need to implement a method of fragment called onSaveInstanceState() and save all data that you do not want to be "recreated" when you rotate the screen, for example. And then, in onActivityCreated() , you get the data and reuse it. But you would need to implement Parcelable in your Favoritos class.

The Favoritos class I created below is just an example , since I do not know what your class looks like.

fragment.java

private static final String STATE_FAVORITOS = "stateFavoritos";

// Declara a lista como membro da classe
private List<Favoritos> favoritos;

public ArrayList<Favoritos> carregarFavoritos() {
    favoritos = new ArrayList<>();

    // Adiciona seus itens após instanciar sua lista
    favoritos.add(new Favoritos("endereco", 5, false, 7, 22));
    favoritos.add(new Favoritos("endereco", 3.5 , true, 7, 22));
    favoritos.add(new Favoritos("endereco", 2, false, 7, 22));
    favoritos.add(new Favoritos("endereco", 4.5, true, 7, 22));
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                     Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.list_item, container, false);

    // Instancia seu adapter sem a lista, primeiro
    mAdapter = new FavoritosAdapter(getActivity());

    listView = (ListView) rootView.findViewById(R.id.list_favoritos);

    listView.setAdapter(mAdapter);

    registerForContextMenu(listView);

    listView.setEmptyView(rootView.findViewById(R.id.empty));

    return rootView;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    if (savedInstanceState == null) {
        carregarFavoritos();
    } else {
        favoritos = savedInstanceState.getParcelableArrayList(STATE_FAVORITOS);
    }

    // Não sei se você já tem esse método, mas talvez tenha que criar.
    // Não se esqueça de chamar notifyDataSetChanged() dentro desse método
    mAdapter.setFavoritos(favoritos);
}

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Passa a lista que você quer salvar
    savedInstanceState.putParcelableArrayList(STATE_FAVORITOS, (ArrayList<? extends Parcelable>) favoritos);

    super.onSaveInstanceState(savedInstanceState);
}

Favorites.java

// Sugiro fortemente a você alterar o nome da sua classe
// do plural para o singular, para evitar confusão no entendimento do código.
// E uma vez que ela, aparentemente, representa UM favorito
public class Favoritos implements Parcelable {
    private String endereco;
    private int numero;
    private boolean booleano;

    private Favoritos(Parcel in) {
        // Os mesmos membros passados aqui e também na mesma ordem
        // devem ser passados no método writeToParcel()
        endereco = in.readString();
        numero = in.readInt();
        booleano = in.readByte() != 0;
    }

    @Override
    public boolean equals(Object o) {
        if (getClass() != o.getClass()) return false;

        Favoritos that = (Favoritos) o;

        // Aqui você faz a comparação que achar necessário
        // para verificar se um Favoritos é igual a outro.
        // A que eu coloquei aqui é só um exemplo
        return this == that || (endereco == that.endereco && numero == that.numero);
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(endereco);
        dest.writeInt(numero);
        dest.writeByte((byte) (booleano ? 1 : 0));
    }

    public static final Creator<Favoritos> CREATOR = new Creator<Favoritos>() {
        @Override
        public Favoritos createFromParcel(Parcel in) {
            return new Favoritos(in);
        }

        @Override
        public Favoritos[] newArray(int size) {
            return new Favoritos[size];
        }
    };
}

FavoritesAdapter.java

private List<Favoritos> favoritos;

// Remova a sua lista de favoritos como parâmetro do construtor
public FavoritosAdapter(Context context) {
    // Remove a passagem de 'favoritos' como parâmetro do super também
    super(context, 0);
}

// Outros métodos
...

// Implemente esse método, já que a lista de favoritos
// não vai ser passada no super() desse adapter
@Override
public Favoritos getItem(int position) {
    return favoritos.get(position);
}

// Implemente esse método, já que a lista de favoritos
// não vai ser passada no super() desse adapter
@Override
public int getCount() {
    return favoritos == null ? 0 : favoritos.size();
}

public void setFavoritos(List<Favoritos> favoritos) {
    // Passa sua lista e notifica o adapter para 'inflar' as views
    this.favoritos = favoritos;
    notifyDataSetChanged();
}

public void remove(Favoritos favorito) {
    remove(favoritos.indexOf(favorito));
}

public void remove(int position) {
    if (position >= 0) {
        favoritos.remove(position);
        notifyDataSetChanged();
    }
}
    
02.11.2017 / 00:03