Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用AsyncTask成功更新RecyclerView,但活动/UI线程中的大小Arraylist未更改_Java_Android - Fatal编程技术网

Java 使用AsyncTask成功更新RecyclerView,但活动/UI线程中的大小Arraylist未更改

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

我有一个活动,其中在这些活动中,将基于AsyncTask onPostExecute加载带有适配器的RecyclerView。 这是代码

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();

                    }
                });
...
}