【问题标题】:How can I delete specific item from recycler view and from realm database?如何从回收站视图和领域数据库中删除特定项目?
【发布时间】:2019-06-12 20:40:26
【问题描述】:

无法弄清楚如何从回收站视图和领域数据库中删除特定项目。 我想从回收站视图中删除项目,所以当我单击按钮删除时,它会删除该项目,但无法弄清楚如何从数据库中删除,因为当然当我重新启动应用程序时,会出现相同的日期,因为它不是从数据库中删除。

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>

主活动:

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);
            }
        });
    }
}

任务类:

public class Tasks extends RealmObject {
    private String tasks;

    public String getTasks() {
        return tasks;
    }

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

适配器:

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();
    }

当我点击特定的 btn_delete 时,我想删除回收站视图的特定对象(行)。

【问题讨论】:

  • 如何删除回收站视图项?
  • public void onClick(View v) { if(v.equals(btn_delete)){ removeAt(getAdapterPosition()); } } public void removeAt(int position) { mTv_tasks.remove(position); notifyItemRemoved(位置); notifyItemRangeChanged(位置, mTv_tasks.size()); }
  • 不要在 onClick 中设置适配器。你只需要在 onClick() 中通知DatasetChanged

标签: android android-recyclerview realm-database


【解决方案1】:

我假设您知道如何从 Realm 中删除项目,但您不知道如何使用适配器中的 onclicklistener 来执行此操作。

1) 创建一个接口来做adapter和activity之间的通信

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

2) 在适配器构造函数中接收你的监听器

 public class YourAdapter ... {
     OnClickInterface onClickInterface;

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

3) 在 onClick 中调用监听器以从 RecyclerView 中删除项目

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

4) 在你的 Activity 上实现 OnCickInterface

public class MainActivity extends AppCompatActivity implements OnClickInterface {

    @Override
    public void onDeleteClicked(int id){
       //delete from realm
    }

}

就是这样,真的希望这对您的问题有所帮助

【讨论】:

  • 我仍然很困惑,如何获取要发送的参数:this.onClickInterface.onDeleteClicked(id)
  • 我不断收到此错误:java.lang.NullPointerException: Attempt to invoke interface method 'void krunoslavkovac.ferit.myapplication.OnClickInterface.onDeleteClicked(java.lang.String)' on an null object reference
  • 这只是一个例子,您可以返回选择的项目 onDeleteClicked(String task) 然后在您的适配器上单击: onDeleteClicked(mList.get(getAdapterPosition());... 然后您将拥有您在活动中选择的项目。空指针的问题似乎是您没有正确初始化您的侦听器,不能仅通过查看日志来说明
  • 我认为我用错误修复了这个问题,但是现在,当我 getAdapterPosition 时,我收到错误 java.lang.IndexOutOfBoundsException: Invalid index 5, size is 0
  • 你能用你的适配器代码更新你的问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-02
  • 2021-06-08
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多