如何从 ArrayList<HashMap<String, String>> 中获取全部元素(Android)

3
我有一个ArrayList HashMap,它保存着联系人的姓名和电话号码。在将其发送到SQL数据库进行保存之前,我想检查并确保这些项目在ArrayList HashMap中。下面的所有代码都能正常工作,但我不知道如何打印出ArrayList中的所有内容。我尝试过的方法没有奏效,我也不知道如何使用Log...我是个新手。
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.HashMap;


public class Contacts extends ActionBarActivity {
private static final int PICK_CONTACT = 1;

private static ArrayList<HashMap<String, String>> getContacts = new ArrayList<HashMap<String, String>>();

private static ArrayList<HashMap<String, String>> data1 = new ArrayList<HashMap<String, String>>();

private static HashMap<String, String> contacts = new HashMap<String,String>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_contacts);

}

public void btnAddContacts_Click(View view) {
    Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
    startActivityForResult(intent, PICK_CONTACT);
}

public void btnDone_Click(View view){
    Intent i = new Intent(Contacts.this, Message.class);
    startActivity(i);
}



@Override
public void onActivityResult(int reqCode, int resultCode, Intent data) {
    super.onActivityResult(reqCode, resultCode, data);

    switch (reqCode) {
        case (PICK_CONTACT):
            if (resultCode == Activity.RESULT_OK) {
                Uri contactData = data.getData();
                Cursor c = managedQuery(contactData, null, null, null, null);
                if (c.moveToFirst()) {
                    String id =
                            c.getString(c.getColumnIndexOrThrow(ContactsContract.Contacts._ID));

                    String hasPhone =
                            c.getString(c.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));

                    if (hasPhone.equalsIgnoreCase("1")) {
                        Cursor phones = getContentResolver().query(
                                ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
                                ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + id,
                                null, null);
                        phones.moveToFirst();
                        String phn_no = phones.getString(phones.getColumnIndex("data1"));
                        String name = c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.DISPLAY_NAME));
                        contacts.put(name, phn_no);


                        while (c.moveToNext()) {
                            String id1 = c.getString(c.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));

                            String name1 = contacts.get(id1);
                            String phone = c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DATA));

                            HashMap<String, String> h = new HashMap<String, String>();
                            h.put("name", name1);
                            h.put("phone", phone);
                            data1.add(h);
                        }



                        Toast.makeText(this, "contact info : " + phn_no + "\n" + name, Toast.LENGTH_LONG).show();

                    }
                }
            }
    }

}


}

the XML

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"     android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"     tools:context="akh.seniorproj.Contacts">


<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Contact"
    android:id="@+id/contact1"
    android:layout_alignParentTop="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_marginTop="82dp"
    android:clickable="true"
    android:onClick="btnAddContacts_Click" />


<Button
    style="?android:attr/buttonStyleSmall"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Contact"
    android:id="@+id/contact2"
    android:layout_below="@+id/contact1"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_marginTop="40dp"
    android:clickable="true"
    android:onClick="btnAddContacts_Click" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Contact"
    android:id="@+id/contact3"
    android:layout_below="@+id/contact2"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_marginTop="49dp"
    android:clickable="true"
    android:onClick="btnAddContacts_Click" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Contact"
    android:id="@+id/contact4"
    android:layout_below="@+id/contact3"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_marginTop="52dp"
    android:clickable="true"
    android:onClick="btnAddContacts_Click" />

<Button
    style="?android:attr/buttonStyleSmall"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Next"
    android:id="@+id/Next1"
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true"
    android:clickable="true"
    android:onClick="btnDone_Click" />


</RelativeLayout>

根据您的代码,您应该将所有内容正确地获取到data1中。如果您想要记录日志,只需要输入Log.i(this.getClass().getName(), "Message here");即可。 - Vinod Kumar
谢谢您的评论,但我不知道应该把它放在哪里。您能解释一下吗?我把它放在最后一个while循环的末尾,它会在日志中打印,但每次在toast运行之前只会打印“联系人:”加上“消息内容”。 - isabella
4个回答

4
for (HashMap<String, String> contact : data1) {
    for (Entry<String, String> item : contact.entrySet()) {
        String key = item.getKey();
        String value = item.getValue();
        ... do whatever you want to do to print things
    }
}

出现错误:“foreach 不适用于类型 'java.util.HashMap<java.lang.String, java.lang.String>'”。 - isabella
我的错,已修复。抱歉。 - ajb

2

一个实现你所需功能的示例程序。

public class mainClass {
 public static void main(String[] args){
 HashMap<String , String> map1 = new HashMap();
  map1.put("ONE", "1");
  map1.put("TWO", "2");
  map1.put("THREE", "3");
  map1.put("FOUR", "4");
  map1.put("FIVE", "5");

  HashMap<String , String> map2 = new HashMap();
  map2.put("ONE", "1");
  map2.put("TWO", "2");
  map2.put("THREE", "3");
  map2.put("FOUR", "4");
  map2.put("FIVE", "5");


 ArrayList<HashMap<String, String>> getContacts = new ArrayList<HashMap<String, String>>();
 getContacts.add(map1);
 getContacts.add(map2);

 for(HashMap<String,String> map : getContacts ){
     // get your hashmap keys 
     Set <String>setOfKeys = map.keySet();

     Iterator<String> iterator = setOfKeys.iterator();

     while (iterator.hasNext()) {
         /**
          * next() method returns the next key from Iterator instance.
          * return type of next() method is Object so we need to do DownCasting to String
          */
         String key = (String) iterator.next();

         /**
          * once we know the 'key', we can get the value from the HashMap
          * by calling get() method
          */
          String value = (String)map.get(key);

         System.out.println("Key: "+ key+", Value: "+ value);
         // store the key + value to whatever you want here 
          }
 }


   }
  }

你为什么要这样做,而不是使用for-each循环? - user253751
不错的发现,没有特别的原因,我想这两个都能在这里很好地工作。 - Ankur Teotia
谢谢您的回复。我使用了您代码的最后一部分,但是在日志中没有打印任何内容,所以我添加了 "Log.i(this.getClass().getName(), "Key: "+ key+", Value: "+ value);",但仍然没有任何输出......您介意解释一下吗? - isabella
在使用日志语句之前,调试并查看值以确保正确性。 尝试使用System.out.println并检查您的logcat,可能是您的日志语句有问题,您也可以使用toasts。 - Ankur Teotia

1
你可以使用 data1.toString() 打印出 data1 中的所有值。

@isabella 在你的 toast 下面的日志中加入 data1.toString(),以查看结果。 - Dinesh Kannan
好的,我把它放在这个日志中 "Log.i(this.getClass().getName(), data1.toString());" 但它只打印出 "Contacts﹕ []"。 - isabella
好的,我修复了。谢谢你的答案,因为它是有效的!原来是我的 while 循环出了问题。 - isabella

0
尝试以下代码以打印您列表中的值,在日志中进行检查。
for(int i=0;i< data1.size();i++){


    HashMap<String, String> h= data1.get(i);

       for (TypeKey name: h.keySet()){

            String key =name.toString();
            String value = h.get(name).toString();  
            System.out.println(key + " " + value);  


    } 
}

在将数据传递到数据库之前,请先包含此代码。


谢谢您的回复...但是我应该把它放在哪里?我把它放在最后一个 while 循环之后,在 toast 之前,但是我收到了这些错误“无法解析符号“TypeKey””和“无法解析方法“.toString()”。 - isabella

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接