我的代码出了什么问题?我想制作一个显示手机中所有联系人的简单应用程序

时间:2017-06-26 08:05:48

标签: java android xml

我有以下文件 - activity_main.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:padding="16dp"
android:orientation="vertical"
android:id="@+id/activity_main"
tools:context="com.example.android.contactslist.MainActivity">

<Button
    android:id="@+id/loadContactsButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Access Contacts"
    android:layout_centerHorizontal="true"
    />
<ListView
    android:layout_below="@+id/loadContactsButton"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/listView1"
    />



</RelativeLayout>

MainActivity.java

package com.example.android.contactslist;

import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;


public class MainActivity extends AppCompatActivity {

    ListView listview;
    List<ContactData> StoreContacts = new ArrayList<>();
    ArrayAdapter<String> arrayAdapter;
    Cursor cursor;
    String name, phoneNumber;
    Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listview = (ListView) findViewById(R.id.listView1);
        button = (Button) findViewById(R.id.loadContactsButton);

        button.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                GetContactsIntoArrayList();


            }
        });

    }

    public void GetContactsIntoArrayList(){
        cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI , null, null, null, null);
        while(cursor.moveToNext()){
            ContactData c = new ContactData();
            name  = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
            phoneNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            c.setName(name);
            c.setContactNumber(phoneNumber);
            StoreContacts.add(c);
        }
        arrayAdapter = new CustomAdapter(MainActivity.this,
                StoreContacts);
        listview.setAdapter(arrayAdapter);

        cursor.close();
    }

ContactsData.java

package com.example.android.contactslist;


public class ContactData {
    private String name;
    private String contactNumber;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getContactNumber() {
        return contactNumber;
    }

    public void setContactNumber(String contactNumber) {
        this.contactNumber = contactNumber;
    }
}

CustomAdapter.java

package com.example.android.contactslist;

import android.content.Context;
import android.support.annotation.NonNull;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class CustomAdapter extends ArrayAdapter<ContactData> {

    List<String> list = new ArrayList<>();
    CustomAdapter(Context context, ContactData c){
        ContactData data= c;
        super(context, R.layout.contacts_items_listview, data);
        this.list = list.add(c);
    }
    @NonNull
    @Override

    public View getView(int position, View convertView, ViewGroup parent) {

        if(convertView == null){
            LayoutInflater customInflater = (LayoutInflater.from(getContext()));
            convertView = customInflater.inflate(R.layout.contacts_items_listview, parent, false);
        }else{

        }



        ContactData contact = list.get(position);
        TextView nameTv = (TextView) convertView.findViewById(R.id.contactName);
        TextView numberTv = (TextView) convertView.findViewById(R.id.contactNumber);
        nameTv.setText( contact.getName());
        numberTv.setText( contact.getContactNumber());
        return convertView;
    }

}

contacts_items_listview.xml

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#E0E0E0"
    android:layout_marginTop="16dp"
    >
    <TextView
        android:id="@+id/contactName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:textColor="#000000"
        android:text="Contact Name"
        android:layout_marginBottom="10dp"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="10dp"
        />
    <TextView
        android:id="@+id/contactNumber"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:textColor="#000000"
        android:text="Contact Name"
        android:layout_marginBottom="10dp"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="10dp"
        />


</LinearLayout>

最初,我通过将名称和电话号码作为String存储在ArrayList的单个元素中来使应用程序工作。现在我想将数据存储在一个类中。代码有什么问题?

另外,我如何在代码中实现延迟加载。最初,它每次滚动列表时都会使布局膨胀。

我在这些地方遇到错误 - Main Activity.java

和此处 - CustomAdapter.java

1 个答案:

答案 0 :(得分:1)

首先,明确说明您的问题是什么来获得您想要的东西。

至于你的问题,

在存储并传递给List<ContactData>

时使用Adapter

并在Adapter中使用List<ContactData>而不是Map<String, String> 这将使你更容易实现和理解。