如何将onClickListeners放置在recyclerview项内的视图?

时间:2018-09-08 16:48:09

标签: android android-layout android-recyclerview android-sqlite recycler-adapter

我正在使用recyclerview和sqlite数据库。我想在cardview中放置一个按钮,以便每当用户单击该按钮时,都应从表中删除相应的记录。
这是我的recyclerview适配器类

public class CardAdapter extends RecyclerView.Adapter<CardAdapter.CardViewHolder> {
private Context mContext;
private Cursor mCursor;
private butttonsAdapetrListener mlistener;
private RecyclerView.ViewHolder v;
public CardAdapter(Context context, Cursor cursor ,butttonsAdapetrListener listener){
    mContext=context;
    mCursor=cursor;
    mlistener=listener;
}

@NonNull
@Override
public CardViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    LayoutInflater inflater = LayoutInflater.from(mContext);
    View view = inflater.inflate(R.layout.mycard,parent,false);
    return new CardViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull CardViewHolder holder, int position) {
    if(!mCursor.moveToPosition(position)){
        return;
    }
String name = mCursor.getString(mCursor.getColumnIndex("NAME"));
    int total = mCursor.getInt(mCursor.getColumnIndex("TOTAL"));
    int bunked = mCursor.getInt(mCursor.getColumnIndex("BUNK"));
    int color = mCursor.getInt(mCursor.getColumnIndex("COLOR"));
    long id= mCursor.getLong(mCursor.getColumnIndex("_id"));
    holder.nameText.setText(name);
    holder.totalText.setText(Integer.toString(total));
    holder.bunkedText.setText(Integer.toString(bunked));
    holder.colorText.setBackgroundColor(color);
    holder.itemView.setTag(id);
    v=holder;
}
@Override
public int getItemCount() {
    return mCursor.getCount();
}

public class CardViewHolder extends RecyclerView.ViewHolder{
    public TextView nameText;
    public TextView totalText;
    public TextView bunkedText;
    public TextView colorText;
    public Button delete;
    public CardViewHolder(@NonNull View itemView) {
        super(itemView);
        nameText= itemView.findViewById(R.id.name);
        totalText = itemView.findViewById(R.id.total_num);
        bunkedText = itemView.findViewById(R.id.bunked_num);
        colorText= itemView.findViewById(R.id.color);
        delete= itemView.findViewById(R.id.delete);
        delete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mlistener.deleteOnClick(v,getAdapterPosition());
            }
        });
    }
}
public interface butttonsAdapetrListener{
    void deleteOnClick(RecyclerView.ViewHolder v,long position);
}
public void swapCursor(Cursor newCursor){
    if(mCursor!=null){
        mCursor.close();
    }
    mCursor=newCursor;
    if(newCursor!=null){
        notifyDataSetChanged();
    }
}

}

这是我从数据库中删除记录的主要活动代码

public class MainActivity extends AppCompatActivity {
private SQLiteDatabase db;
private CardAdapter mAdapter;
private long id;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    SQLiteOpenHelper proBunkerDatabaseHelper = new ProBunkerDatabaseHelper(this);
    db = proBunkerDatabaseHelper.getWritableDatabase();
    RecyclerView recyclerView =  findViewById(R.id.rv);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    mAdapter = new CardAdapter(this, getCursor(), new CardAdapter.butttonsAdapetrListener() {
        @Override
        public void deleteOnClick(RecyclerView.ViewHolder v, long position) {
            id = (long)v.itemView.getTag();
            db.delete("MYTABLE","_id="+id,null);
            mAdapter.swapCursor(getCursor());
        }
    });
    recyclerView.setAdapter(mAdapter);
    FloatingActionButton b = findViewById(R.id.fab);
    b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(MainActivity.this,AddSubject.class);
            startActivity(intent);
        }
    });

}
public Cursor getCursor(){
    return db.query("MYTABLE",null,null,null,null,null,"_id ASC");
}

}

主要问题是当我单击任何项​​目中的删除按钮时,它正在删除光标中最后一个项目。 没有编译错误和运行时问题,仅记录未按正确顺序删除。

2 个答案:

答案 0 :(得分:1)

像这样尝试:

您的界面:

   public interface butttonsAdapetrListener{
    void deleteOnClick(int id,long adapterPos);
   }

CardViewHolder内部:

 delete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
        int id = (int)view.getTag();
            mlistener.deleteOnClick(id,getAdapterPosition());
        }
    });

onBindViewHolder

holder.delete.setTag(id);

MainActivity onCreate

     mAdapter = new CardAdapter(this, getCursor(), new CardAdapter.butttonsAdapetrListener() {
    @Override
    public void deleteOnClick(int id, long position) {

        db.delete("MYTABLE","_id="+id,null);
        mAdapter.swapCursor(getCursor());
    }
});

答案 1 :(得分:0)

另一种选择 如果您希望自己的活动整洁并且不处理内部数据。 保留它以供适配器处理要删除的数据并通知任何更改。 只需在onbindviewholder方法中为按钮创建一个侦听器。

相关问题