0

I need to delete the item from database and ListView. I can delete the item from ListView but i can't delete it from database. I think the problem is in getting the position of the item from the database i tried to do it in my own but it does not work. I don't know what should I do.Help me to slove this.

myDB = new DbHandler(this);
        userList = new ArrayList<>();
        data = myDB.getListContents();
        numRows = data.getCount();
        if (numRows == 0) {
            Toast.makeText(AddCount.this, "No Items", Toast.LENGTH_LONG).show();
        } else {
            while (data.moveToNext()) {
                user = new User(data.getString(1), data.getString(2));
                userList.add(user);
            }
        }
        adapter = new Two_columnListAdapter(this, R.layout.list_item_layout, userList);
        listView.setAdapter(adapter);
        adapter.notifyDataSetChanged();
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
                    public boolean onItemLongClick(final AdapterView<?> arg0, View arg1, final int arg2, final long arg3) {
                        final AlertDialog.Builder delete = new AlertDialog.Builder(AddCount.this);
                        delete.setIcon(R.drawable.ic_baseline_delete_24);
                        delete.setTitle("Are you sure");
                        delete.setMessage("Do you want to delete this item?");
                        delete.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int whichButton) {
                                      DbHandler db = new DbHandler(getApplicationContext());
                                        
                                        myDB.deleteData(userList.get(arg2));
                                        userList.remove(arg2);
                                            adapter.notifyDataSetChanged();
                                            Toast.makeText(getApplicationContext(), "Deleted" ,Toast.LENGTH_SHORT).show();
                                    }
                        });`

`Two_columnAdapter.java

public class Two_columnListAdapter extends ArrayAdapter<User> {
    private LayoutInflater layoutInflater;
    private ArrayList<User>users;
    private int mviewResourceId;
    public Two_columnListAdapter(Context context,int textViewResourceId,ArrayList<User>users){
        super(context,textViewResourceId,users);
        this.users = users;
        layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        mviewResourceId = textViewResourceId;
    }

    public View getView(int position, View convertView, ViewGroup parents){
        convertView = layoutInflater.inflate(mviewResourceId,null);
        User user= users.get(position);
        if (user != null){
            TextView  text = (TextView)convertView.findViewById(R.id.title);
            TextView num = (TextView)convertView.findViewById(R.id.value);
            if (text != null){
                text.setText(user.getText());
            }
            if (num != null){
                num.setText(user.getNum());
            }

        }

        return convertView;
    }

DatabaseHelpher(delete the single row from database)

 public void deleteData(String id) {
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(TABLE_Inputs, KEY_ID + " =?", new String[]{id});
        db.close();
    }
Learner
  • 41
  • 6

1 Answers1

0

You can save the return data inside a model class instead of a list. Then call the setOnLongClickListener in your adapter class, inside onBindViewHolder.

class listHolder extends RecyclerView.ViewHolder{
    private View view;

    public listHolder(@NonNull View itemView) {
        super(itemView);
        view = itemView;
    }
}

@Override
public void onBindViewHolder(@NonNull listHolder listHolder, int position, @NonNull userModel userModel) {
viewHolder.view.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View v) {
        // Do somethings....
    }
});

For more info you can check out this link, Hope this helps!

SY L
  • 25
  • 6
  • It's not working! my app crashes. Can you explain why i need to use onBindViewHolder or suggests me anyother way to delete a single row from the database – Learner Nov 18 '20 at 09:32
  • 1
    @subathra May I know what error you are getting? Because I can't see how you implement that, it is hard for me to help you. For the onBindViewHolder, it is basically just another way to display views, and is faster and has better memory usage. For more info, check https://stackoverflow.com/a/37524217/14163530 – SY L Nov 18 '20 at 09:45