adapter.notifyDataSetChanged() 不跨类更新 UI

如何解决adapter.notifyDataSetChanged() 不跨类更新 UI

我有一个应用程序,它使用 TSL 1128 阅读器来读取 RFID 标签。它使用 IASCIICommandResponder 库与阅读器进行通信。

我有一个名为 orderFullfill.java 的类,它负责 Listview 并更新此类的 UI。

读取器功能设置在另一个实现此 IASCIICommandResponder 的类 (orderResponder.java) 中,以便它可以在后台运行,而 orderFullfill 显示对 ArrayList 所做的更改。

我尝试将 Arrayadapter 从 orderFullfill.java 传递给 orderResponder 以调用 notifyDataSetChanged();但这没有效果。我必须在单击按钮时调用 addPigNumber() 方法来更新我的列表视图。

理想情况下,当向列表中添加新标签时,我需要更新列表视图。请有人帮我在正确的位置应用 notifyDataSetChanged() 以便当我可以添加标签时它会自动添加到列表中。 我非常感谢收到的任何帮助。

    public class orderFullfill extends AppCompatActivity implements PopupMenu.OnMenuItemClickListener  {int where; public static ArrayList scannedPigs = new ArrayList<String>();
// The Reader currently in use
private Reader mReader = null;
private boolean mIsSelectingReader = false;
// The model that performs actions with the reader
private TriggerModel mModel;
public static String dispatchweek;
public static String customer;
public static String accountnumber;
public static String supplyfarm;
public static String breed;
public static int numberofpigs;
public static int pigNum;
public static ArrayAdapter<String> adapter;
public static String weekNow;
public static Context mContext;
Switch trick; TextView nameholder;
/**
 * @return the current AsciiCommander
 */
protected AsciiCommander getCommander()
{
    return AsciiCommander.sharedInstance();
}

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.orderfullfill);
    mContext = orderFullfill.this;
    addPigNumber();
    InventoryCommand iCommand = InventoryCommand.synchronousCommand();
    iCommand.setFilterStrongest(TriState.YES);//high power reading
    trick = (Switch) findViewById(R.id.scanM2);
    trick.setVisibility(View.INVISIBLE);
    trick.setChecked(true);
    trick.setText(getResources().getString(R.string.lowPowerScan));
    trick.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
            InventoryCommand iCommand = new InventoryCommand();
            //InventoryCommand iCommand = InventoryCommand.synchronousCommand();
            if(isChecked)
            {
                iCommand.setTakeNoAction(TriState.YES);
                iCommand.setFilterStrongest(TriState.YES);// low power reading
                getCommander().executeCommand(iCommand);
                trick.setText(getResources().getString(R.string.lowPowerScan));
            }
            if(!isChecked)
            {
                trick.setText(getResources().getString(R.string.highPowerScan));
                iCommand.setFilterStrongest(TriState.NO);//high power reading
                iCommand.setTakeNoAction(TriState.NO);
                getCommander().executeCommand(iCommand);
            }

        }
    });
    nameholder = (TextView)findViewById(R.id.nameView);
    nameholder.setText(customer);
    AsciiCommander.createSharedInstance(getApplicationContext());

    final AsciiCommander commander = getCommander();

    // Ensure that all existing responders are removed
    commander.clearResponders();

    // Add the LoggerResponder - this simply echoes all lines received from the reader to the log
    // and passes the line onto the next responder
    // This is ADDED FIRST so that no other responder can consume received lines before they are logged.
    // commander.addResponder(new LoggerResponder());// logcat input
    // Add responder to enable the synchronous commands
  //  commander.addSynchronousResponder();
    commander.addResponder(new orderResponder());

    // Configure the ReaderManager when necessary
    ReaderManager.create(getApplicationContext());

    // Add observers for changes
    ReaderManager.sharedInstance().getReaderList().readerAddedEvent().addObserver(mAddedObserver);
    ReaderManager.sharedInstance().getReaderList().readerUpdatedEvent().addObserver(mUpdatedObserver);
    ReaderManager.sharedInstance().getReaderList().readerRemovedEvent().addObserver(mRemovedObserver);

    // Create a (custom) model and configure its commander and handler
    mModel = new TriggerModel();
    mModel.setCommander(getCommander());
    mModel.initialise();

    ListView scroller = (ListView)findViewById(R.id.listviewD);
    scroller.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent,View view,int position,long id) {
            PopupMenu popup = new PopupMenu(orderFullfill.this,view);
            popup.setOnMenuItemClickListener(orderFullfill.this);
            popup.inflate(R.menu.edit_menu);
            where = position;
            popup.show();
        }
    });

     weekNow = orderResponder.getWeeknow();
}


   public ArrayAdapter getAdapter()
   {
       adapter = new ArrayAdapter<>(mContext,android.R.layout.simple_spinner_item,scannedPigs);
       return adapter;
   }

public void addPigNumber()
{
    adapter = new ArrayAdapter<String>(mContext,scannedPigs);
    TextView counter = findViewById(R.id.editTextNumber);
     if(numberofpigs >= 0 )
    {
        counter.setText("Pigs Left: " +numberofpigs);
        if(numberofpigs == 0)
        {
            counter.setBackgroundColor(Color.parseColor("#BCBDF3E8"));
        }
    }

    ListView scroller = findViewById(R.id.listviewD);
    try {
        adapter.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item);
        scroller.setAdapter(adapter);
    }catch (Exception e)
    {
        String result ="";
        result.equals(e.toString());
    }
}

public void orderdetailsOnclick(View view) {
    addPigNumber();
    AlertDialog.Builder alert = new AlertDialog.Builder(this);
    alert.setTitle("Customer Order: " + customer);
    alert.setMessage("Account Number: " + accountnumber + "\r\n" +
                     "Dispatch Week: " + dispatchweek + "\r\n" +
                     "Supply Farm: " + supplyfarm + "\r\n" +
                     "Breed: "+ breed + "\r\n" + "Number of Pigs: " + pigNum);
    alert.setCancelable(true);
    alert.show();
}

@Override
public synchronized void onResume()
{
    super.onResume();
    addPigNumber();

    // Register to receive notifications from the AsciiCommander
    LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,new IntentFilter(AsciiCommander.STATE_CHANGED_NOTIFICATION));

    // Remember if the pause/resume was caused by ReaderManager - this will be cleared when ReaderManager.onResume() is called
    boolean readerManagerDidCauseOnPause = ReaderManager.sharedInstance().didCauseOnPause();

    // The ReaderManager needs to know about Activity lifecycle changes
    ReaderManager.sharedInstance().onResume();

    // The Activity may start with a reader already connected (perhaps by another App)
    // Update the ReaderList which will add any unknown reader,firing events appropriately
    ReaderManager.sharedInstance().updateList();

    // Locate a Reader to use when necessary
    AutoSelectReader(!readerManagerDidCauseOnPause);

    mIsSelectingReader = false;

    displayReaderState();
}

@Override
public synchronized void onPause() {
    super.onPause();

    // Register to receive notifications from the AsciiCommander
    LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
    addPigNumber();
    ReaderManager.sharedInstance().onPause();
}

@Override
protected void onDestroy()
{
    super.onDestroy();
    // Remove observers for changes
    ReaderManager.sharedInstance().getReaderList().readerAddedEvent().removeObserver(mAddedObserver);
    ReaderManager.sharedInstance().getReaderList().readerUpdatedEvent().removeObserver(mUpdatedObserver);
    ReaderManager.sharedInstance().getReaderList().readerRemovedEvent().removeObserver(mRemovedObserver);
   // readResponder.tempList = false;
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.reader_menu,menu);
    // Reset,connect,disconnect dropdown menu
    mResetMenuItem = menu.findItem(R.id.reset_reader_menu_item);
    mConnectMenuItem = menu.findItem(R.id.connect_reader_menu_item);
    mDisconnectMenuItem= menu.findItem(R.id.disconnect_reader_menu_item);

    return true;
}

//----------------------------------------------------------------------------------------------
// ReaderList Observers
//----------------------------------------------------------------------------------------------

Observable.Observer<Reader> mAddedObserver = new Observable.Observer<Reader>()
{
    @Override
    public void update(Observable<? extends Reader> observable,Reader reader)
    {
        // See if this newly added Reader should be used
        AutoSelectReader(true);
    }
};

Observable.Observer<Reader> mUpdatedObserver = new Observable.Observer<Reader>()
{
    @Override
    public void update(Observable<? extends Reader> observable,Reader reader)
    {
    }
};

Observable.Observer<Reader> mRemovedObserver = new Observable.Observer<Reader>()
{
    @Override
    public void update(Observable<? extends Reader> observable,Reader reader)
    {
        // Was the current Reader removed
        if( reader == mReader)
        {
            mReader = null;

            // Stop using the old Reader
            getCommander().setReader(mReader);
        }
    }
};



@Override
public boolean onMenuItemClick(MenuItem item) {

    switch (item.getItemId())
    {
        case R.id.delete_menu:
            boolean complete = false;
            scannedPigs.remove(where);
            numberofpigs = numberofpigs + 1;
            //myDB.deleteEntry(scannedItems); -> IF YOU ADD IT TO THE DB REMOVE IT
            //select items from the list
            addPigNumber();
            return true;

        case R.id.edit_menu_:
            return true;
    }
    return super.onOptionsItemSelected(item);
}}

orderfullfill.xml

    <?xml version="1.0" encoding="utf-8"?><android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
    android:id="@+id/editTextNumber"
    android:layout_width="177dp"
    android:layout_height="56dp"
    android:layout_marginStart="24dp"
    android:layout_marginLeft="24dp"
    android:layout_marginTop="80dp"
    android:textSize="30sp"
    app:layout_constraintBottom_toTopOf="@+id/listviewD"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintVertical_bias="1.0" />
<ListView
    android:id="@+id/listviewD"
    android:layout_width="354dp"
    android:layout_height="221dp"
    android:layout_marginBottom="12dp"
    app:layout_constraintBottom_toTopOf="@+id/scanM2"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.421"
    app:layout_constraintStart_toStartOf="parent" />
<Button
    android:id="@+id/invoiceMaker"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="12dp"
    android:text="@string/makeInvoice"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.75"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/scanM2" />
<TextView
    android:id="@+id/nameView"
    android:layout_width="333dp"
    android:layout_height="52dp"
    android:layout_marginLeft="25dp"
    android:layout_marginTop="16dp"
    android:layout_marginRight="25dp"
    android:layout_marginBottom="303dp"
    android:textSize="20dp"
    app:layout_constraintBottom_toTopOf="@+id/scanM2"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintVertical_bias="0.0" />
<Button
    android:id="@+id/orderdetailsBtn"
    android:layout_width="119dp"
    android:layout_height="54dp"
    android:layout_marginTop="68dp"
    android:layout_marginEnd="20dp"
    android:layout_marginRight="20dp"
    android:onClick="orderdetailsOnclick"
    android:text="@string/showOrder"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.887"
    app:layout_constraintStart_toEndOf="@+id/editTextNumber"
    app:layout_constraintTop_toTopOf="parent" />
<Switch
    android:id="@+id/scanM2"
    android:layout_width="359dp"
    android:layout_height="39dp"
    android:layout_below="@id/listviewD"
    android:layout_marginTop="232dp"
    android:text="@string/highPowerScan"
    android:textOff="No"
    android:textOn="Yes"
    android:textSize="27dp"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.461"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/orderdetailsBtn" />/android.support.constraint.ConstraintLayout>

orderResponder.java -> 这是 TSL 阅读器在阅读 RFID 标签时通过 ASCII 与之通信的类。 Splicer 方法将 RFID 值添加到 ArrayAdapter 然后 notifyDataSetChanged();叫做。但是,当从 orderFullfill.class 外部调用此方法时,没有任何反应。

    public class orderResponder extends Application implements IAsciiCommandResponder {

public static boolean tempList;
NoteHelper myDB;

public List<String> getReadInput() {
    return readInput;
}

public void setReadInput(List<String> readInput) {
    this.readInput = readInput;
}

public static List<String> readInput = new ArrayList<>();

@Override
public boolean isResponseFinished() {
    return false;
}

@Override
public void clearLastResponse() {

}

@Override
public boolean processReceivedLine(String s,boolean b) throws Exception {
    isitMe(s);
    return false;
}
public List<String> getList()
{
    return readInput;
}

public boolean isitMe (String input)
{
    String firstFourChars = "";
    //get first 4 chars to see if it contains "EP: "
    if(input.length()>4)
    {
        firstFourChars = input.substring(0,4);
    }
    else
    {
        firstFourChars = input;
    }
    if(firstFourChars.equals("EP: "))// this is the inital identifier for the RFID tags
    {
        splicer(input);
        return true;
    }
    else
    {
        return false;
    }
}


//takes the last 24 characters removing the 'EP: '
public void splicer (String input)
{ // ArrayAdapter magic = orderFullfill.getAdapter(); THIS Didnt work
    orderFullfill.adapter = new ArrayAdapter<String>(orderFullfill.mContext,orderFullfill.scannedPigs);
    String output ="";
    output = input.substring(input.length() -24);//maybe take 24 chars
        if (orderFullfill.scannedPigs.size() == 0) {
          //  orderFullfill.scannedPigs.add(output);

            orderFullfill.adapter.add(output);
            orderFullfill.adapter.notifyDataSetChanged();
            orderFullfill.numberofpigs = orderFullfill.numberofpigs - 1;

        } else//if the list has values check you are not duplicating the values
        {
            if (orderFullfill.scannedPigs.contains(output)) {
                return;//you are already in the list
            } else//you are unique you can join the list
            {
               // orderFullfill.scannedPigs.add(output);
                orderFullfill.adapter.add(output);
                orderFullfill.adapter.notifyDataSetChanged();
                orderFullfill.numberofpigs = orderFullfill.numberofpigs - 1;

            }
        }
}


public static String getWeeknow()
{
    Date date = new Date();
    SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
    String dateH = formatter.format(date);
    //String dateH = date.toString();
    String[] array = dateH.split("\\/");
    String output ="";
    int month = Integer.parseInt(array[1]);
    month = month -1;
    Calendar calendar = Calendar.getInstance();
    calendar.set(Integer.parseInt(array[2]),month,Integer.parseInt(array[0]));
    int weekOfyear = calendar.get(Calendar.WEEK_OF_YEAR);
    output = String.valueOf(weekOfyear);
    return output;
}}

解决方法

创建 orderResponder 构造方法。并将您的活动(orderFullfill.this)和上下文作为参数发送到 orderResponder。像这样打电话;

((orderFullfill)activity).adapter = new ArrayAdapter<String>(context,android.R.layout.simple_spinner_item,((orderFullfill)activity).scannedPigs);

((orderFullfill)activity).adapter.notifyDataSetChanged();

我希望它有效。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res