[英]RecyclerView not update
我的 MainActivity 有一個 recyclerview 將接收產品。 在 MainActivity 的 floatActionButton 中,我調用 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 來更新數據一樣。 有人可以給我一盞燈嗎? 如果你需要一些東西,但你找不到任何方法。
編輯-----
添加活動
@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();
}
});
主要活動
@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);
}
});
無需創建新的 Adapter,只需使用當前的適配器實例並將其用於更新和 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()
}
問題是; 您正在創建一個新的適配器實例,而不是使用附加到您的recyclerView
的適配器。 請使用附加到您的 recyclerView 的相同適配器實例。
在您的 recyclerView 實例化的 Activity 中,使用成員引用來包含您的引用。 即mInsumoAdapter
然后,當您創建第一個適配器實例並將其附加到您的 recyclerView 時,將其分配給mInsumoAdapter
。
最后使用相同的引用來調用您的update
方法。
mInsumoAdapter.update(insumo, pos);
對於活動和服務之間的共享引用,您可以像這樣創建一個公共共享 class:
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 以在運行時更新。
當您返回之前的活動時,請記住將ReferenceUtil
中的 static insumoAdapter
設置為 null,因為這可能會導致您的應用程序中出現 memory 泄漏。
嘗試在將列表傳遞給適配器的活動中使用 notifyDataSetChnaged() ,或者您可以在更新它之后執行此操作。 像這樣的東西,
RecyclerView.setAdapter(this,list);
notifyDataSetChanged();
或者
InsumoAdapter.update(list,pos);
notifyDataSetChanged();
您可以嘗試將這種方式用於所有 CRUD 操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.