【发布时间】:2016-10-05 07:52:06
【问题描述】:
我正在创建一个带有回收器视图和 SQLite 数据库的应用程序。当用户输入一些数据时,它会显示在回收站视图中并添加到我的数据库中。现在我想在回收站视图中实现delete 功能。
我想要什么:
我想同时从数据库和回收站视图中删除所需的行,而不会得到任何意外结果。并且所有行都应该被删除。
我的尝试:
我在回收站视图的
cardView上实现了onLongClickListener(我使用cardView 作为回收站视图的行)。现在,当使用长按时,我得到了适配器位置。并删除该位置的数据库条目。
但这给了我意想不到的结果,例如:当再次创建回收器视图的活动并且永远不会删除最后 2-3 行时,实际删除行下方的所有已删除行或曾经被删除的行都会出现数据库条目已被删除。
我的回收器视图适配器代码是:
public class AdapterForMain extends RecyclerView.Adapter<AdapterForMain.ViewHolder>{
ArrayList<String> mDataset;
ArrayList<String> mfooterSet;
private int[] icon;
MainActivity context;
DatabaseHelper myDb;
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
// each data item is just a string in this case
public TextView txtHeader;
public TextView txtFooter;
public ImageView imgView;
// MainActivity mainActivity;
CardView cardView;
public ViewHolder(View v) {
super(v);
txtHeader = (TextView) v.findViewById(R.id.firstLine);
txtFooter = (TextView) v.findViewById(R.id.secondLine);
imgView = (ImageView) v.findViewById(R.id.icon);
cardView = (CardView)v.findViewById(R.id.cardView);
cardView.setOnClickListener(this);
cardView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
myDb = new DatabaseHelper(context);
int detingPos = getAdapterPosition();
boolean isDeleted = myDb.deleteEntry(detingPos);
if(isDeleted){
mDataset.remove(getAdapterPosition());
notifyItemRemoved(getAdapterPosition());
notifyItemRangeChanged(getAdapterPosition(),mDataset.size());
}
Toast.makeText(context,"Delete from here",Toast.LENGTH_SHORT).show();
return true;
}
});
}
@Override
public void onClick(View view) {
// Toast.makeText(context,Integer.toString(getAdapterPosition()),Toast.LENGTH_SHORT).show();
context.detailActivity(getAdapterPosition(),mDataset.get(getAdapterPosition()),mfooterSet.get(getAdapterPosition()));
}
}
// Provide a suitable constructor (depends on the kind of dataset)
public AdapterForMain(ArrayList<String> myDataset, ArrayList<String> myFooterSet, int[] images, MainActivity context0) {
icon = images;
mDataset = myDataset;
mfooterSet = myFooterSet;
context = context0;
}
// Create new views (invoked by the layout manager)
@Override
public AdapterForMain.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
// create a new view
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_main, parent, false);
// set the view's size, margins, paddings and layout parameters
ViewHolder vh = new ViewHolder(v);
return vh;
}
// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
// - get element from your dataset at this position
// - replace the contents of the view with that element
final String name = mDataset.get(position);
holder.txtHeader.setText(mDataset.get(position));
holder.txtHeader.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// Toast.makeText(AdapterForMain.this,"Settings Activity is under Construction.",Toast.LENGTH_SHORT).show();
}
});
holder.txtFooter.setText(mfooterSet.get(position));
holder.imgView.setImageResource(icon[position%1]);
}
// Return the size of your dataset (invoked by the layout manager)
@Override
public int getItemCount() {
return mDataset.size();
}}
以及delete方法的代码:
public boolean deleteEntry(int row) {
SQLiteDatabase db=this.getWritableDatabase();
db.delete(TABLE_NAME, COL_1 + "=" + row,null);
return true;
}
我已经看到了解决方案的以下链接,但无法获得我想要的确切解决方案。
【问题讨论】:
-
删除后你必须重新加载适配器到recyclerview
-
使用this适配器
-
@pskink 我不想使用自定义适配器。
-
@kgandroid 但是如何重新加载呢?那么上面提到的其他一些意想不到的结果呢?
-
现在您正在使用 custom 适配器,我发布的是通用的
Cursor适配器
标签: java android database sqlite android-recyclerview