我在gridlayoutmanager中有卡片视图。我已经实现了滑动,即当我向上滑动卡片被解雇时。我的应用程序运行良好,直到我将该代码放入新线程中以提高性能。 当我这样做时,卡片被移除但是它在2-3秒后再次出现。 最初,当我刷卡时,卡会被解雇,下一张卡会出现。
我的代码:
ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.UP )
{
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target)
{
Toast.makeText(getApplicationContext(), "on Move", Toast.LENGTH_SHORT).show();
return false;
}
@Override
public void onSwiped(final RecyclerView.ViewHolder viewHolder, int swipeDir)
{
Toast.makeText(getApplicationContext(), "Task Status changed to COMPLETE", Toast.LENGTH_LONG).show();
new Thread(new Runnable() {
@Override
public void run() {
String username = getIntent().getStringExtra("username");
String password = getIntent().getStringExtra("password");
try {
restApi=new RallyRestApi(new URI("https://rally1.rallydev.com"),username,password);
JsonObject updatedValues = new JsonObject();
updatedValues.addProperty("State", "Completed");
UpdateRequest taskUpdate = new UpdateRequest(data_list.get(viewHolder.getAdapterPosition()).getRef(), updatedValues);
restApi.update(taskUpdate);
data_list.remove(viewHolder.getAdapterPosition());
adapter.notifyDataSetChanged();
} catch (URISyntaxException | IOException e) {
e.printStackTrace();
}
}
});
}
};
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
itemTouchHelper.attachToRecyclerView(recyclerView);
答案 0 :(得分:0)
您应该只在主线程(UI线程)上调用adapter.notifyDataSetChanged()
。
请参阅此SO thread
答案 1 :(得分:0)
使用runOnUiThread()方法从非UI线程执行UI操作。
private class ReceiverThread extends Thread {
@Override
public void run() {
Activity_name.this.runOnUiThread(new Runnable() {
@Override
public void run() {
mAdapter.notifyDataSetChanged();
}
});
}
您无法从其他线程触摸UI的视图。对于您的问题,您可以使用AsyncTask,runOnUiThread或handler。