【问题标题】:Assinging the values of cursor to object将光标的值分配给对象
【发布时间】:2013-12-20 08:16:38
【问题描述】:

我正在使用复选框显示联系人列表。我尝试实现自己的光标适配器,它是可检查的。但是,一旦我检查了该值,我希望将联系人存储在 ContactPerson 对象中。但是当我尝试它时显​​示空指针异常(这就是我注释掉该代码的原因)。我的 CursorAdapter 代码是这样的。

ContactListAcitivity.java

import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.support.v4.widget.CursorAdapter;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.ListView;
import android.widget.TextView;


public class ContactListActivity extends Activity  {

    ListView list;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_contact_list);
        list = (ListView) findViewById(R.id.ListView2);
        Cursor cur= getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null,null,null,null);

        startManagingCursor(cur);

        String[] result=new String[cur.getCount()];

        for (boolean hasData = cur.moveToFirst(); hasData; hasData = cur.moveToNext())
        {
            ContactPerson contact = new ContactPerson(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)), String.valueOf(cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
        }
        stopManagingCursor(cur);
        list.setAdapter(new contactAdapter(getApplicationContext(), cur));

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.contact_list, menu);
        return true;
    }

    private class ViewHolder{
        TextView ContactName;
        CheckBox contactCheck;
    }

    class contactAdapter extends CursorAdapter{

        private Cursor cursor;
        private Context ccontext;
        private LayoutInflater inflater;

        public contactAdapter(Context context, Cursor c) {
            super(context, c);
            // TODO Auto-generated constructor stub
            cursor = c;
            ccontext = context;
            inflater = LayoutInflater.from(context);
            inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }

        @Override
        public void bindView(View view, Context arg1, Cursor arg2) {
            // TODO Auto-generated method stub

            ViewHolder holder = (ViewHolder) view.getTag();
            if (holder == null) {
                holder = new ViewHolder();
                holder.ContactName = (TextView) view.findViewById(R.id.contact_name);
                holder.contactCheck = (CheckBox) view.findViewById(R.id.contact_check);
                view.setTag(holder);
                holder.contactCheck.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        CheckBox cb = (CheckBox) v;
                        cb.setSelected(true);
//                      ContactPerson contact = (ContactPerson) cb.getTag(); this is the place where it is showing null pointer exception
//                      Log.i("clicked users", contact.getName());
//                      contact.setSelected(true);
                    }
                }); 
            }else{
                holder = (ViewHolder) view.getTag();
            }
//          ContactPerson contacts = contactList.get(position);
            holder.ContactName.setText(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));
//          holder.contactCheck.setChecked(contacts.isSelected());
//          holder.contactCheck.setTag(contacts);
//          holder.ContactName.setText(contacts.getName());
        }

        @Override
        public View newView(Context arg0, Cursor arg1, ViewGroup arg2) {
            // TODO Auto-generated method stub
            return inflater.inflate(R.layout.checkbox_item, arg2, false);
        }

    }

}

activity_contact_list.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:background="#000000">

    <ListView 
    android:id="@+id/ListView2"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".GroupContactsActivity"
    android:layout_alignParentTop="true"
     />

    <Button
        android:id="@+id/selected_done_1"
        android:layout_width="160dp"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:textColor="#FFFFFF"
        android:text="Done" />

</RelativeLayout>

checkbox_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="6dip" 
    android:background="#000000">

    <TextView 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/contact_name"
        android:layout_alignParentLeft="true"
        android:text="textview"
        android:textSize="15sp"
        android:textColor="#FFFFFF" 
        android:gravity="center_horizontal"/>
    <CheckBox 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:layout_alignParentRight="true"
        android:layout_weight="1"
        android:id="@+id/contact_check"/>
</RelativeLayout>

谁能建议我如何在此适配器中使用该联系人类。

public class ContactPerson {

    String name= null, number = null;
    boolean Selected = false;


    public ContactPerson(String PersonName, String PhoneNumber){
        this.name = PersonName;
        this.number= PhoneNumber;
    }

    public String getName(){
        return name;
    }

    public boolean isSelected(){
        return Selected;
    }

    public void setSelected(boolean selected){
        this.Selected = selected;
    }

    public String getPhoneNumber(){
        return number;
    }
}

【问题讨论】:

  • cb.setselected(true) 这里需要吗??
  • 给我看看你的两个 xml 文件还有这个文件的完整代码..
  • @Segi:请检查代码。我之前没有放,因为有些人会因为显示不必要的代码而给负面标记。
  • 好的。等等,我只是检查一下。
  • 检查我的以下答案。它现在工作正常..

标签: android android-contentprovider android-cursoradapter


【解决方案1】:

检查此代码。它对我有用。祝你好运。

import java.util.ArrayList;
import java.util.Set;
import java.util.TreeSet;

import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.support.v4.widget.CursorAdapter;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;


public class ContactListActivity extends Activity  {

    ListView list;
    ArrayList<ContactPerson> selectedList;
    Set<String> phoneID= new TreeSet<String>();;
    Button doneButton;
    CheckBox cb;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_contact_list);

        selectedList = new ArrayList<ContactPerson>();
        list = (ListView) findViewById(R.id.ListView2);
        doneButton = (Button) findViewById(R.id.selected_done_1);

        Cursor cur= getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null,null);
        list.setAdapter(new contactAdapter(getApplicationContext(), cur));
        doneButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                for (String ids : phoneID) {
                    Log.d("PhoneIds", ids);

                    Cursor cursorPhoneNumber = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                            new String[]{ContactsContract.CommonDataKinds.Phone.NUMBER},

                            ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ? AND " +
                                    ContactsContract.CommonDataKinds.Phone.TYPE + " = " +
                                    ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE,

                            new String[]{ids},
                            null);
                    Log.d("Number cursor", String.valueOf(cursorPhoneNumber.getCount()));
                    if (cursorPhoneNumber.moveToFirst()) {
//                      phoneNumber = cursorPhoneNumber.getString(cursorPhoneNumber.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                       Log.d("Phone number", cursorPhoneNumber.getString(cursorPhoneNumber.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
                    }

                    cursorPhoneNumber.close();

                    Cursor cursorName = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                            new String[]{ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME_PRIMARY},

                            ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ? AND " +
                                    ContactsContract.CommonDataKinds.Phone.TYPE + " = " +
                                    ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE,

                            new String[]{ids},
                            null);
                    Log.d("Name cursor", String.valueOf(cursorName.getCount()));
                    if (cursorName.moveToFirst()) {
                       Log.d("Phone number", cursorName.getString(cursorName.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME_PRIMARY)));
//                     Name = cursorName.getString(cursorName.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME_PRIMARY));
                    }

                    cursorName.close();
//                  selectedList.add(new ContactPerson(Name,phoneNumber));
                }
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.contact_list, menu);
        return true;
    }

    private class ViewHolder{
        TextView ContactName;
        CheckBox contactCheck;
    }

    class contactAdapter extends CursorAdapter{

        String Name, phoneNumber;
        private Cursor cursor;
        private Context ccontext;
        private LayoutInflater inflater;

        public contactAdapter(Context context, Cursor c) {
            super(context, c);
            // TODO Auto-generated constructor stub
            cursor = c;
            ccontext = context;
            inflater = LayoutInflater.from(context);
            inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }

        @Override
        public void bindView(View view, Context arg1, Cursor arg2) {
            // TODO Auto-generated method stub

            ViewHolder holder = (ViewHolder) view.getTag();
            if (holder == null) {
                holder = new ViewHolder();
                holder.ContactName = (TextView) view.findViewById(R.id.contact_name);
                holder.contactCheck = (CheckBox) view.findViewById(R.id.contact_check);
                view.setTag(holder);
                holder.contactCheck.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        cb = (CheckBox) v;
                        cb.setChecked(cb.isChecked());
//                      ContactPerson selected = (ContactPerson)cb.getTag();
                        Log.d("selcted", cb.getTag().toString());
                        if(cb.isChecked()){

                            phoneID.add(cb.getTag().toString());


                        }
                    }

                }); 
            }else{
                holder = (ViewHolder) view.getTag();
            }

            holder.ContactName.setText(cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)));
            holder.contactCheck.setTag(cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID)));
            holder.contactCheck.setChecked(false);

        }

        @Override
        public View newView(Context arg0, Cursor arg1, ViewGroup arg2) {
            // TODO Auto-generated method stub
            return inflater.inflate(R.layout.checkbox_item, arg2, false);
        }

        @Override
        public View getView(int arg0, View arg1, ViewGroup arg2) {
            // TODO Auto-generated method stub
//          Log.d("don't know", cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
            return super.getView(arg0, arg1, arg2);
        }

    }

}

【讨论】:

    【解决方案2】:

    我在这里更改了您的适配器活动的一点代码。看看就好:

    public class MainActivity extends Activity  {
    
          private ArrayList<ContactPerson> arr;
            private Context context;
            private ListView list;
            private ContactArrayAdapter adapter;
            private String strName,strNumber;
            private View view;  
            public static boolean[] arrBoolean = null;
    
            @Override
            public void onCreate(Bundle savedInstance) {
                super.onCreate(savedInstance);
                setContentView(R.layout.activity_main);
                ProgressDialog pd  = new ProgressDialog(this);
                list = (ListView)findViewById(R.id.ListView2);
                arr = new ArrayList<ContactPerson>();
                context = MainActivity.this;
                arr =  displayContacts();
    
                adapter = new ContactArrayAdapter(this, R.layout.checkbox_item, arr);
                list.setAdapter(adapter);
            }
    
            public ArrayList<ContactPerson> displayContacts() {
    
                ContentResolver cr = getContentResolver();
                Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null);
                ContactPerson contact;
                if (cur.getCount() > 0) {
                    while (cur.moveToNext()) {
                        contact = new ContactPerson();
    
                        String id = cur.getString(cur.getColumnIndex(People._ID));
                        String name = cur.getString(cur.getColumnIndex(People.DISPLAY_NAME));
                        ContactPerson cp = new ContactPerson();
                        cp.setName(name);
                        cp.setNumber(id);
                        cp.setSelected(false);
                        arr.add(cp);
                    }
                }
                return arr;
            }
    
        //********* Adapter *****
    
        public class ContactArrayAdapter extends ArrayAdapter<ContactPerson> {
    
        //  private final List<Contact> list;
            private Context context;    
    
            private LayoutInflater mInflater;
            private List<ContactPerson> list; 
    
    
             public ContactArrayAdapter(Context context, int textViewResourceId,
    
                     ArrayList<ContactPerson> stateList) {
                     super(context, textViewResourceId, stateList);
                     this.list = new ArrayList<ContactPerson>();
                     this.list.addAll(stateList);
                     }
    
    
            class ViewHolder {
                 TextView text;
                 CheckBox checkbox;
            }
    
            public View getView(int position, View convertView, ViewGroup parent) {
                View view = convertView;
                ViewHolder viewHolder = null;
                if (view == null) {      
                    LayoutInflater vi = (LayoutInflater)getSystemService(
                             Context.LAYOUT_INFLATER_SERVICE);
                    view = vi.inflate(R.layout.checkbox_item, null);
    
                    viewHolder = new ViewHolder();
                    viewHolder.text = (TextView) view.findViewById(R.id.contact_name);
                    viewHolder.checkbox = (CheckBox) view.findViewById(R.id.contact_check);
                    view.setTag(viewHolder);
    
    
                } else {
                    viewHolder = (ViewHolder) view.getTag();
                }
    
                final int pos = position;
    
                ContactPerson cp = list.get(position);
                viewHolder.text.setText(cp.getName());
                viewHolder.checkbox.setChecked(cp.isSelected());    
    
    
                viewHolder.checkbox.setOnClickListener(new OnClickListener() {
    
                    @Override
                    public void onClick(View arg0) {
                        // TODO Auto-generated method stub
                        CheckBox cb = (CheckBox) arg0 ;
                        list.get(pos).setSelected(cb.isChecked());
                        System.out.println(cb.isChecked());
                        System.out.println(list.get(pos).getName());
                    }
                });
    
                //viewHolder.text.setTag(cp);
                return view;
            }
    
    
    
        }
    
    }
    

    【讨论】:

    • 您已包含 ArrayAdapter。我已经试过了。但是如果联系人是 1000+,那么加载需要 4 到 5 秒。这就是我制作光标适配器的原因。
    • 我相信这不是问题..你可以为此设置进度条。
    猜你喜欢
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多