哈希映射值未附加到 Alertdialog

Hashmap values not appended to Alertdialog

我在数组列表中有一个调用日志(显示在警报对话框中),它已使用哈希图排序,任何时候我尝试查看此调用日志时,它都只显示调用日志查询的结果,但在我的 logcat 它显示正确排序的数字。请问如何将 logcat 中的结果附加到警报对话框?我已经和它斗争了好几天了,我似乎想不通。

final List<String> allNumbers = new ArrayList<String>();
public void onClick(View v) {
            String[] strFields = { android.provider.CallLog.Calls._ID,
                    android.provider.CallLog.Calls.NUMBER,
                    android.provider.CallLog.Calls.CACHED_NAME,  }; 
            String strOrder = android.provider.CallLog.Calls.DATE + " DESC LIMIT 10   ";                  



        final Cursor cursorCall = EmergencyButtonActivity.this.getContentResolver().query(
                    android.provider.CallLog.Calls.CONTENT_URI, strFields,
                    null, null, strOrder);
                  this.sortNumber();



        while (cursorCall.moveToNext()){

            String names = cursorCall.getString(cursorCall.getColumnIndex(android.provider.CallLog.Calls.CACHED_NAME));
             allNumbers.add(names)
                    }
AlertDialog.Builder builder = new AlertDialog.Builder(EmergencyButtonActivity.this);
                builder.setTitle("Frequent Contacts");
                android.content.DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialogInterface, int item) {
                        cursorCall.moveToPosition(item);
                         EditText phoneInput = (EditText) findViewById(R.id.txtPhoneNo);
                        String selectedNumber =cursorCall.getString(cursorCall.getColumnIndex(android.provider.CallLog.Calls.NUMBER));
                        selectedNumber = selectedNumber.replace("-", "");
                        phoneInput.setText(selectedNumber);

                        Toast.makeText(EmergencyButtonActivity.this, cursorCall.getString(cursorCall.getColumnIndex(android.provider.CallLog.Calls.NUMBER)),
                                Toast.LENGTH_LONG).show();

                        cursorCall.close();   

                    }


                };

                builder.setCursor(cursorCall, listener, android.provider.CallLog.Calls.CACHED_NAME);
                builder.create().show();   
                    }




        public void sortNumber() {
        Map<String, Integer> map = new HashMap<String, Integer>();

        for (String temp : allNumbers) {
            Integer count = map.get(temp);
            map.put(temp, (count == null) ? 1 : count + 1);
        }
        printMap(map);


    }   

        public static void printMap(Map<String, Integer> map){
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            System.out.println( entry.getKey() + entry.getValue());



        }
    }

这有很多错误,很难知道从哪里开始:-(

首先,你不能"sort"任何使用HashMap的东西。这两个概念是互斥的。

其次,您有一个 while 循环,您在其中为光标中的每一行创建并显示 AlertDialog。这不可能是对的。

接下来,您将在 AlertDialog.Builder 上调用 setCursor() 并传递 Cursor。对话框构建器正在使用此 Cursor 中的数据来构建要在对话框中显示的内容。您拥有 "sorted" 数据这一事实无关紧要,因为您已将原始查询中的数据提供给对话构建器。

接下来,你的方法sortNumber()创建一个HashMap并填充它,但是这个HashMap是这个方法的局部变量,所以在方法returns之后, HashMap 消失了。您不会 return 来自该方法的 HashMap,也不会将其存储在任何地方。

如果您确实需要数据 "sorted",您应该在查询中添加一个 "ordered by" 子句。

您可能需要考虑从 sortNumber() 方法 returning 您的 HashMap,然后从中构建一个 String 数组,然后调用 setItems() 在对话框构建器上,而不是使用 setCursor().