0

良い一日、このトラブルを抱えていてください、そして私は理由がわからないようです。基本的に、連絡先APIを介して連絡先を選択し、データベースに保存して、リストビューに表示しようとしています。しかし、何らかの理由で、連絡先の詳細を取得した後、カスタムアダプターは呼び出されなくなり、アクティビティが最初に作成されたときにのみ呼び出されるため、空になります。私が逃したかもしれないものをお願いします。ありがとうございました。

ここに私のコードがあります:

public class GroupDetails extends FragmentActivity implements OnClickListener, LoaderCallbacks<Cursor> {

//variable for debugging the application

public static final String TAG = "MyApp.Debug";

    //request code for using with action pick intent
    static final int PICK_CONTACT = 1;

    //initial variables
    Button add_button;
    TextView label;
    ListView list;
    ResponderDB dbadapter;
    DueCustomCursorAdapter cursoradapter;
    //DueCustomCursorLoader loader;

    //cursor to retrieve contact details 
    private Cursor contactsCursor;


    String groupname;
    long rowId;


    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.group_detail_list);

 //only intialize here. database will be open in custom cursor loader

dbadapter = new ResponderDB(this); 

        getSupportLoaderManager().initLoader(0, null, this);
        /*Read intent and the extras passed*/
           Bundle extra = getIntent().getExtras();

            if(!extra.isEmpty() || extra.equals(null)){
             groupname = extra.getString("group_name");
             rowId = extra.getLong("rowId");
            }

        list = (ListView)findViewById(android.R.id.list);
        add_button = (Button)findViewById(R.id.add_button_id);
        label = (TextView)findViewById(R.id.group_label_id);


        Log.d(TAG, "calling custom adapter here now");
        cursoradapter = new DueCustomCursorAdapter(GroupDetails.this, null, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER );
        list.setAdapter(cursoradapter);

        add_button.setOnClickListener(this);

    }


    @Override
    public void onClick(View view) {
        int selection = view.getId();
        if(selection == R.id.add_button_id){

            Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
            startActivityForResult(intent, PICK_CONTACT);
        }

    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data){
        if(requestCode == PICK_CONTACT){
            getContactInfo(data);
        }
    }


    private void getContactInfo(Intent intent) {

        String number = null; 
        String name = null; 

        String[] projection = {ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, 
                ContactsContract.CommonDataKinds.Phone.NUMBER};

        CursorLoader loader = new CursorLoader(this,intent.getData(),
                null,null,null,null);

        contactsCursor = loader.loadInBackground();
        if(contactsCursor.moveToFirst()){

        String id = contactsCursor.getString(contactsCursor.getColumnIndex(ContactsContract.Contacts._ID));
        name = contactsCursor.getString(contactsCursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

        //get the Phone Number
        Cursor numberCursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI
                , null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[] {id}, null);
        while(numberCursor.moveToNext()){
            number = numberCursor.getString(numberCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
        }

        }

        Log.d(TAG, "Successfully added contacts for group");
        //dbadapter.updateGroup(rowId, values);

        dbadapter.saveContacts(name, number, String.valueOf(rowId));
        cursoradapter.notifyDataSetChanged();
        getSupportLoaderManager().getLoader(0).onContentChanged();
    }


    public static final class DueCustomCursorLoader extends SimpleCursorLoader {
        public static final String TAG = "MyApp.Debug";
        public static int RETRIEVE_CODE = 1;

        ResponderDB dbadapter1;
        int retrieveCode;


        public DueCustomCursorLoader(Context context, ResponderDB dbadapter) {
            super(context);
           this.dbadapter1= dbadapter;

        }

        public DueCustomCursorLoader(Context context, ResponderDB dbadapter, int retrieveCode){

            super(context);
            this.dbadapter1 = dbadapter;
            this.retrieveCode = retrieveCode;
        }



        @Override
        public Cursor loadInBackground() {
            Cursor cursor = null;

            dbadapter1.open();

                cursor = dbadapter1.readContact(retrieveCode);

            return cursor;
        }

    }

    public class DueCustomCursorAdapter extends CursorAdapter {
        public static final String TAG = "SmsResponder.Debug";
        private Context myContext;



        public DueCustomCursorAdapter(Context context,Cursor c, int flags) {
            super(context, c, flags);
            myContext = context;

        }

        //never seem to get here 
        @Override
        public void bindView(View view, Context context, Cursor cursor) {

            ViewHolder holder = (ViewHolder)view.getTag();
            String contactName = cursor.getString(cursor.getColumnIndexOrThrow(ResponderDB.NAME));
            String contactNumber = cursor.getString(cursor.getColumnIndex(ResponderDB.NUMBER));

            Log.d(TAG, "contact name is " + contactName);
            Log.d(TAG, "contact number is " + contactNumber);

            holder.contact_name.setText(contactName);
            holder.contact_number.setText(contactNumber);
        }

        @Override   
        public View newView(Context context, Cursor cursor, ViewGroup parent) {
            ViewHolder holder = new ViewHolder();

                View view = LayoutInflater.from(myContext).inflate(R.layout.group_detail_item, parent,false);
                holder.contact_name = (TextView)view.findViewById(R.id.group_item_id);
                holder.contact_number = (TextView)view.findViewById(R.id.group_subitem_id);
                view.setTag(holder);

                return view;     
        }

    }

    static class ViewHolder {
          TextView text;
          TextView contact_name;
          TextView contact_number;
          CheckBox checkbox;
        }

    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle arg1) {

        return new DueCustomCursorLoader(GroupDetails.this, dbadapter, (int)rowId);
    }


    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        cursoradapter.swapCursor(data);

    }


    @Override
    public void onLoaderReset(Loader<Cursor> arg0) {

        cursoradapter.swapCursor(null);
    }

}

データベースから問題が発生していないため、ここにコードを追加していません。

4

2 に答える 2

1

データベースへの連絡先を保存した後、データベースを再クエリするためにrestartLoader()を実行し、アダプターが新しいデータを処理できるようにonLoadFinishedを再度呼び出す必要があります。

于 2012-06-30T11:50:46.160 に答える
0

私はこれらの2行を逆にしてみます(カーソルを更新する前にリストに自分自身を更新するように指示しているように見えます):

   cursoradapter.notifyDataSetChanged(); 
   getSupportLoaderManager().getLoader(0).onContentChanged();

これに:

   getSupportLoaderManager().getLoader(0).onContentChanged();
   cursoradapter.notifyDataSetChanged(); 
于 2012-06-30T11:12:07.663 に答える