Java 使用AsyncTask成功更新RecyclerView,但活动/UI线程中的大小Arraylist未更改
我有一个活动,其中在这些活动中,将基于AsyncTask onPostExecute加载带有适配器的RecyclerView。 这是代码Java 使用AsyncTask成功更新RecyclerView,但活动/UI线程中的大小Arraylist未更改,java,android,Java,Android,我有一个活动,其中在这些活动中,将基于AsyncTask onPostExecute加载带有适配器的RecyclerView。 这是代码 public class AntamAddEditDetailBagsQueueIncomingActivity extends AppCompatActivity { public static final String EXTRA_ID = "com.tsurumaru.dzil.clientwarehouse.EXTRA_ID"; R
public class AntamAddEditDetailBagsQueueIncomingActivity extends AppCompatActivity {
public static final String EXTRA_ID = "com.tsurumaru.dzil.clientwarehouse.EXTRA_ID";
RecyclerView recyclerView;
BagLotNumberAdapter bagLotNumberAdapter;
ArrayList<BagLotNumberModel> bagLotNumbers = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_antam_add_edit_detail_bags_queue_incoming);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_close);
Intent intent = getIntent();
long id = intent.getLongExtra(EXTRA_ID, -1);
setTitle("Edit Bags " + intent.getLongExtra(EXTRA_ID, -1));
recyclerView = findViewById(R.id.recyclerViewAntamIncomingScanQR);
// Default is emtpy
bagLotNumberAdapter = new BagLotNumberAdapter(this, bagLotNumbers);
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.setAdapter(bagLotNumberAdapter);
ItemTouchHelper itemTouchHelper = new
ItemTouchHelper(new SwipeToDeleteBagLotNumberCallback(bagLotNumberAdapter));
itemTouchHelper.attachToRecyclerView(recyclerView);
// Run on Asynctask
QueueIncomingRepository queueIncomingRepository = new QueueIncomingRepository(this, id);
queueIncomingRepository.getAllJoinBag();
}
}
非常感谢您的帮助。您正在异步任务的onPostExecute()方法中创建一个新适配器,而ItemTouchHelper仍在引用onCreate()方法中创建的先前适配器,如下所示:
onCreate() {
...
bagLotNumberAdapter = new BagLotNumberAdapter(this, bagLotNumbers);
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.setAdapter(bagLotNumberAdapter);
ItemTouchHelper itemTouchHelper = new
ItemTouchHelper(new SwipeToDeleteBagLotNumberCallback(bagLotNumberAdapter));
itemTouchHelper.attachToRecyclerView(recyclerView);
...
}
在onPostExecute()方法中:
不要在onPostExecute()中创建新适配器,而是在适配器类中定义一个类似setData()的方法,该方法将旧数据替换为一个:
pubilc void setData(List newData){
this.list = newData
}
因此,您的onPostExecute()方法现在变成:
onPostExecute() {
...
RecyclerView recyclerView = ((Activity) context).findViewById(R.id.recyclerViewAntamIncomingScanQR);
BagLotNumberAdapter bagLotNumberAdapter = (BagLotNumberAdapter )recyclerView.getAdapter();
bagLotNumberAdapter.setData(bagLotNumbers);
((Activity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
// Update adapter
bagLotNumberAdapter.notifyDataSetChanged();
}
});
...
}
因为您正在回调中创建一个新适配器,而ItemTouchHelper附加到“previous”适配器。
onPostExecute() {
...
RecyclerView recyclerView = ((Activity) context).findViewById(R.id.recyclerViewAntamIncomingScanQR);
BagLotNumberAdapter bagLotNumberAdapter = new BagLotNumberAdapter(context, bagLotNumbers);
recyclerView.setAdapter(bagLotNumberAdapter);
...
}
pubilc void setData(List newData){
this.list = newData
}
onPostExecute() {
...
RecyclerView recyclerView = ((Activity) context).findViewById(R.id.recyclerViewAntamIncomingScanQR);
BagLotNumberAdapter bagLotNumberAdapter = (BagLotNumberAdapter )recyclerView.getAdapter();
bagLotNumberAdapter.setData(bagLotNumbers);
((Activity) context).runOnUiThread(new Runnable() {
@Override
public void run() {
// Update adapter
bagLotNumberAdapter.notifyDataSetChanged();
}
});
...
}