Как да изтриете CardView с плъзгане правилно? (използвана база данни SQLite)

Работя върху приложение за Android, което показва серия от карти с някаква информация (в основния фрагмент), която се съхранява в локална SQLite база данни.

Подобно на Матео в този въпрос, внедрих персонализиран адаптер за рециклиране (връзка към GitHub), както и персонализиран слушател за плъзгане (SwipeableRecyclerView), но изправен пред малко по-различен проблем. Когато прекарам пръст в своя елемент carview, той се връща в началната си позиция и вероятно предишният елемент въобще не е изтрит (от база данни и recyclerview, който работи с моя адаптер за рециклиране).

Кодът за моя помощник за бази данни е по-долу:

public class GeekNotesDatabaseHelper {
    static final String DB_NAME = "geeknotes_db";
    static final String TABLE = "notes_table";
    static final int VERSION = 1;
    static final String UID = "_id";
    static final String TITLE = "title";
    static final String CATEGORY = "category";

    private DBHelper dbHelper;
    private SQLiteDatabase database;

    public GeekNotesDatabaseHelper(Context context) {
        dbHelper = new DBHelper(context);
        database = dbHelper.getWritableDatabase();
    }

    public void insertData(String title, String category) {
        ContentValues cv = new ContentValues();
        cv.put(TITLE, title);
        cv.put(CATEGORY, category);
        database.insert(TABLE, null, cv);
    }

    public Cursor getAllData() {
        String buildSQL = "SELECT * FROM " + TABLE + " ORDER BY " + UID + " DESC";
        return database.rawQuery(buildSQL, null);
    }

    public void deleteByID(int position) {
        database.delete(TABLE, UID + " = " + position, null);
    }

    private class DBHelper extends SQLiteOpenHelper {
        public DBHelper(Context context) {
            super(context, DB_NAME, null, VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL("CREATE TABLE " + TABLE + " (" + UID + " INTEGER " +
                    "PRIMARY KEY AUTOINCREMENT, " + TITLE + " TEXT, " + CATEGORY + " TEXT);");
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("DROP TABLE IF EXISTS " + TABLE);
            onCreate(db);
        }
    }
}

Клас на адаптера:

public class GeekNotesAdapter extends CursorRecyclerAdapter<GeekNotesAdapter.ViewHolder> {
    private final Fragment fragment;
    private OnItemClickListener itemClickListener;

    public GeekNotesAdapter(Cursor cursor, Fragment fragment) {
        super(cursor);
        this.fragment = fragment;
    }

    @Override
    public void onBindViewHolderCursor(ViewHolder holder, Cursor cursor) {
        holder.title.setText(
                cursor.getString(cursor.getColumnIndexOrThrow(GeekNotesDatabaseHelper.TITLE)).replaceAll("\\<[^>]*>", ""));

        holder.category.setText(
                cursor.getString((cursor.getColumnIndexOrThrow(GeekNotesDatabaseHelper.CATEGORY))));

        holder.id = cursor.getInt(cursor.getColumnIndexOrThrow(GeekNotesDatabaseHelper.UID));
    }

    @Override
    public GeekNotesAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        final LayoutInflater mInflater = LayoutInflater.from(viewGroup.getContext());
        final View sView = mInflater.inflate(R.layout.note_item, viewGroup, false);
        return new ViewHolder(sView);
    }

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        TextView title;
        TextView category;
        int id;

        public ViewHolder(View view) {
            super(view);
            title = (TextView) view.findViewById(R.id.name);
            category = (TextView) view.findViewById(R.id.category);
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            if (itemClickListener != null) {
                itemClickListener.onItemClick(v, id);
            }
        }
    }

    public interface OnItemClickListener {
        public void onItemClick(View view , int position);
    }

    public void setOnItemClickListener(final OnItemClickListener itemClickListener) {
        this.itemClickListener = itemClickListener;
    }
}

И има кода за моя фрагмент с cardview-items:

public class GeekNotesFragment extends Fragment {

    GeekNotesDatabaseHelper dbHelper;
    GeekNotesAdapter adapter;

    @Override
    public View onCreateView(LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.main_fragment, container, false);

        dbHelper = new GeekNotesDatabaseHelper(getActivity());

        Bundle bundle = getArguments();
        if (bundle != null) {
            // String itemTitle = bundle.getString("tag_item_title");
            // String itemCategory = bundle.getString("tag_item_category");
            Item item = (Item) bundle.getSerializable("note_item");
            dbHelper.insertData(item.getName(), item.getCategory());
        }

        final RecyclerView recyclerList = (RecyclerView) v.findViewById(R.id.itemsInCards);
        recyclerList.setHasFixedSize(true);
        LinearLayoutManager llm = new LinearLayoutManager(getActivity());
        llm.setOrientation(LinearLayoutManager.VERTICAL);
        recyclerList.setLayoutManager(llm);

        setTargetFragment(GeekNotesFragment.this, 0);
        adapter = new GeekNotesAdapter(dbHelper.getAllData(), getTargetFragment());

        recyclerList.setAdapter(adapter);

        SwipeableRecyclerViewTouchListener swipeTouchListener =
                new SwipeableRecyclerViewTouchListener(recyclerList, new SwipeableRecyclerViewTouchListener.SwipeListener() {
                    @Override
                    public boolean canSwipe(int position) {
                        return true;
                    }

                    @Override
                    public void onDismissedBySwipeLeft(RecyclerView recyclerView, int[] reverseSortedPositions) {
                        for (int position : reverseSortedPositions) {
                            dbHelper.deleteByID(position);
                            adapter.notifyItemRemoved(position);
                        }
                        adapter.notifyDataSetChanged();
                    }

                    @Override
                    public void onDismissedBySwipeRight(RecyclerView recyclerView, int[] reverseSortedPositions) {
                        for (int position : reverseSortedPositions) {
                            dbHelper.deleteByID(position);
                            adapter.notifyItemRemoved(position);
                        }
                        adapter.notifyDataSetChanged();
                    }
                });
        recyclerList.addOnItemTouchListener(swipeTouchListener);

        FloatingActionButton fab = (FloatingActionButton) v.findViewById(R.id.fab);
        fab.attachToRecyclerView(recyclerList);
        // fab.setBaselineAlignBottom(true);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FragmentManager fm = getFragmentManager();
                FragmentTransaction ft = fm.beginTransaction();
                ft.replace(R.id.container, new NewNoteFragment());
                ft.addToBackStack(null);
                ft.commit();
            }
        });

        return v;
    }
}

Добавянето на елементи към моята база данни / recyclerview е добре. Но изтриването - за съжаление, не го прави. Нов съм в разработването на Android-приложения, така че, моля, кажете ми какво може да не е наред тук, кой проблем не ми позволява да премахвам елементи от карти правилно и как да го поправя?

Благодаря предварително.


person Konstie    schedule 14.03.2015    source източник


Отговори (1)


Е, това е доста стара публикация. Но бих искал да отговоря, тъй като може да помогне на другите.

Отговор- Опитайте да използвате методи за рециклиращ изглед като-

  1. public RecyclerView.ViewHolder findViewHolderForAdapterPosition (int позиция)
  2. public RecyclerView.ViewHolder findViewHolderForLayoutPosition (int позиция)

за да получите притежателя на изгледа за тази позиция и след това да получите достъп до стойностите на този изглед, за да изтриете в базата данни.

person SVB-knowmywork    schedule 12.01.2016