如何从 ArrayList<HashMap<String, String>> android 中获取所有元素
Posted
技术标签:
【中文标题】如何从 ArrayList<HashMap<String, String>> android 中获取所有元素【英文标题】:How to get all the elements out of ArrayList<HashMap<String, String>> android 【发布时间】:2015-07-08 04:32:35 【问题描述】:我有一个 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();
XML
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_
android:layout_ 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_
android:layout_
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_
android:layout_
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_
android:layout_
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_
android:layout_
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_
android:layout_
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");
...谢谢您的评论,但我不知道该把它放在哪里。你能解释一下吗?我把它放在最后一个while循环的末尾,它会打印在日志中,但每次吐司运行前只打印“联系人:”这里的消息“”
【参考方案1】:
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实现您想要的示例程序。
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 循环? 不错的收获,没有特别的原因,我想两者在这里都一样好用。 感谢您的回复。我使用了您的代码的最后一部分,并且没有在日志中打印任何内容,因此我添加了“Log.i(this.getClass().getName(),”Key:“+ key+”, Value:“+ value);”还是什么都没有……你介意解释一下吗 在使用日志语句之前调试并查看值是什么,以确保确定。尝试使用 system.out.println 并检查您的 logcat ,可能您的日志语句有问题,使用也可以使用 toast 。【参考方案3】:您可以使用data1.toString()
打印data1
中的所有值
【讨论】:
@isabella 将 data1.toString() 放在你的 toast 下方的日志中 .. 以查看结果 ...好吧...我把它放在这个日志中“Log.i(this.getClass().getName(), data1.toString());”但它只打印出“联系人:[]” 好的,我修好了。感谢您的回答,因为它是有效的!是我的 while 循环不起作用【参考方案4】:尝试使用此代码打印列表中的值并在日志中检查它
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循环之后,我得到这些错误“无法解析符号“TypeKey””和“无法解析方法“.toString()”以上是关于如何从 ArrayList<HashMap<String, String>> android 中获取所有元素的主要内容,如果未能解决你的问题,请参考以下文章
如何从 ArrayList<HashMap<String, String>> android 中获取所有元素
如何使用来自 Arraylist<Hashmap<String,String>> 的 bundle 获取使用 putserializable 传递的值