Как разместить onClickListeners для представлений внутри элементов переработчика? - PullRequest
0 голосов
/ 08 сентября 2018

Я работаю с переработчиком и базой данных sqlite. Я хочу разместить кнопку в просмотре карты так, чтобы всякий раз, когда пользователь нажимал на эту кнопку, соответствующая запись удалялась из таблицы.
Это мой класс адаптера для переработчика.

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 голосов
/ 08 сентября 2018

Другая альтернатива Если вы хотите, чтобы ваша деятельность была чистой и не обрабатывать данные изнутри. Сохраните его для адаптера для обработки удаляемых данных и уведомления о любых изменениях. Просто создайте прослушиватель для кнопки в методе onbindviewholder.

0 голосов
/ 08 сентября 2018

Попробуйте это так:

Ваш интерфейс:

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

In onBindViewHolder

holder.delete.setTag(id);

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