【问题标题】:Update ListView without clearing and blinking在不清除和闪烁的情况下更新 ListView
【发布时间】:2023-03-13 06:35:02
【问题描述】:

我需要在不清除和闪烁的情况下刷新我的列表视图,只显示新项目。但我不能立即这样做,因为我会在几秒钟内使项目异步。由于在程序一开始就清除了适配器,此代码无法正常工作。

private void scanLeDevice(final boolean enable) {
    if (enable) {
        mLeDeviceListAdapterNew.clear();
        //mLeDeviceListAdapterNew.notifyDataSetChanged();

        // Stops scanning after a pre-defined scan period.
        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                mScanning = false;
                mBluetoothAdapter.stopLeScan(mLeScanCallback);

                runOnUiThread(new Runnable(){
                    @Override
                    public void run() {
                        mLeDeviceListAdapterNew.notifyDataSetChanged();
                        scanLeDevice(true);
                        //invalidateOptionsMenu();
                    }
                });
            }
        }, SCAN_PERIOD);


//Here my adapter updates with new items, 
//but it's shouldn't be displayed until I call adapter 
//refresh data in SCAN_PERIOD

【问题讨论】:

  • 您实际上是在向ListView 添加内容吗?在您向我们展示的代码中,您只调用了notifyDataSetChanged()。或者,也许您应该向我们展示更多代码。
  • 详细回答或描述您的 ListView。
  • 对代码的一点描述:它异步更新我的列表适配器,但我不想在它再次更新之前清除我的列表。我想清除适配器项目,然后通过异步添加一些新项目,最后用新项目更新列表视图。但是上面的代码在那之后并没有更新我的列表。
  • 可能是上面代码中递归的问题。避免递归对我有好处。

标签: java android multithreading listview


【解决方案1】:

您可以在设置适配器以反映对列表的更改后立即调用notifyDataSetChanged();。例如

ListView modeList = new ListView(getActivity());
            ArrayAdapter<CharSequence> adapter = ArrayAdapter
                    .createFromResource(getActivity(), R.array.PGA_Arrays,
                            R.layout.simple_spinner_item);
            modeList.setAdapter(adapter);
            adapter.notifyDataSetChanged();

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    您需要在适配器中使用 setData 方法来更新数据。在notiftyDataSetChanged之前调用它。

    公共类 MyAdapter 扩展 BaseAdapter {

    public MyAdapter(...) {
        super(...);
    }
    
    @Override
    public View getView(int position, View view, ViewGroup parent) {
        .....
        return view;
    
    }
    
    private void setData() {
        ...
        notifyDataSetChanged();
    }
    

    }

    【讨论】:

    • BaseAdapter 中没有这个方法
    • @konopko 你应该写它。并在 notiftyDataSetChanged 之前调用它。
    • 我想在主线程中从哪里调用notiftyDataSetChanged 并不重要
    • @konopko 你应该在设置新数据后调用setadapter
    猜你喜欢
    • 2013-01-02
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 2021-05-28
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多