lundi 13 juillet 2015

RecyclerView and database, unable to delete items

ok, so i have been going around in circles for the past couple of days on this problem, unable to find a working solution, perhaps i don't know how to phrase the question right. But here goes.

i am working on a project that is using a RecyclerView adapter, to load and display simple elements from my sqlite database, containing a String quote and a string reference to an image ressource. This part works just fine, but i can't seem to be able to delete any items.

i have gone through the code making sure that the connection to my database is only opened when needed and closed afterwards, and there should be no open issues here.

i can actually delete item from inside the Recyclerview adapter when clicking on a element, but if i exit and enter again, the deleted items have been loaded again. This places my problem with the database i would think, or perhaps some sort of dueling banjos like problems where a functions recreates a deleted item. But i have followed the code numerous times now, and for the life in me, i can't seem to solve the issue.

At the moment in my delete click event i am running a delete call to my database and my recyclerview adapter, but the problem persists.

i was hoping for any input that could help my pinpoint the issue. I am not sure what code to include in this question, i have included my RecyclerView adapter and database adapter. And i know how close to impossible it is to answer these sort of questions without being able to see the code, but still.

*please excuse the mess. i have been trying out a lot of things.

// RECYCLERVIEW ADAPTER

    public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.DataObjectHolder>
{
    private ArrayList<Instance> instanceDataset;
    private theClickListener clickListener;
    public Context context;

    private DBAdapter db;
    private Button deleteButton;
    private int thePosition;


    public RecyclerViewAdapter(Context context)
    {
        this.context = context;
    }


// ViewHolder inner class


    class DataObjectHolder extends RecyclerView.ViewHolder implements View.OnClickListener
    {
        CardView cv;
        TextView comment;
        ImageView imageViewLocalAdapter;


        public DataObjectHolder(final View itemView)
        {
            super(itemView);
            cv = (CardView) itemView.findViewById(R.id.cardview_layout);
            comment = (TextView) itemView.findViewById(R.id.cardview_textView);
            imageViewLocalAdapter = (ImageView) itemView.findViewById(R.id.cardview_imageView);

            deleteButton = (Button) itemView.findViewById(R.id.delete_button);
            //itemView.setOnClickListener(this);
        }

        // this here displays the position of item clicked
        @Override
        public void onClick(View v)
        {
            //Intent intent = new Intent(context, SingleInstanceFragment.class);

           // Log.d(" clicking ", "onClick " + getPosition());



            //clickListener.onTheGreatItemClick(getPosition(), v);
        }
    }



    public void setOnItemClickListener(theClickListener clickListener)
    {
        this.clickListener = clickListener;
    }

    public RecyclerViewAdapter(ArrayList<Instance> instanceDataSet, Context context)
    {
        this.instanceDataset = instanceDataSet;
        this.context = context;
    }

// THE VIEWHOLDER


    @Override
    public DataObjectHolder onCreateViewHolder(ViewGroup viewGroup, int viewType)
    {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.cardview, viewGroup, false);
        DataObjectHolder dataObjectHolder = new DataObjectHolder(view);
        return dataObjectHolder;
    }

    @Override
    public void onBindViewHolder(final DataObjectHolder holder, final int position)
    {
        final Instance inst = instanceDataset.get(position);
        openDB();
        thePosition = position;

        holder.comment.setText(inst.getComment());

        String middle = "/sdcard/unapp/";
        Uri uri = Uri.parse("file://" + middle + inst.getImage());

        Picasso.with(holder.imageViewLocalAdapter.getContext())
                .load(uri)
                .fit().centerCrop()
                .into(holder.imageViewLocalAdapter);

        final RecyclerView.ViewHolder reHolder = holder;

        holder.imageViewLocalAdapter.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                deleteItem(position);
                Log.d("position in ", " RecyclerView Adapter " + position);
                onBindViewHolder(holder, position);
//                Intent intent = new Intent(context, SingleInstanceActivity.class);
//                intent.putExtra("position", position);
//
//                context.startActivity(intent);
            }

        });
    }

    public void addItem(Instance dataObj, int index)
    {
        instanceDataset.add(dataObj);
        notifyItemInserted(index);
    }

    public void deleteItem(int index)
    {
        Log.d("count", "deleteItem " +getItemCount());
        instanceDataset.remove(index);
        db.deleteRow(index);

        db.close();
        notifyItemRemoved(index);

        //new RecyclerViewAdapter(instanceDataset, context);

        Log.d("count", "deleteItem DEUX  " +getItemCount());
    }

    private void openDB()
    {
        db = new DBAdapter(this.context);
        db.open();
    }


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



    public Instance getItem(int position)
    {
        return instanceDataset.get(position);
    }

//  clicklistener interface

    public interface theClickListener
    {
        void onTheGreatItemClick(int position, View v);

    }
}

// DATABASE ADAPTER

    public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.DataObjectHolder>
{
    private ArrayList<Instance> instanceDataset;
    private theClickListener clickListener;
    public Context context;

    private DBAdapter db;
    private Button deleteButton;
    private int thePosition;


    public RecyclerViewAdapter(Context context)
    {
        this.context = context;
    }


// ViewHolder inner class


    class DataObjectHolder extends RecyclerView.ViewHolder implements View.OnClickListener
    {
        CardView cv;
        TextView comment;
        ImageView imageViewLocalAdapter;


        public DataObjectHolder(final View itemView)
        {
            super(itemView);
            cv = (CardView) itemView.findViewById(R.id.cardview_layout);
            comment = (TextView) itemView.findViewById(R.id.cardview_textView);
            imageViewLocalAdapter = (ImageView) itemView.findViewById(R.id.cardview_imageView);

            deleteButton = (Button) itemView.findViewById(R.id.delete_button);
            //itemView.setOnClickListener(this);
        }

        // this here displays the position of item clicked
        @Override
        public void onClick(View v)
        {
            //Intent intent = new Intent(context, SingleInstanceFragment.class);

           // Log.d(" clicking ", "onClick " + getPosition());



            //clickListener.onTheGreatItemClick(getPosition(), v);
        }
    }



    public void setOnItemClickListener(theClickListener clickListener)
    {
        this.clickListener = clickListener;
    }

    public RecyclerViewAdapter(ArrayList<Instance> instanceDataSet, Context context)
    {
        this.instanceDataset = instanceDataSet;
        this.context = context;
    }

// THE VIEWHOLDER


    @Override
    public DataObjectHolder onCreateViewHolder(ViewGroup viewGroup, int viewType)
    {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.cardview, viewGroup, false);
        DataObjectHolder dataObjectHolder = new DataObjectHolder(view);
        return dataObjectHolder;
    }

    @Override
    public void onBindViewHolder(final DataObjectHolder holder, final int position)
    {
        final Instance inst = instanceDataset.get(position);
        openDB();
        thePosition = position;

        holder.comment.setText(inst.getComment());

        String middle = "/sdcard/unapp/";
        Uri uri = Uri.parse("file://" + middle + inst.getImage());

        Picasso.with(holder.imageViewLocalAdapter.getContext())
                .load(uri)
                .fit().centerCrop()
                .into(holder.imageViewLocalAdapter);

        final RecyclerView.ViewHolder reHolder = holder;

        holder.imageViewLocalAdapter.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                deleteItem(position);
                Log.d("position in ", " RecyclerView Adapter " + position);
                onBindViewHolder(holder, position);
//                Intent intent = new Intent(context, SingleInstanceActivity.class);
//                intent.putExtra("position", position);
//
//                context.startActivity(intent);
            }

        });
    }

    public void addItem(Instance dataObj, int index)
    {
        instanceDataset.add(dataObj);
        notifyItemInserted(index);
    }

    public void deleteItem(int index)
    {
        Log.d("count", "deleteItem " +getItemCount());
        instanceDataset.remove(index);
        db.deleteRow(index);

        db.close();
        notifyItemRemoved(index);

        //new RecyclerViewAdapter(instanceDataset, context);

        Log.d("count", "deleteItem DEUX  " +getItemCount());
    }

    private void openDB()
    {
        db = new DBAdapter(this.context);
        db.open();
    }


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



    public Instance getItem(int position)
    {
        return instanceDataset.get(position);
    }

//  clicklistener interface

    public interface theClickListener
    {
        void onTheGreatItemClick(int position, View v);

    }
}

Aucun commentaire:

Enregistrer un commentaire