2012-01-03 46 views
2

私はコンタクトブックからすべての連絡先を取り出して表示する必要があるアプリケーションで作業しています。私はいくつかの連絡先を選択して、DBに保存されているグループに追加するユーザーにしたい。ArrayリストからカスタムArrayAdapterにデータを表示できません

私は連絡先から連絡先を取得するためのSelectContactクラスは

public class SelectContacts extends Activity implements OnClickListener{ 

    private String groupName; 
    private Button back; 
    private Button home; 
    private List<Contact> list = new ArrayList<Contact>(); 

    private ListView contactList; 

     /** Called when the activity is first created. */ 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.selectcontacts); 

      Bundle bundle = getIntent().getExtras(); 
      groupName=bundle.getString("groupName"); 

      back=(Button)findViewById(R.id.back_button); 
      back.setOnClickListener(this); 

      home=(Button)findViewById(R.id.home_button); 
      home.setOnClickListener(this); 

      contactList=(ListView)findViewById(R.id.contactsListView); 

      ContentResolver cr = getContentResolver(); 



      Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 

      cur.moveToFirst(); 

      if (cur.getCount() > 0) { 

       do{ 

        String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID)); 

        String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 

        if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { 

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

        Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, fields, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{id}, null); 

        pCur.moveToFirst(); 

        do { 

         String number=pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 

         Contact c=new Contact(name,number); 

         list.add(c); 

         }while (pCur.moveToNext()); 

         pCur.close(); 
        }    



        }while (cur.moveToNext()); 

       ContactAdapter contactAdapter=new ContactAdapter(this, R.layout.contactitem, list, contactList,groupName); 



       contactList.setAdapter(contactAdapter); 


      } 


     } 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

      Intent intent= new Intent(); 

      if(v==back){ 

       Bundle bundle = new Bundle(); 
       bundle.putString("groupName", groupName); 
       intent.putExtras(bundle); 

       intent.setClass(SelectContacts.this, GroupDetails.class); 
       startActivity(intent); 

      } 
      if(v==home){ 
       intent.setClass(SelectContacts.this, Welcome.class); 
       startActivity(intent); 

      } 

     } 
} 

をbook-、カスタムアダプタ - ContactAdapter-を実装した[表示] - contactitem.xml-

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 


android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="horizontal"> 


<TextView 

    android:id="@+id/contactname" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center_vertical" 
    android:layout_weight="1" 
    android:layout_marginLeft="20dp" 
    android:ellipsize="end"   
    android:singleLine="true" 
    android:clickable="true"/> 

<TextView 
    android:id="@+id/contactnum" 
    android:layout_width="wrap_content" 
    android:textColor="@color/White" 
    android:clickable="true" 
    android:layout_gravity="center_vertical" 
    android:layout_height="wrap_content"/> 

    <Button 
    android:id="@+id/add" 
    android:layout_width="wrap_content" 
    android:layout_height="35dp" 
    android:text="@string/add_contacts" 
    android:layout_gravity="center_vertical" 
    android:layout_marginLeft="10dp" 
    android:layout_marginRight="10dp" 
    android:focusable="false" 
    android:focusableInTouchMode="false"/> 

</LinearLayout> 

をカスタムリストを作成しました`

public class ContactAdapter extends ArrayAdapter<HashMap<String, Contact>>{ 

private ArrayList<HashMap<String, Contact>> items; 

private LayoutInflater mInflater ; 

public ContactAdapter(Context context, int textViewResourceId, ArrayList<HashMap<String, Contact>> items) { 

     super(context, textViewResourceId, items); 

     this.items = items; 

} 

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

      mInflater = LayoutInflater.from(getContext()); 

      ViewHolder holder; 

     if(convertView==null){ 

      convertView = mInflater.inflate(R.layout.contactitem, parent, false); 

      holder = new ViewHolder(); 

      holder.name = (TextView) convertView.findViewById(R.id.contactname); 

      holder.number = (TextView) convertView.findViewById(R.id.contactnum); 

      holder.add=(Button)convertView.findViewById(R.id.add); 

      convertView.setTag(holder); 

     } 

     else{ 

      holder=(ViewHolder)convertView.getTag(); 

     } 

     String name=items.get(position).get(""+position).getContactName(); 

     String number=items.get(position).get(""+position).getContactNum(); 

     holder.name.setText(name); 

     holder.number.setText(number); 

     return convertView; 
} 



static class ViewHolder{ 

    TextView name; 

    TextView number; 

    Button add; 

} 

}

here Contact is a simple POJO- 



public class Contact { 
    private String contactName; 
    private String contactNum; 

    public String getContactName() { 
     return contactName; 
    } 
    public void setContactName(String contactName) { 
     this.contactName = contactName; 
    } 

    public String getContactNum() { 
     return contactNum; 
    } 
    public void setContactNum(String contactNum) { 
     this.contactNum = contactName; 
    } 

} 

私はアンドロイド..

で初心者上記のコードは、エミュレータの上で静かな罰金を動作し、リストに表示する連絡先の名前と番号を取得しています。しかし、私の携帯電話にこのコードをテストするのGmailを持ってsyncronized占めるとき、それはエラーを以下に墜落してしまった...

CursorIndexOutOfBoundsException:0

のサイズのインデックス0が要求され、私がなぜ任意のアイデアを持っていませんこれは事件です。いくつかの提案をしてください...

答えて

1

Contact Cursorを取り出した後にcur.moveToFirst();に電話していたのを忘れたようです。この行の後、

Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 

ます。また、この後、ここで同じことが欠けている - pCur.moveToFirst();

Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{id}, null); 
+1

変更を加えましたが、同じログエントリを取得しています... :( –

+0

あなたは現在logcatを更新しています。 –

+0

同じことが別のカーソルにもありません。編集した回答を確認してください。 –

1

次の関数を使用します。

  • cur.moveToFirst();
  • pCur.moveToFirst();
+0

それは働いて..ありがとうございます..しかし、それでも活動の表示連絡先couldnt。私のアダプタでいくつかの問題を抱えている可能性があります... –

関連する問題