2012-03-23 175 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; 
} 

}

+0

我也面临类似的问题,你可以在这里发布你的项目在一个zip文件。 – 2012-09-25 10:47:31

+0

@TapanDesai这是全班兄弟.... 你还想要什么..? – Wolverine 2012-09-26 06:56:04

+0

我试过使用相同的代码,但我在使用它时在eclipse中出现错误..请发布项目,如果您有档案 – 2012-09-27 07:18:20

2

这种情况的原因是,当你调用nameCheckBox.setChecked()代码OnClickListener()醒来并运行它的代码。在设置复选框之前,我只是在设置OnClickListener(null)时遇到了同样的问题。

+0

如果我在onClick传递null,那么它如何得到哪个项目被点击。 &可以详细说明更多,以确切地做.. ??? &thenx .. – Wolverine 2012-03-23 06:42:06

+0

在调用setChecked()之前,您应该在onClick()上传递null,然后您应该通过onClick()传递该方法; – redandblack 2012-03-23 08:13:32

+0

在您的代码中,它可能如下所示:nameCheckBox.setOnClickListener(null); nameCheckBox.setChecked(mSelectedContacts.get(位置)); – redandblack 2012-03-23 08:15:15

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)); 
      } 
     }); 

这个代码在商店添加更多的一个ARRE列表中的所有位置以及添加或删除两个所述 快速加载,第二删除。 和用于列出在位置的另一种方法

+0

但当我向下滚动或向上滚动,如果我已取消选择接触得到选择.. 我有想法,你说,但因为它正在选择如何获得其状态作为取消选择..? – Wolverine 2012-03-23 06:43:40