Android 显示电话簿中的选定用户图像

Android 显示电话簿中的选定用户图像,android,xml,listview,Android,Xml,Listview,我正在创建一个多用户聊天应用程序。“收件箱”活动从我用于存储的XML加载用户列表。我有一个问题,我希望在“收件箱”活动加载用户列表时,它还会检查这些用户是否存在于电话簿中。如果电话簿中有任何用户,则会在listview中加载该用户的图像。 我在某种程度上解决了问题,但无法显示选定的用户图像。请给我一些提示怎么做。提前谢谢你 这是收件箱的快照 收件箱活动java: @Override public void onCreate(Bundle savedInstanceState) {

我正在创建一个多用户聊天应用程序。“收件箱”活动从我用于存储的XML加载用户列表。我有一个问题,我希望在“收件箱”活动加载用户列表时,它还会检查这些用户是否存在于电话簿中。如果电话簿中有任何用户,则会在listview中加载该用户的图像。 我在某种程度上解决了问题,但无法显示选定的用户图像。请给我一些提示怎么做。提前谢谢你

这是收件箱的快照

收件箱活动java:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.users_index);
        listView=(ListView)findViewById(R.id.listview);
        actionBar = getActionBar();
        actionBar.setTitle("Inbox Messages");
        //getNumber(this.getContentResolver()); 
        getdata();
        listView.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) { 
                TextView uname=(TextView)view.findViewById(R.id.sendername);
                username = uname.getText().toString();
                Intent i = new Intent(getApplicationContext(), MainActivity.class);
                i.putExtra("username", username);
                startActivity(i);
            }
        });
    }
    private void getdata() {
        try {
            File fXmlFile = new File("/data/data/net.multiplesystem.nosms/Messeges/UserList.xml");
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(fXmlFile);
            doc.getDocumentElement().normalize();
            NodeList nList = doc.getElementsByTagName("details");
            for (int temp = 0; temp < nList.getLength(); temp++) {
                Node nNode = nList.item(temp);
                if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                    Element eElement = (Element) nNode;
                    String a=eElement.getElementsByTagName("name").item(0).getTextContent().toString();
                    userIndex.add(a);
                }
                }
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        setListAdapter();
    }

    private void setListAdapter(){
        adapter = new ArrayAdapter<String>(this,R.layout.user_index_layout,R.id.sendername,userIndex);
        listView.setAdapter(adapter);
        registerForContextMenu(listView);
    }

    /*
    public void getNumber(ContentResolver cr)
    {
        Cursor phones = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null, null);
        while (phones.moveToNext())
        {
            name=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
            phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            id = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
            contactId = Long.parseLong(id);
            System.out.println(".................."+phoneNumber); 
            System.out.println(".................."+name); 
            Number.add(phoneNumber);

        }
        phones.close();// close cursor
           ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.user_index_layout,R.id.sendername,Number);
         listView.setAdapter(adapter);
        setListAdapter();
    }
    */
}
@覆盖
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.users\u索引);
listView=(listView)findViewById(R.id.listView);
actionBar=getActionBar();
actionBar.setTitle(“收件箱消息”);
//getNumber(this.getContentResolver());
getdata();
setOnItemClickListener(新的OnItemClickListener(){
public void onItemClick(AdapterView父级、视图、,
int位置,长id){
TextView uname=(TextView)view.findViewById(R.id.sendername);
username=uname.getText().toString();
Intent i=新的Intent(getApplicationContext(),MainActivity.class);
i、 putExtra(“用户名”,用户名);
星触觉(i);
}
});
}
私有void getdata(){
试一试{
File fXmlFile=新文件(“/data/data/net.multiplesystem.nosms/Messeges/UserList.xml”);
DocumentBuilderFactory dbFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder=dbFactory.newDocumentBuilder();
documentdoc=dBuilder.parse(fXmlFile);
doc.getDocumentElement().normalize();
NodeList nList=doc.getElementsByTagName(“详细信息”);
对于(int-temp=0;temp
试试这个。如果有帮助,请传递电话号码以获取照片

    public Bitmap getPhoto(String phoneNumber) {
    Uri phoneUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber));
    Uri photoUri = null;
    ContentResolver cr = this.getContentResolver();
    Cursor contact = cr.query(phoneUri,
            new String[] { ContactsContract.Contacts._ID }, null, null, null);

    if (contact.moveToFirst()) {
        long userId = contact.getLong(contact.getColumnIndex(ContactsContract.Contacts._ID));
        photoUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, userId);

    }
    else {
        Bitmap defaultPhoto = BitmapFactory.decodeResource(getResources(), android.R.drawable.ic_menu_report_image);
        return defaultPhoto;
    }
    if (photoUri != null) {
        InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(
                cr, photoUri);
        if (input != null) {
            return BitmapFactory.decodeStream(input);
        }
    } else {
        Bitmap defaultPhoto = BitmapFactory.decodeResource(getResources(), android.R.drawable.ic_menu_report_image);
        return defaultPhoto;
    }
    Bitmap defaultPhoto = BitmapFactory.decodeResource(getResources(), android.R.drawable.ic_menu_report_image);
    return defaultPhoto;
}

我从您的代码中了解到,您需要为显示联系人而膨胀自定义布局。 我相信你的
R.layout.user\u index\u layout
是这样的:

<LinearLayout
    android:orientation="horizontal"
    ... >
    <ImageView
        android:id="@+id/userIndexLayout_img" 
        ... />
    <TextView
        ... />
</LinearLayout>

有很多答案解释了如何根据您的要求使用ListView。请浏览该网站,你肯定会找到你需要的。我搜索了很多,但没有找到想要的(也许你可以发布一些代码来缩小问题范围,如果发布的响应没有回答你的问题=)抱歉,我已经发布了代码,请检查。如何将位图对象传递给适配器?嘿,在适配器中调用该方法它自己。。。在将位图设置为imageview时,请执行此操作。。setImageBitmap(getPhoto(99999999));谢谢你的回答,我将尝试:)我已经发布了我的代码,请检查并给出一些建议。不要使用ArrayAdapter,而是使用自定义适配器并创建一个可以存储名称和对象的模型对象,将此对象传递给适配器。。在设置数据时,您可以设置所有参数并设置imageview
public void onUserConnected(int id) {
    int indexInsideListView = getUserIndex(id);
    View userView = listView.getChildAt(indexInsideListView);
    ImageView imgView = (ImageView) userView.findViewById(R.id.userIndexLayout_img);
    // User ImageView.setImageResource/Drawable/Bitmap
}