Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Activity chamando ela mesma

Prezados olá a todos!

Estou com um problema em meu código.

Chamo uma activityB, efetuo as alterações necessárias nela e quando clico no navigationbackbutton, ele deveria voltar para a activityA inicial, porém, ele volta para a activityB sem dados. Como se criasse uma nova activity.

Aqui eu chamo a activity B

public void onItemClick(View view, int position) {
                posicao = position;
                ArrayList<Item> itensEnviados;
                Intent vaiPraLista = new Intent(ListaComprasActivity.this, ListaItensActivity.class);
                itensEnviados = compraDAO.pegaItensCompra(position);
                vaiPraLista.putExtra("nome_compra", compraDAO.pegaCompra(position).getNome());
                vaiPraLista.putExtra(CHAVE_ITEM, itensEnviados);
                startActivity(vaiPraLista);
            }

E aqui, ele deveria voltar para a activityA

        tituloCompra.setNavigationOnClickListener(view -> {
            Intent voltaCompras = getIntent();
            voltaCompras.putExtra("items", listaItens);
            setResult(Activity.RESULT_OK, voltaCompras);
            finish();
        });

OBS: Mesmo eu colocando o intent explicito, de B para A, ele cria uma nova instancia de B.

Desde já agradeço!

3 respostas

Fala João, de boa?

Tenta chamar o método setResult só com o resultado sem a intent, só pra tentar algo.

Caso funcione, imagino que você precise passar essa sua lista, minha sugestão é criar uma intent nova.

Eu mudei um pouco a lógica, estou criando uma nova intent e mandando como extra os dados necessários, porém me apareceu outro erro, que é:

Ao tentar reapresentar a lista, ela zera. E estou com problema creio que na lógica pra fazer essa transição de dados entre as intents.

public class ListaComprasActivity extends AppCompatActivity implements DialogFormularioCompra.PegaDados {
    private ArrayList<Compra> compras = new CompraDAO().pegaTodos();
    private RecyclerView recyclerView;
    private ListaComprasAdapter adapter;
    private static int posicao;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.lista_compras_tela_inicial);
        getSupportActionBar().hide();

        Intent intent = getIntent();

        if (intent.hasExtra("items")) {
            ArrayList<Item> itens = (ArrayList<Item>) intent.getSerializableExtra("items");
            compras = (ArrayList<Compra>) intent.getSerializableExtra("compra");
            compras.get(posicao).setListaDeItems(itens);
            Log.d("Retorno", "" + compras.size());
        }

        configuraRecyclerView(compras);

        findViewById(R.id.lista_compras_nova_compra_fab).setOnClickListener(view -> mostraDialogo());

        recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(this, (view, position) -> {
            ArrayList<Item> itensEnviados;
            posicao = position;
            Intent vaiPraLista = new Intent(ListaComprasActivity.this, ListaItensActivity.class);
            itensEnviados = compras.get(position).getListaDeItems();
            vaiPraLista.putExtra("compra", compras.get(position));
            vaiPraLista.putExtra(CHAVE_ITEM, itensEnviados);
            startActivity(vaiPraLista);
        }));
    }

    @Override
    protected void onResume() {
        super.onResume();
        configuraRecyclerView(compras);
    }

    private void mostraDialogo() {
        DialogFormularioCompra.newInstance("Dados").show(getSupportFragmentManager(), "fragment_edit_name");
    }

    @Override
    public void terminaCadastro(String nome, String data) {
        compras.add(new Compra(nome, data));
        adapter.notifyDataSetChanged();
    }

    private void configuraRecyclerView(ArrayList<Compra> todosItens) {
        recyclerView = findViewById(R.id.lista_compras_tela_inical_recyclerViewer);
        adapter = new ListaComprasAdapter(this, todosItens);
        recyclerView.setAdapter(adapter);

    }
}
solução!

Da uma olhada em como estão chegando os dados pra você, nesse bloco:

    if (intent.hasExtra("items")) {
            ArrayList<Item> itens = (ArrayList<Item>) intent.getSerializableExtra("items");
            compras = (ArrayList<Compra>) intent.getSerializableExtra("compra");
            compras.get(posicao).setListaDeItems(itens);
            Log.d("Retorno", "" + compras.size());
        }

Pq você só ve se tem uma chave, a outra não. O bundle tem um problema de tamanho, as vezes você pode estar sobrecarregando o tamanho e tals.

Talvez a solução desse problema seja você ter um ViewModel por exemplo e assim você acaba lidando com diversas possibilidades de melhoria.