2012-03-23 11 views
1

私はレイアウトインフレータを介してリストビューにチェックボックスを入れようとしましたが、成功しましたが、複数の連絡先を選択しても問題はありませんが、選択を解除すると&ダウン&当時その選択を解除チェックボックスのを自動的に選択し得るために行く...複数の連絡先の選択のリストビュー

public class Contactlist_selfActivity extends ListActivity { 
/** Called when the activity is first created. */ 

private ArrayList<contact> contact_list = null; 
private ProgressDialog mProgressDialog = null; 
private contactAdapter mContactAdapter = null; 
private Runnable mViewcontacts = null; 
private SparseBooleanArray mSelectedContacts = new SparseBooleanArray(); 
private ArrayList<contact> items; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    contact_list = new ArrayList<contact>(); 
    this.mContactAdapter = new contactAdapter(this, R.layout.listview, 
      contact_list); 
    ListView lv = getListView(); 
    setListAdapter(this.mContactAdapter); 
    lv.setItemsCanFocus(false); 
    lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 
    // } 
    mViewcontacts = new Runnable() { 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      getContacts(); 
     } 
    }; 

    Thread thread = new Thread(null, mViewcontacts, "ContactReadBackground"); 
    thread.start(); 
    mProgressDialog = ProgressDialog.show(Contactlist_selfActivity.this, 
      "Please Wait...", "Retriving Contacts...", true); 
} 

@SuppressWarnings("unused") 
private void getContacts() { 
    // TODO Auto-generated method stub 

    try { 

     String[] projection = new String[] { 
       ContactsContract.Contacts.DISPLAY_NAME, 
       ContactsContract.Contacts.HAS_PHONE_NUMBER, 
       ContactsContract.Contacts._ID }; 

     Cursor mCursor = managedQuery(
       ContactsContract.Contacts.CONTENT_URI, projection, 
       ContactsContract.Contacts.HAS_PHONE_NUMBER + "=?", 
       new String[] { "1" }, 
       ContactsContract.Contacts.DISPLAY_NAME); 

     while (mCursor.moveToNext()) { 
      contact contact = new contact(); 

      String contactId = mCursor.getString(mCursor 
        .getColumnIndex(ContactsContract.Contacts._ID)); 

      contact.setContactName(mCursor.getString(mCursor 
        .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME))); 
      contact_list.add(contact); 
     } 
     mCursor.close(); 

     runOnUiThread(returnRes); 

    } catch (Exception e) { 
     // TODO: handle exception 
     Log.d("getContacts", e.getMessage()); 
    } 
} 

public class contactAdapter extends ArrayAdapter<contact> { 
    private int[] isChecked; 

    public contactAdapter(Context context, int textViewResourceId, 
      ArrayList<contact> items1) { 
     super(context, textViewResourceId, items1); 
     items = items1; 
    } 

    @Override 
    public View getView(final int position, View convertView, 
      ViewGroup parent) { 
     // TODO Auto-generated method stub 
     final int position_clicked = 0; 
     // Log.i("asd", "getView :" + getItem(position)); 

     if (convertView == null) { 

      LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = vi.inflate(R.layout.listview, parent, false); 
     } 

     contact contacts = items.get(position); 
     isChecked = new int[items.size()]; 

     if (contacts != null) { 
      final CheckBox nameCheckBox = (CheckBox) convertView 
        .findViewById(R.id.checkBox); 
      nameCheckBox.setChecked(mSelectedContacts.get(position)); 

      for (int i = 0; i < isChecked.length; i++) { 

      } 

      if (nameCheckBox != null) { 
       nameCheckBox.setText(contacts.getContactName()); 
      } 

      nameCheckBox.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        // TODO Auto-generated method stub 
        isChecked[position_clicked] = position; 
        Log.d("position", String.valueOf(position)); 
       } 
      }); 

     } 

     return convertView; 
    } 
} 

private Runnable returnRes = new Runnable() { 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     if (mProgressDialog.isShowing()) 
      mProgressDialog.dismiss(); 
     mContactAdapter.notifyDataSetChanged(); 
    } 
}; 
} 

答えて

11

は、私は答えを見つけた.... 私はちょうど...接触クラスに

public class PlanetsActivity extends Activity { 
private ListView mainListView; 
private Contact[] contact_read; 
private Cursor mCursor; 
private ArrayAdapter<Contact> listAdapter; 

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

    // Find the ListView resource. 
    mainListView = (ListView) findViewById(R.id.mainListView); 

    mainListView 
      .setOnItemClickListener(new AdapterView.OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> parent, View item, 
         int position, long id) { 
        Contact planet = listAdapter.getItem(position); 
        planet.toggleChecked(); 
        ContactViewHolder viewHolder = (ContactViewHolder) item 
          .getTag(); 
        viewHolder.getCheckBox().setChecked(planet.isChecked()); 
       } 
      }); 

    // Throw Query and fetch the contacts. 

    String[] projection = new String[] { Contacts.HAS_PHONE_NUMBER, 
      Contacts._ID, Contacts.DISPLAY_NAME }; 

    mCursor = managedQuery(Contacts.CONTENT_URI, projection, 
      Contacts.HAS_PHONE_NUMBER + "=?", new String[] { "1" }, 
      Contacts.DISPLAY_NAME); 

    if (mCursor != null) { 
     mCursor.moveToFirst(); 
     contact_read = new Contact[mCursor.getCount()]; 

     // Add Contacts to the Array 

     int j = 0; 
     do { 

      contact_read[j] = new Contact(mCursor.getString(mCursor 
        .getColumnIndex(Contacts.DISPLAY_NAME))); 
      j++; 
     } while (mCursor.moveToNext()); 

    } else { 
     System.out.println("Cursor is NULL"); 
    } 

    // Add Contact Class to the Arraylist 

    ArrayList<Contact> planetList = new ArrayList<Contact>(); 
    planetList.addAll(Arrays.asList(contact_read)); 

    // Set our custom array adapter as the ListView's adapter. 
    listAdapter = new ContactArrayAdapter(this, planetList); 
    mainListView.setAdapter(listAdapter); 
} 

/** Holds Contact data. */ 
@SuppressWarnings("unused") 
private static class Contact { 
    private String name = ""; 
    private boolean checked = false; 

    public Contact() { 
    } 

    public Contact(String name) { 
     this.name = name; 
    } 

    public Contact(String name, boolean checked) { 
     this.name = name; 
     this.checked = checked; 
    } 

    public String getName() { 
     return name; 
    } 

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

    public boolean isChecked() { 
     return checked; 
    } 

    public void setChecked(boolean checked) { 
     this.checked = checked; 
    } 

    public String toString() { 
     return name; 
    } 

    public void toggleChecked() { 
     checked = !checked; 
    } 
} 

/** Holds child views for one row. */ 
@SuppressWarnings("unused") 
private static class ContactViewHolder { 
    private CheckBox checkBox; 
    private TextView textView; 

    public ContactViewHolder() { 
    } 

    public ContactViewHolder(TextView textView, CheckBox checkBox) { 
     this.checkBox = checkBox; 
     this.textView = textView; 
    } 

    public CheckBox getCheckBox() { 
     return checkBox; 
    } 

    public void setCheckBox(CheckBox checkBox) { 
     this.checkBox = checkBox; 
    } 

    public TextView getTextView() { 
     return textView; 
    } 

    public void setTextView(TextView textView) { 
     this.textView = textView; 
    } 
} 

/** Custom adapter for displaying an array of Contact objects. */ 
private static class ContactArrayAdapter extends ArrayAdapter<Contact> { 

    private LayoutInflater inflater; 

    public ContactArrayAdapter(Context context, List<Contact> planetList) { 
     super(context, R.layout.simplerow, R.id.rowTextView, planetList); 
     // Cache the LayoutInflate to avoid asking for a new one each time. 
     inflater = LayoutInflater.from(context); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // Contact to display 
     Contact planet = (Contact) this.getItem(position); 
     System.out.println(String.valueOf(position)); 

     // The child views in each row. 
     CheckBox checkBox; 
     TextView textView; 

     // Create a new row view 
     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.simplerow, null); 

      // Find the child views. 
      textView = (TextView) convertView 
        .findViewById(R.id.rowTextView); 
      checkBox = (CheckBox) convertView.findViewById(R.id.CheckBox01); 

      // Optimization: Tag the row with it's child views, so we don't 
      // have to 
      // call findViewById() later when we reuse the row. 
      convertView.setTag(new ContactViewHolder(textView, checkBox)); 

      // If CheckBox is toggled, update the Contact it is tagged with. 
      checkBox.setOnClickListener(new View.OnClickListener() { 
       public void onClick(View v) { 
        CheckBox cb = (CheckBox) v; 
        Contact contact = (Contact) cb.getTag(); 
        contact.setChecked(cb.isChecked()); 
       } 
      }); 
     } 
     // Reuse existing row view 
     else { 
      // Because we use a ViewHolder, we avoid having to call 
      // findViewById(). 
      ContactViewHolder viewHolder = (ContactViewHolder) convertView 
        .getTag(); 
      checkBox = viewHolder.getCheckBox(); 
      textView = viewHolder.getTextView(); 
     } 

     // Tag the CheckBox with the Contact it is displaying, so that we 
     // can 
     // access the Contact in onClick() when the CheckBox is toggled. 
     checkBox.setTag(planet); 

     // Display Contact data 
     checkBox.setChecked(planet.isChecked()); 
     textView.setText(planet.getName()); 

     return convertView; 
    } 

} 

public Object onRetainNonConfigurationInstance() { 
    return contact_read; 
} 
01を新しい変数を取っていました

}

+0

私も同様の問題に直面しています。プロジェクトをzipファイルに投稿してください。 –

+0

@TapanDesaiこれは全体のクラスの仲間です.... 他に何かしたい.. ??? – Wolverine

+0

私は同じコードを使用しようとしましたが、使用中にEclipseでエラーが発生しています。アーカイブにある場合はプロジェクトを投稿してください –

2

この原因は、あなたがコードでOnClickListener()目覚めをnameCheckBox.setChecked()を呼び出し、そのコードを実行するときにということです。私はちょうどOnClickListener(null)を設定する前に同じ問題を解決して、チェックボックスをオンにしたかどうかを設定しました。

+0

もし私がonClickでnullを渡すと、どのアイテムがクリックされるのか? &正確に行うためにもっと詳しく説明できますか???? &thenx .. – Wolverine

+0

setChecked()を呼び出す前にonClick()でnullを渡してからonClick()でメソッドを渡す必要があります。 – redandblack

+0

あなたのコードには次のように表示されます:nameCheckBox.setOnClickListener(null); nameCheckBox.setChecked(mSelectedContacts.get(position)); – redandblack

2

nameCheckBox.setOnClickListener(新しいOnClickListener(){

  @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       isChecked[position_clicked] = position; 
       Log.d("position", String.valueOf(position)); 
      } 
     }); 

このコードに格納中のすべての位置より1つのARREリストを追加し、両方 高速ADD、第削除は 。前記リストに使用さを追加または削除位置にあなたの他の方法

+0

しかし私が下にスクロールするとき、私は連絡先が選択解除された選択を解除しました。 私は言ったアイデアwhtを持っていましたが、それが選択解除された状態を取得する方法が選択されているので.. ??? – Wolverine

関連する問題