RecyclerView не обновляется - PullRequest
2 голосов
/ 18 июня 2020

-дополнительное описание

My MainActivity имеет приложение recyclerview, которое будет получать продукты. В floatActionButton MainActivity я вызываю AddActivity, в котором есть поля для добавления продукта, в том числе ресайклер, куда я вставляю входные данные для расчета цены. проблема именно в AddActivity recyclerView

У меня есть простой recyclerView и адаптер ниже, где я выполняю CRUD перед сохранением в базу данных, и все работает, кроме обновления, где я обновляю элемент через адаптер, но представление в списке не обновляет данные. Если вы щелкните тот же элемент, чтобы отредактировать его снова, он покажет значения, которые уже были обновлены, а не те, которые показаны в списке.

Под моим адаптером:

public class InsumoAdapter extends RecyclerView.Adapter<InsumoAdapter.InsumoViewHolder>{


    private final Context context;
    private List<Insumo> insumos;


    public InsumoAdapter(Context context, List<Insumo> insumos) {
        this.context = context;
        this.insumos = insumos;
    }

    @Override
    public InsumoAdapter.InsumoViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(context).inflate(R.layout.card_teste, viewGroup, false);
        InsumoAdapter.InsumoViewHolder holder = new InsumoAdapter.InsumoViewHolder(view);
        return holder;
    }

    public static class InsumoViewHolder extends RecyclerView.ViewHolder{
        public TextView tNome, tVlrCusto;
        ImageButton btnDelete;
        CardView cardView;
        public InsumoViewHolder(View view){
            super(view);
            tNome = (TextView) view.findViewById(R.id.txtNomeProd);
            tVlrCusto = (TextView) view.findViewById(R.id.txtValorProd);
            btnDelete = (ImageButton) view.findViewById(R.id.imgBtnDel);
            cardView = (CardView) view.findViewById(R.id.cardProduto);
        }
    }

    @Override
    public void onBindViewHolder(final InsumoViewHolder holder, final int position) {
        if(insumos.size() != 0){
            final Insumo p = insumos.get(position);
            holder.tNome.setText(p.getNomeInsumo());
            holder.tVlrCusto.setText(p.getValor().toString());

            holder.cardView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(context, "Clicou no Card para Editar na posição "+position,Toast.LENGTH_SHORT).show();
                    Bundle bundle = new Bundle();
                    //bundle.putString("nome", p.getNomeInsumo());
                    //bundle.putDouble("valor", p.getValor());
                    bundle.putInt("position", position);
                    Intent intent = new Intent(context, UpdateActivity.class);
                    intent.putExtras(bundle);
                    context.startActivity(intent);
                    //update(p, position);
                }
            });

            holder.btnDelete.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(context, "Clicou no Card para Excluir na posição "+position,Toast.LENGTH_SHORT).show();
                    delete(position);
                }
            });
        }
    }

    @Override
    public int getItemCount() {
        return this.insumos != null ? this.insumos.size() : 0;
    }


    private void excluirInsumo(Context context, final int i){
        String titulo = "Excluir";
        String msg = "Deseja excluir este item?";
        AlertDialog alertDialog = new AlertDialog.Builder(context).create();
        alertDialog.setTitle(titulo);
        alertDialog.setMessage(msg);
        alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "Sim",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        //deleta("Pproduto",produtos.get(i).get_id());
                        AddActivity addActivity = new AddActivity();
                        //addActivity.deleta(i);

                        dialog.dismiss();
                    }
                });
        alertDialog.setButton(AlertDialog.BUTTON_NEGATIVE, "Não",
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                });
        alertDialog.show();
    }

    private void delete(int position){
        insumos.remove(position);
        notifyItemRemoved(position);
    }

    public void update(Insumo insumo, int position){
        insumos.set(position, insumo);
        //notifyItemChanged(position);
        notifyDataSetChanged();
    }

    public void insere(Insumo insumo){
        insumos.add(insumo);
        notifyDataSetChanged();
    }


Это например, не возвращаться к onBindViewHolder для обновления данных. Может кто-нибудь дать мне прикурить? Если вам что-то нужно, но вы не можете найти никакого способа.

Редактирование -----

AddActivity

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add);

        edtNome = (TextInputEditText) findViewById(R.id.edtNome);
        valorCusto = (TextView) findViewById(R.id.txtValorCustoAdd);
        valorVenda = (TextView) findViewById(R.id.txtValorVendaAdd);
        valorPerc = (TextView) findViewById(R.id.txtValorPercAdd);
        addItem = (FloatingActionButton) findViewById(R.id.fltBtnAddItem);
        addFoto = (FloatingActionButton) findViewById(R.id.fltBtnAddFoto);
        salvar = (FloatingActionButton) findViewById(R.id.fltBtnSalvar);
        imgFoto = (ImageView) findViewById(R.id.imgFoto);
        recyclerView = (RecyclerView) findViewById(R.id.recy);

        edtNome.setTextIsSelectable(true);

        valorCusto.setText(valor.toString());
        valorPerc.setText("0");

        recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setHasFixedSize(true);

        InsumoAdapter insumoAdapter = new InsumoAdapter(getApplicationContext(), insumos);

        recyclerView.setAdapter(insumoAdapter);
        insumoAdapter.notifyDataSetChanged();

        addItem.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getApplication(), InsertActivity.class);
                startActivity(intent);
            }
        });

        salvar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Produto produto = new Produto();
                produto.setpNome(edtNome.getText().toString());
                produto.setpValorCusto(somaValor(insumos));
                if(foto == 0){
                    produto.setPfoto(R.drawable.noimage);
                }else{
                    produto.setPfoto(foto);
                }
            }
        });
    }

Активность вставки insumo

update.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                insumo = new Insumo();
                insumo.setNomeInsumo(nome.getText().toString());
                Log.d(TAG, getClass()+" insumo.getNome = "+insumo.getNomeInsumo());
                insumo.setValor(Double.parseDouble(valor.getText().toString()));
                Log.d(TAG, getClass()+" insumo.getValor = "+insumo.getValor());
                AddActivity addActivity = new AddActivity();
                //addActivity.update(insumo, pos);
                InsumoAdapter insumoAdapter = new InsumoAdapter(getBaseContext(), addActivity.lista());
                insumoAdapter.update(insumo, pos);
                insumoAdapter.notifyDataSetChanged();
                finish();
            }
        });

MainAcitvity

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = (RecyclerView) findViewById(R.id.recyclerTeste);
        FloatingActionButton btn = (FloatingActionButton) findViewById(R.id.fltBtnAdd);

        recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setHasFixedSize(true);

        ProdutoAdapter produtoAdapter = new ProdutoAdapter(getBaseContext(), produtos);

        recyclerView.setAdapter(produtoAdapter);
        produtoAdapter.notifyDataSetChanged();


        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, AddActivity.class);
                startActivity(intent);
            }
        });

Ответы [ 3 ]

0 голосов
/ 18 июня 2020

Вместо создания нового адаптера просто используйте текущий экземпляр адаптера и используйте его для обновления и notifyDataSetChanged.

public InsumoAdapter insumoAdapter;

// Inside onCreate
@Override
protected void onCreate(Bundle savedInstanceState) {
    ....
    insumoAdapter = new InsumoAdapter(getApplicationContext(), insumos);
    ....
}

// Inside Update onClick
update.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
    ....
    insumoAdapter.update(insumo, pos)
    insumoAdapter.notifyDataSetChanged()
}
0 голосов
/ 18 июня 2020

Проблема в том; вы создаете новый экземпляр адаптера вместо того, чтобы использовать адаптер, прикрепленный к вашему recyclerView. Используйте тот же экземпляр адаптера, который прикреплен к вашему recyclerView.

В вашей Activity, где создается ваш recyclerView, используйте ссылку на член, чтобы содержать вашу ссылку. т.е. mInsumoAdapter

Затем, когда вы создаете свой первый экземпляр адаптера и присоединяете его к своему recyclerView, назначьте его mInsumoAdapter.

Наконец, используйте ту же ссылку для вызова вашего update метода .

mInsumoAdapter.update(insumo, pos);

Для совместного использования ссылок между действиями и службами вы можете создать общий класс общего доступа, например:

public class ReferenceUtil {
    private static InsumoAdapter insumoAdapter;

    public static InsumoAdapter getMainAdapter(){
        return insumoAdapter;
    }

    public static void setMainAdapter(InsumoAdapter adapter) {
        insumoAdapter = adapter;
    }
}

Затем используйте ReferenceUtil.setMainAdapter(adapter);, когда вы нажимаете на свой FAB, и в следующем действии используйте ReferenceUtil.getMainAdapter();, чтобы получить прикрепленную ссылку и обновить ее для своего recyclerView, чтобы он обновлялся во время выполнения.

Не забудьте установить для stati c insumoAdapter в ReferenceUtil значение null, когда вы вернитесь к своей предыдущей деятельности, поскольку это может привести к утечке памяти в вашем приложении.

0 голосов
/ 18 июня 2020

Попробуйте использовать notifyDataSetChnaged () в действии, из которого вы передаете список адаптеру, или вы могли бы сделать это после его обновления. примерно так:

RecyclerView.setAdapter(this,list);
notifyDataSetChanged();

или

InsumoAdapter.update(list,pos);
notifyDataSetChanged();

Вы можете попробовать использовать этот способ для всех операций CRUD.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...