每秒更新 ListView 处理程序不起作用

Posted

技术标签:

【中文标题】每秒更新 ListView 处理程序不起作用【英文标题】:Update ListView every second with Handler not working 【发布时间】:2019-08-29 04:34:58 【问题描述】:

在我的应用程序接收新短信的应用程序中,我希望列表视图立即使用列表视图中显示的新消息对其进行更新。我尝试使用广播接收器代码的示例代码,但它不起作用,所以我现在尝试使用计时器每秒更新列表视图并显示收到的最新消息,但这也不起作用。

 final Handler handler = new Handler();
                handler.postDelayed(new Runnable()
                
                    @Override
                    public void run()
                    
                        inboxArrayAdapter.notifyDataSetChanged();

                        ((BaseAdapter)inboxmessages.getAdapter()).notifyDataSetChanged();

                        handler.postDelayed(this,  1000 );

                    
                , 1000);

        return view;

收到新 SMS 消息时使用 BroadcastReceiver 更新列表视图的原始尝试。

SmSBroadcastReceiver.java

public class SmsBroadcastReceiver extends BroadcastReceiver

    public static final String SMS_BUNDLE = "pdus";

    // https://javapapers.com/android/android-receive-sms-tutorial/
    public void onReceive(Context context, Intent intent)
    
        Bundle intentExtras = intent.getExtras();
        if (intentExtras != null)
        
            Object[] sms = (Object[]) intentExtras.get(SMS_BUNDLE);
            String smsMessageStr = "";

            for (int i = 0; i < sms.length; i++)
            
                // Get sms message
                SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) sms[i]);

                // Get content and number
                String smsBody = smsMessage.getMessageBody().toString();
                String address = smsMessage.getOriginatingAddress();

                // Create display message
                smsMessageStr += "SMS From: " + address + "\n";
                smsMessageStr += smsBody + "\n";

                // Add it to the list
                CommandsFragment inst = CommandsFragment.instance();
                inst.updateList(smsMessageStr);
            
            CommandsFragment inst = CommandsFragment.instance();
            inst.updateList(smsMessageStr);
        
    

CommandsFragment.java

 public static CommandsFragment instance()
        
            return inst;
        


        @Override
        public void onStart() 
            super.onStart();
            inst = this;
        


        public static CommandsFragment newInstance()
        
            CommandsFragment fragment = new CommandsFragment();
            return fragment;
        

 public void updateList(final String smsMessage)
    
        inboxArrayAdapter.insert(smsMessage, 0);
        inboxArrayAdapter.notifyDataSetChanged();
    

【问题讨论】:

如何添加日志以查看您的处理程序是否运行过?此外,您可能希望修复代码的格式。 是的,不要那样做。让接收器工作。 我可以验证处理程序是否正在运行,因为我使用 Toast 每秒显示一个输出 将列表视图更新代码放入一个方法中,并从广播接收器的onReceive 调用该方法。它肯定会奏效。还要检查代码是否正确更新列表视图。 我刚刚用我尝试广播接收器代码的代码更新了这个问题。 【参考方案1】:

将listview更新代码放入listview所属Activity的方法中,并从广播接收器的onReceive中调用该方法。它肯定会奏效。还要检查代码是否正确更新列表视图。

public class SmsBroadcastReceiver extends BroadcastReceiver 

  @Override
  public void onReceive(Context paramContext, Intent intent)  // change the parameters depending upon your requirements

    // do something here with the sms received if necessary

    // then call the listview update method here        
   


【讨论】:

我已经有了这个代码,看看我用粗体显示的 CommandsFragment.java 代码。在示例代码中,我正在获取短信内容并更新列表视图 您是否尝试在方法内部登录以检查调用是否到达方法? 我在 onReceive 方法中放了一个日志标签,并在 Android Studio 中检查了我的调试输出,我认为它没有达到它 那你怎么说你收到短信了?您只能通过接收器接收短信! 因为当我进入另一个片段或再次重新打开应用程序时,列表视图会更新为最新收到的短信【参考方案2】:

另外要添加到答案中,不要忘记在 AndroidManifest.xml 文件中包含以下内容

  </activity>
        <receiver android:name=".SmsBroadcastReceiver">
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>
    </application>

以上内容也为我解决了问题。谢谢你们的帮助。

【讨论】:

以上是关于每秒更新 ListView 处理程序不起作用的主要内容,如果未能解决你的问题,请参考以下文章

我的Android进阶之旅------&gt;Android中ListView中嵌套(ListView)控件时item的点击事件不起作的问题解决方法

当前位置更新在 iphone 设备中不起作用

jqm listview上的onclick事件不起作用?

Listview 和 RichTextBox 之间的拖放不起作用

通过更新处理程序向 couchDB 提交表单不起作用

ListView setOnItemClickListener 通过添加按钮不起作用