2016-12-27 2 views
2

У меня возникла проблема с обновлением карт в списке при удалении или редактировании одного вида карты, я пробовал с .notifyDataSetChanged(), но не работал. Я действительно новичок в Android Studio.Устранение неполадок списка после удаления элемента в Android Studio

Вот мой код:

RegistroActivity

public class RegistroActivity extends AppCompatActivity { 
private RecyclerView recyclerView; 
private RecyclerView.Adapter adapter; 
private RecyclerView.LayoutManager layoutManager; 

private List<Registro> items = new ArrayList<>(); 
private RegistroAdapter registroAdapter; 

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



    RegistroModel registroModel = new RegistroModel(); 
    Cursor query = registroModel.showReg(HomeActivity.database); 

    if (query.moveToFirst()) { 
     do { 
      Registro expense = new Registro(query.getInt(0), query.getString(1), query.getFloat(2), query.getFloat(3), query.getString(4), query.getString(5)); 
      items.add(expense); 
     } while (query.moveToNext()); 
    } 

    recyclerView = (RecyclerView) findViewById(R.id.recycler); 
    recyclerView.setHasFixedSize(true); 

    recyclerView.setPadding(8, 8, 8, 8); 
    recyclerView.setLayoutManager(new GridLayoutManager(getApplicationContext(), 2)); 

    layoutManager = new LinearLayoutManager(this); 
    recyclerView.setLayoutManager(layoutManager); 

    adapter = new RegistroAdapter(items); 
    recyclerView.setAdapter(adapter); 
} 

}

заполняют данные из модели с простой SELECT * FROM, а также передавать данные к адаптеру. Вот мой адаптер:

public class RegistroAdapter extends RecyclerView.Adapter<RegistroAdapter.RegistroViewHolder> { 
private List<Registro> items; 

public static class RegistroViewHolder extends RecyclerView.ViewHolder { 
    public ImageView color; 
    public TextView descr; 
    public TextView precio; 
    public TextView cantidad; 
    public ImageButton delete_expense; 
    public ImageButton edit_expense; 

    public Context cont; 

    public RegistroViewHolder(View v, Context context) { 
     super(v); 
     color = (ImageView) v.findViewById(R.id.card_image); 

     descr = (TextView) v.findViewById(R.id.description); 
     precio = (TextView) v.findViewById(R.id.precio); 
     cantidad = (TextView) v.findViewById(R.id.cantidad); 

     delete_expense = (ImageButton) v.findViewById(R.id.delete_button); 
     edit_expense = (ImageButton) v.findViewById(R.id.edit_button); 
     cont = context; 

    } 
} 
public RegistroAdapter(List<Registro> items) { 
    this.items = items; 
} 

@Override 
public int getItemCount() { 
    return items.size(); 
} 

@Override 
public RegistroViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
    View v = LayoutInflater.from(viewGroup.getContext()) 
      .inflate(R.layout.registro_card, viewGroup, false); 
    return new RegistroViewHolder(v, viewGroup.getContext()); 
} 
// 
@Override 
public void onBindViewHolder(RegistroViewHolder viewHolder, final int i) { 
    String gramos = viewHolder.cont.getResources().getString(R.string.gramos); 
    String fecha = viewHolder.cont.getResources().getString(R.string.fecha); 
    String desc = viewHolder.cont.getResources().getString(R.string.tvDesc); 

    viewHolder.color.setImageResource(R.color.fondoCard); 

    viewHolder.descr.setText(fecha + " " + items.get(i).getDate() + "\n" + "\n" + " " + items.get(i).getDesc()); 
    viewHolder.precio.setText(items.get(i).getPrice().toString() + " " + items.get(i).getMoneda()); 
    viewHolder.cantidad.setText(items.get(i).getAmount().toString() + " " + gramos ); 


    viewHolder.edit_expense.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(v.getContext(), EditRegistroActivity.class); 
      int pos = items.get(i).getId(); 
      intent.putExtra("position", pos); 
      v.getContext().startActivity(intent); 
     } 
    }); 

    viewHolder.delete_expense.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick(View v){ 
      int pos = items.get(i).getId(); 
      try{ 
       SQLiteDatabase conn = HomeActivity.database.getWritableDatabase(); 
       int n = conn.delete("registro","id="+pos, null); 
       if (n == 1){ 
        Toast.makeText(v.getContext(), v.getContext().getString(R.string.mensajeEliminarexito), Toast.LENGTH_SHORT).show(); 

       }else { 
        Toast.makeText(v.getContext(),v.getContext().getString(R.string.mensajeErrorEliminar) , Toast.LENGTH_SHORT).show(); 
       } 
      }catch (Exception e){ 
       Toast.makeText(v.getContext(), "Error. ID=" + e.toString(), Toast.LENGTH_SHORT).show(); 
      } 

     } 
    }); 
} 

}

Я установил данные внутри элементов в карточной зрения, эта карта вида имеет два изображения-кнопки для удаления и редактирования каждого элемента в карточной зрения , Я установил для них onClickListener. Он полностью редактирует и удаляет, но не обновляет информацию.

ответ

1

Причина в том, что вы вносите любые изменения в SQLite db, а не в список адаптеров items. Адаптер работает только с набором данных, который вы передали ему при инициализации его в RegistroActivity. Поэтому, когда вы хотите что-то изменить, вам нужно изменить SQLite, чтобы сохранить изменения на постоянной основе и обновить набор данных в адаптерах, чтобы пользователь мог видеть изменения.

В вашем случае, попробуйте добавить три строки кода, которые приведены ниже:

viewHolder.delete_expense.setOnClickListener(new View.OnClickListener(){ 
    @Override 
    public void onClick(View v){ 
     int pos = items.get(i).getId(); 
     try{ 
      SQLiteDatabase conn = HomeActivity.database.getWritableDatabase(); 
      int n = conn.delete("registro","id="+pos, null); 

      items.remove(i); 
      notifyItemRemoved(i); 
      notifyItemRangeChanged(i, item.size()); 

      if (n == 1){ 
       Toast.makeText(v.getContext(), v.getContext().getString(R.string.mensajeEliminarexito), Toast.LENGTH_SHORT).show(); 

      }else { 
       Toast.makeText(v.getContext(),v.getContext().getString(R.string.mensajeErrorEliminar) , Toast.LENGTH_SHORT).show(); 
      } 
     }catch (Exception e){ 
      Toast.makeText(v.getContext(), "Error. ID=" + e.toString(), Toast.LENGTH_SHORT).show(); 
     } 

    } 
}); 
0

Просто удалить элемент из адаптера перед оповещением, как этот

items.remove(i); 

При удалении элемента из БД он не обновит список, потому что ваш адаптер хранит данные из списка перед списком.

Смежные вопросы