I have a two ArrayList- dimensional type String, which is the input to the adapter class RecyclerView. The data in the list is taken from the SQLite database every time it is called onResume(). I implemented a drag and drop function and a function onMove()that successfully changes list items. However, I need to save the modified list before it is called onResume(), which will overwrite the list and fill it with the old positions. My assumption is to implement an overwrite function in an event onStop(). This is my main activity:
RecyclerView recyclerView;
RecyclerViewAdapter adapter;
RecyclerView.LayoutManager layoutManager;
ArrayList<ArrayList<String>> data;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
assert fab != null;
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i = new Intent(MainActivity.this, ViewDbActivity.class);
startActivity(i);
}
});
recyclerView = (RecyclerView) findViewById(R.id.myRecyclerView);
layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
RecyclerView.ItemAnimator itemAnimator = new DefaultItemAnimator();
ItemTouchHelper item = new ItemTouchHelper(new ItemTouchHelper.Callback() {
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
int swipeFlags = ItemTouchHelper.RIGHT;
return makeMovementFlags(dragFlags, swipeFlags);
}
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
Collections.swap(data, viewHolder.getAdapterPosition(), target.getAdapterPosition());
adapter.notifyItemMoved(viewHolder.getAdapterPosition(), target.getAdapterPosition());
return true;
}
@Override
public void onMoved(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, int fromPos, RecyclerView.ViewHolder target, int toPos, int x, int y) {
super.onMoved(recyclerView, viewHolder, fromPos, target, toPos, x, y);
Toast.makeText(MainActivity.this, "Moved", Toast.LENGTH_SHORT).show();
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
data.remove(viewHolder.getAdapterPosition());
adapter.notifyItemRemoved(viewHolder.getAdapterPosition());
}
});
item.attachToRecyclerView(recyclerView);
recyclerView.setItemAnimator(itemAnimator);
}
@Override
protected void onResume() {
super.onResume();
initialize();
if(adapter == null) {
Log.v(TAG, "Adapter = NULL. Initialized");
setAdapter();
}
else {
Log.v(TAG, "notify is called");
adapter.updateData(data);
}
}
public void initialize() {
Database ourDB = new Database(this);
ourDB.openDB();
data = ourDB.getData();
ourDB.closeDB();
}
public void setAdapter() {
adapter = new RecyclerViewAdapter(data, this);
recyclerView.setAdapter(adapter);
}
It is important to update the database if I know when to store the data. How can I solve this problem? Any suggestions?
!!!
ANSWER:
The final solution that I implemented:
@Override
public void onMoved(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, int fromPos, RecyclerView.ViewHolder target, int toPos, int x, int y) {
super.onMoved(recyclerView, viewHolder, fromPos, target, toPos, x, y);
long movedItem = Long.parseLong(data.get(fromPos).get(0));
long draggedItem = Long.parseLong(data.get(toPos).get(0));
Database db = new Database(MainActivity.this);
db.open();
db.updateOrder(draggedItem, toPos);
db.updateOrder(movedItem, fromPos);
db.close();
}
DB:
public void updateOrder(long rowID, int newPos) {
ContentValues cv = new ContentValues();
cv.put(KEY_ORDER, newPos);
ourDatabase.update(DATABASE_TABLE, cv, KEY_ROWID + "=" + rowID, null);
}