【问题标题】:Delete operation in RecyclerView not doing anythingRecyclerView中的删除操作不做任何事情
【发布时间】:2017-04-23 16:01:43
【问题描述】:

这是适配器 (RVAdapter_Reminders.java)

static List<DatabaseModel> dbList;
static Context context;
DBHelper dbHelper;
private int position;

public RVAdapter_Reminders(Context context, List<DatabaseModel> dbList) {
    this.dbList = new ArrayList<DatabaseModel>();
    this.context = context;
    this.dbList = dbList;
}

public int getPosition() {
    return position;
}

public void setPosition(int position) {
    this.position = position;
}

@Override
public RVAdapter_Reminders.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemLayoutView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.rv_reminder_template, null);
    ViewHolder viewHolder = new ViewHolder(itemLayoutView);
    return viewHolder;
}

@Override
public void onBindViewHolder(final RVAdapter_Reminders.ViewHolder holder, final int position) {
    holder.title.setText(dbList.get(position).getTitle());
    holder.description.setText(dbList.get(position).getDescription());
    holder.address.setText(dbList.get(position).getAddress());
    holder.buttonViewOptions.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //creating a popup menu
            PopupMenu popup = new PopupMenu(context, holder.buttonViewOptions);
            //inflating menu from xml
            popup.inflate(R.menu.reminder_rv_menu);
            popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(MenuItem item) {
                    setPosition(holder.getAdapterPosition());
                    return false;
                }
            });
            popup.show();
        }
    });
}

@Override
public void onViewRecycled(ViewHolder holder) {
    holder.itemView.setOnClickListener(null);
    super.onViewRecycled(holder);
}

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

public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener {

    public TextView title, description, address, buttonViewOptions;

    public ViewHolder(View itemView) {
        super(itemView);

        title = (TextView) itemView.findViewById(R.id.task_title);
        description = (TextView) itemView.findViewById(R.id.desc_title_text_tv);
        address = (TextView) itemView.findViewById(R.id.address_title_text_tv);
        buttonViewOptions = (TextView) itemView.findViewById(R.id.buttonViewOptions);
        itemView.setOnCreateContextMenuListener(this);
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        menu.add(Menu.NONE, R.id.menu_delete_option,
                Menu.NONE, R.string.delete_menu_text);
    }
}

这是适配器在 RecyclerView 中膨胀数据的 Activity

Reminders.java

 FloatingActionButton fab;
DBHelper dbHelper;
List<DatabaseModel> dbList;
RecyclerView mRecyclerView;
private RecyclerView.Adapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_reminders);
    fab = (FloatingActionButton) findViewById(R.id.fab);

    try {
        getSupportActionBar().setTitle("Reminders");
    } catch (Exception e) {
        e.printStackTrace();
    }

    dbHelper = new DBHelper(this);
    dbList = new ArrayList<DatabaseModel>();
    dbList = dbHelper.getDataFromDB();

    mRecyclerView = (RecyclerView) findViewById(R.id.rv_reminders);
    mRecyclerView.setHasFixedSize(true);

    // using a linear layout manager
    mLayoutManager = new LinearLayoutManager(this);
    mRecyclerView.setLayoutManager(mLayoutManager);

    //specifying an adapter
    mAdapter = new RVAdapter_Reminders(this, dbList);
    mRecyclerView.setAdapter(mAdapter);

    registerForContextMenu(mRecyclerView);

}


public void addReminder(View view) {
    Intent intent = new Intent(Reminders.this, NewReminder.class);
    startActivity(intent);
}

@Override
public void onBackPressed() {
    Intent intent = new Intent(Reminders.this, MainActivity.class);
    startActivity(intent);
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    int position = -1;

    try{
        position = ((RVAdapter_Reminders)mRecyclerView.getAdapter()).getPosition();
    }catch (Exception e) {
        Log.d(String.valueOf(this), e.getLocalizedMessage(), e);
        return super.onContextItemSelected(item);
    }

    switch (item.getItemId()){
        case R.id.menu_delete_option:
            onReminderDelete(dbList.get(position).getTitle());
            break;
    }

    return super.onContextItemSelected(item);
}

private void onReminderDelete(String title){
        dbHelper.deleteARow(title);
        mRecyclerView.setAdapter(mAdapter);
}

DBHelper 类中的DeleteRow 函数:

public void deleteARow(String title) {
    SQLiteDatabase db = this.getWritableDatabase();
    db.delete(REMINDERS_TABLE, RemindersContract.TITLE + " = " + title, null);
    Log.d(String.valueOf(this), title + " deleted");
    db.close();
}

最后是 RemindersContract 类:

 public static final String TITLE = "title";

【问题讨论】:

    标签: android sqlite android-recyclerview android-sqlite


    【解决方案1】:

    您的mAdapter 仍有已删除值的值。您必须更新您的 dbList 以获得当前值。

    private void onReminderDelete(String title){
        dbHelper.deleteARow(title);
        dbList.remove(/* value that you want remove*/);
        mAdapter.notifyDataSetChanged();
    }
    

    【讨论】:

    • 我实现了你所说的 dbHelper.deleteARow(title); dbList.remove(位置); mAdapter.notifyDataSetChanged();但它仍然没有做任何事情。
    • 为什么要在适配器中设置dbListcontext static?使其非静态。适配器中 dbList 的第一次初始化也已过时,因为您使用 this.dbList = dbList 对其进行初始化
    • 嗯。做了你推荐的,但结果还是一样。顺便说一句,项目被删除后应该有 Log.d 条目,但也不存在。所以,我认为问题可能是因为 deleteARow() 函数甚至没有被调用?
    • make in onContextItemSelected(MenuItem item) System.out.println("context menu click") 看看它是否会被执行
    • 不出所料,日志中没有任何内容(onContextItemSelected(MenuItem item))所以,问题出在菜单的某个地方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 2023-03-08
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多