Как правильно изменить или удалить объект из области?

#android #realm

#Android #realm

Вопрос:

У меня есть приложение, и когда пользователь нажимает на элемент из listview, информация об этом элементе отображается на другой странице, пользователь может нажать кнопку редактирования или удаления, чтобы удалить этот элемент из списка.

Проблема в том, что код удаления не работает. Страница сведений просто закрывается и возвращается на страницу списка без удаления или изменения чего-либо.

Попытка

страница списка

     list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Intent in=new Intent(showAll.this,editCar.class);
            in.putExtra("car_id",position);
            startActivity(in);
        }
    });
  

подробная страница

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


    Button btnDelete=(Button) findViewById(R.id.button4);
    Button btnEdit=(Button)findViewById(R.id.edut);

    final EditText comName=(EditText)findViewById(R.id.edit_comp);
    final EditText model=(EditText)findViewById(R.id.edit_model);
    final CheckBox status=(CheckBox)findViewById(R.id.checkbox);

    final int i=getIntent().getIntExtra("car_id",0);

    Realm.init(getApplicationContext());
    final  Realm realm = Realm.getDefaultInstance();

    realm.beginTransaction();

    final RealmResults<Car> cars =realm.where(Car.class).findAll();
    realm.commitTransaction();
    final Car car3=cars.get(i);
    realm.close();


    comName.setText(car3.getName());
    model.setText(car3.getModel());
    status.setChecked(car3.isStatus());
    
    final Context context=this;
    
     btnDelete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            new AlertDialog.Builder(editCar.this).setTitle("warning").setMessage("are you sure you want to delete this car ?")
                    .setPositiveButton("yes", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {


                            Realm.init(getApplicationContext());
                            Realm realm = Realm.getDefaultInstance();
                            realm.beginTransaction();
                            car3.deleteFromRealm();
                            realm.commitTransaction();
                            realm.close();
                        }
                    })
                    .setNegativeButton("No", new DialogInterface.OnClickListener() { //if user choose no do nothing
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            Toast.makeText(context,"no",Toast.LENGTH_SHORT).show();

                        }
                    }).show(); //show dialog
  

Комментарии:

1. Просто чтобы проверить, вы уверены, что объект не удаляется — это не значит, что вы возвращаетесь к предыдущему представлению, которое не обновляется (просто проверка)? Не могли бы вы указать определение типа автомобиля, пожалуйста.

2. Realm.init(getApplicationContext()); перезаписывает вашу конфигурацию по умолчанию. Скорее всего, вы записываете в другой файл, чем ожидалось. Вы должны вызывать только Realm.init() класс Application, а затем установить свою собственную RealmConfiguration в качестве конфигурации по умолчанию.

Ответ №1:

Добавьте эту функциональность при нажатии кнопки удаления. Это работает для меня. 🙂

Вот Notifications мой класс модели.

 Realm realm =  Realm.getDefaultInstance();

final Notifications deletedItem = yourArrayList.get(indexPosition);

realm.executeTransaction(new Realm.Transaction() {
                        @Override
                        public void execute(Realm realm) {
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {

                                    try {
                                        RealmResults<Notifications> **rows** = realm.where(Notifications.class).equalTo("columnKeyName", columnKeyValue).findAll();
                                        **rows**.deleteAllFromRealm();
                                    } catch (Exception e) {
                                        e.printStackTrace();
                                    }
                                }
                            });
                        }
                    });

final int deletedIndex = indexPosition;

// remove the item from recycler view and notify adapter
yourArrayList.remove(deletedIndex);
adapter.notifyDataSetChanged();
  

Надеюсь, это также будет полезно для вас. 🙂

Комментарии:

1. Это не должно работать. Транзакция закрывается к тому времени, когда циклический цикл выполняет запись в этом runnable.

2. @EpicPandaForce откуда у вас проблема? Это отлично работает для удаления отдельного объекта из списка.

3. Возможно runOnUiThread , определяет, находитесь ли вы уже в потоке пользовательского интерфейса, и не отправляет сообщение в обработчик.