androidandroid-recyclerviewrealm-database

How can I delete specific item from recycler view and from realm database?


Can't figure out how to delete specific item from recycler view and realm database. I figured out to delete item from recycler view so when I when click on button delete, it deletes that item, but can't figure out how to delete from datebase as well becouse of course when I restart app, same date appears becouse it's not deleted from database.

listitem.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="wrap_content"
    android:id="@+id/parentLayout">

    <TextView
        android:id="@+id/tv_task"
        android:text="TASK1"
        android:textSize="20sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:layout_alignParentLeft="true"/>

    <Button
        android:id="@+id/btn_delete"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Delete"
        android:layout_alignParentRight="true"/>
</RelativeLayout>

MainActivity:

public class MainActivity extends AppCompatActivity {

    private ArrayList<String> mTasks = new ArrayList<>();
    EditText et_newtask;
    Button btn_add;
    Realm realm;
    RecyclerView recyclerView;
    RecyclerViewAdapter adapter;


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

        //SETUP RV
        recyclerView = findViewById(R.id.recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        //SETUP REALM
        realm = Realm.getDefaultInstance();

        RealmHelper helper = new RealmHelper(realm);
        mTasks = helper.retrive();

        //BIND
        adapter = new RecyclerViewAdapter( mTasks,this);
        recyclerView.setAdapter(adapter);

        initTextViewTasks();
    }

    private void initTextViewTasks(){
        et_newtask = (EditText) findViewById(R.id.et_newTask);
        btn_add = (Button) findViewById(R.id.btn_add);
        btn_add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //GET DATA
                Tasks t = new Tasks();
                String value = et_newtask.getText().toString();
                t.setTasks(value);

                //SAVE DATA to DB
                RealmHelper helper = new RealmHelper(realm);
                helper.save(t);
                et_newtask.setText("");

                //refresh DB
                mTasks = helper.retrive();
                adapter = new RecyclerViewAdapter(mTasks,MainActivity.this);
                recyclerView.setAdapter(adapter);
            }
        });
    }
}

Tasks class:

public class Tasks extends RealmObject {
    private String tasks;

    public String getTasks() {
        return tasks;
    }

    public void setTasks(String tasks) {
        this.tasks = tasks;
    }
}

Adapter:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>{


    private ArrayList<String> mTv_tasks = new ArrayList<>();
    private ArrayList<Tasks> dataList = new ArrayList<>();
    private Context mContext;
    OnClickInterface onClickInterface;
    Realm realm;


    public RecyclerViewAdapter(ArrayList<String> mTv_tasks,OnClickInterface onClickInterface, Context mContext) {
        this.mTv_tasks = mTv_tasks;
        this.mContext = mContext;
        this.onClickInterface = onClickInterface;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int position) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.layout_listitem, viewGroup,false);
        ViewHolder viewHolder = new ViewHolder(view,onClickInterface);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder viewHolder, final int position) {
        viewHolder.tv_task.setText(mTv_tasks.get(position));

        viewHolder.parentLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(mContext, mTv_tasks.get(position), Toast.LENGTH_SHORT).show();
            }
        });
    }

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

When I click on specific btn_delete I want to delete that specific object (row) of recycler view.


Solution

  • I'm assuming that you know how to delete an item from Realm, but you don't know how to do that with an onclicklistener inside your adapter.

    1) Create an interface to do the communication between adapter and activity

    public interface OnClickInterface {
        void onDeleteClicked(int id); //user id, or whatever you need to know what item you should delete
    }
    

    2) Receive your listener in the adapter constructor

     public class YourAdapter ... {
         OnClickInterface onClickInterface;
    
         //initialilize in a constructor
         public Adapter(OnClickInterface onClickInterface){
            this.onClickInterface = onClickInterface
         }
    }
    

    3) Call the listener inside your onClick to delete the item from RecyclerView

    public void onClick(View v) { 
         if(v.equals(btn_delete)){ 
            this.onClickInterface.onDeleteClicked(id)
            (...) remove from recycler view
         }
    }
    

    4) Implements OnCickInterface on your Activity

    public class MainActivity extends AppCompatActivity implements OnClickInterface {
    
        @Override
        public void onDeleteClicked(int id){
           //delete from realm
        }
    
    }
    

    Thats it, really hope that this helps with your problem