2012-01-17 88 views
0

我正在開發列表視圖,其中多個選擇是可能的,現在的問題是當我向下滾動或向上滾動項目的選擇丟失和選擇作出的任何其他項目,除了所選的一個。自定義列表查看多選

以下是我的活動。

public class ContactPickerActivity extends Activity { 

    private ArrayList<Contact> arr = new ArrayList<Contact>(); 
    private Context context; 
    private ListView list; 
    private ContactArrayAdapter adapter; 
    private String strName,strNumber; 
    private View view; 
    public static ArrayList<Boolean> arrBoolean = new ArrayList<Boolean>(); 

    @Override 
    public void onCreate(Bundle savedInstance) { 
     super.onCreate(savedInstance); 
     setContentView(R.layout.contact_picker); 
     ProgressDialog pd = new ProgressDialog(this); 
     list = (ListView)findViewById(R.id.contactList); 
     arr = new ArrayList<Contact>(); 
     context = ContactPickerActivity.this; 
     arr = displayContacts(); 
     Log.i("ContactPicker", "Completed Displaying Contact list ::: " + arr.size()); 
     adapter = new ContactArrayAdapter(this,arr); 
     list.setAdapter(adapter); 
//    list.setAdapter(new ArrayAdapter<String>(this, 
//      android.R.layout.simple_list_item_multiple_choice, listContent)); 
     list.setOnItemClickListener(ContactSelectedListener); 
     Log.i("Boolaean >>> ", arrBoolean.size() + ""); 


    } 

    private OnItemClickListener ContactSelectedListener = new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View arg1, int arg2,long arg3) { 
      Log.i("ListViewTest","Item Click"); 
      SparseBooleanArray checked = list.getCheckedItemPositions(); 
      for (int i = 0; i < arr.size(); i++) { 
       Log.i("ListViewTest", arr.get(i)+ ": " + checked.get(i)); 
      } 
     } 
    }; 

    private ArrayList<Contact> displayContacts() { 

     ContentResolver cr = getContentResolver(); 
     Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null); 
     Contact contact; 
     if (cur.getCount() > 0) { 
      while (cur.moveToNext()) { 
       contact = new Contact(); 
       String id = cur.getString(cur.getColumnIndex(People._ID)); 
       String name = cur.getString(cur.getColumnIndex(People.DISPLAY_NAME)); 
       contact.setName(name); 
       arr.add(contact); 
      } 
     } 
     return arr; 
    } 
} 
********* Adapter ***** 

public class ContactArrayAdapter extends BaseAdapter { 

// private final List<Contact> list; 
    private Context context;  

    private LayoutInflater mInflater; 
    private List<Contact> list; 

    public ContactArrayAdapter(Context context,ArrayList<Contact> arrPublicData) { 

     this.mInflater = LayoutInflater.from(context); 
     this.list = arrPublicData; 
    } 

    public int getCount() { 
     return list.size(); 
    } 

    public Object getItem(int position) { 
     return position; 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     View view = convertView; 
     final ViewHolder viewHolder; 
     if (view == null) {   
      view = mInflater.inflate(R.layout.multiselect_row, null); 
      viewHolder = new ViewHolder(); 
      viewHolder.text = (TextView) view.findViewById(R.id.txtItem); 
      viewHolder.checkbox = (CheckBox) view.findViewById(R.id.chkItem); 

      viewHolder.checkbox 
      .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
       @Override 
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 

        Contact element = (Contact) viewHolder.checkbox.getTag(); 
        element.setSelected(buttonView.isChecked()); 
        ContactPickerActivity.arrBoolean.add(buttonView.isChecked()); 
        Log.i("Boolaean 123 >>> ", buttonView.isChecked() + ""); 
       } 
      }); 
      view.setTag(viewHolder); 
      viewHolder.checkbox.setTag(list.get(position)); 
     } else { 
      viewHolder = (ViewHolder) view.getTag(); 
      ((ViewHolder) view.getTag()).checkbox.setTag(list.get(position)); 
     } 
     ViewHolder holder = (ViewHolder) view.getTag(); 
     holder.text.setText(list.get(position).getName()); 
     holder.checkbox.setChecked(list.get(position).isSelected());   
     return view; 
    } 

    static class ViewHolder { 
    protected TextView text; 
    protected CheckBox checkbox; 
} 

IM無法得到物品託運.... 任何幫助appericiated ... thanx提前

+0

這是因爲列表視圖中再次創造了又一遍,我也面臨這個問題 – Abhi 2012-01-17 05:54:30

+0

做u得到什麼解決辦法嗎? – Richa 2012-01-17 05:55:09

+0

[解決方法是在這裏](http://stackoverflow.com/questions/7738527/getting-an-issue-while-checking-the-dynamically-generated-checkbox-through-list/7738854#7738854)。 – 2012-01-17 06:24:18

回答

1

問題是在你的getView方法,請更正此如下:

public class ContactPickerActivity extends Activity { 

    private ArrayList<Contacts> arr = new ArrayList<Contacts>(); 
    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.contact_picker); 
     ProgressDialog pd = new ProgressDialog(this); 
     list = (ListView)findViewById(R.id.contactList); 
     arr = new ArrayList<Contact>(); 
     context = ContactPickerActivity.this; 
     arr = displayContacts(); 
     arrBoolean=new boolean[arr.size()]; 
     Arrays.fill(arrBoolean, false); 
     Log.i("ContactPicker", "Completed Displaying Contact list ::: " + arr.size()); 
     adapter = new ContactArrayAdapter(this,arr); 
     list.setAdapter(adapter); 
//    list.setAdapter(new ArrayAdapter<String>(this, 
//      android.R.layout.simple_list_item_multiple_choice, listContent)); 
     list.setOnItemClickListener(ContactSelectedListener); 
     Log.i("Boolaean >>> ", arrBoolean.size() + ""); 


    } 

    private OnItemClickListener ContactSelectedListener = new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View arg1, int position,long arg3) { 
      Log.i("ListViewTest","Item Click"); 
      arrBoolean[position]=!arrBoolean[position]; 
      adapter.notifyDataSetChanged(); 
     } 
    }; 

    private ArrayList<Contacts> displayContacts() { 

     ContentResolver cr = getContentResolver(); 
     Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null); 
     Contacts contact; 
     if (cur.getCount() > 0) { 
      while (cur.moveToNext()) { 
       contact = new Contacts(); 
       String id = cur.getString(cur.getColumnIndex(People._ID)); 
       String name = cur.getString(cur.getColumnIndex(People.DISPLAY_NAME)); 
       contact.setName(name); 
       arr.add(contact); 
      } 
     } 
     return arr; 
    } 
} 
//********* Adapter ***** 

public class ContactArrayAdapter extends BaseAdapter { 

// private final List<Contact> list; 
    private Context context;  

    private LayoutInflater mInflater; 
    private List<Contacts> list; 

    public ContactArrayAdapter(Context context,ArrayList<Contact> arrPublicData) { 

     this.mInflater = LayoutInflater.from(context); 
     this.list = arrPublicData; 
    } 

    public int getCount() { 
     return list.size(); 
    } 

    public Object getItem(int position) { 
     return position; 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     View view = convertView; 
     final ViewHolder viewHolder; 
     if (view == null) {   
      view = mInflater.inflate(R.layout.multiselect_row, null); 
      viewHolder = new ViewHolder(); 
      viewHolder.text = (TextView) view.findViewById(R.id.txtItem); 
      viewHolder.checkbox = (CheckBox) view.findViewById(R.id.chkItem); 


      view.setTag(viewHolder); 
     } else { 
      viewHolder = (ViewHolder) view.getTag(); 
     } 
     ViewHolder holder = (ViewHolder) view.getTag(); 
     holder.text.setText(list.get(position).getName()); 
     holder.checkbox.setChecked(ContactPickerActivity.arrBoolean[position]);   
     return view; 
    } 

    static class ViewHolder { 
    protected TextView text; 
    protected CheckBox checkbox; 
} 
+0

請貼上正確的代碼 – Richa 2012-01-17 05:59:34

+0

這裏是編輯的代碼。 – jeet 2012-01-20 11:02:42

+0

+1幫助我和支持 – Richa 2012-01-20 11:52:36

5

http://www.marvinlabs.com/2010/10/custom-listview-ability-check-items/

檢查這個

編輯

holder.chkField.setChecked(true); 
holder.chkField.setTag(R.id.chkItem, position); 
check.add(position, true); 

您需要將其更改爲

if(check.getAt(position)){ 
    holder.chkField.setChecked(true); 
}else{ 
    holder.chkField.setChecked(false); 
} 
holder.chkField.setTag(R.id.chkItem, position); 

將低於線檢查監聽器上檢查條件把真或假

check.add(position, isChecked);   
0

其因發生你已經多次使用相同的id來填充複選框。因此,修改代碼,如下方式,

  1. 在XML中添加的TableRow/LinearLayout中複選框的地方。

  2. getView方法

    在運行時創建一個CheckBox並設置其ID爲位置(列表中的位置),並使用addView()方法在XML將其添加到的TableRow/LinearLayout中。

  3. 現在如果問題仍然存在,在CheckChanged監聽創建矢量並添加矢量檢查的項目的位置,並同時創造複選框對矢量進行檢查,如果當前視圖位置被選中,然後使用setChecked(true)方法檢查它。

可能我不清楚,但我不知道更好的方法來解釋它。

2

公共類ListAdapter延伸BaseAdapter {

private LayoutInflater mInflater; 
private ArrayList<String> arrPublicData;  
private int checkCount = 0; 
private ArrayList<Boolean> check = new ArrayList<Boolean>(); 

public ListAdapter(Context context,ArrayList<String> arrPublicData) { 

    this.mInflater = LayoutInflater.from(context); 
    this.arrPublicData = arrPublicData; 
    checkCount = arrPublicData == null ? 0 : arrPublicData.size(); 
} 

public int getCount() { 
    return arrPublicData.size(); 
} 

public Object getItem(int position) { 
    return position; 
} 

public long getItemId(int position) { 
    return position; 
} 

public View getView(int position, View convertView, ViewGroup parent) { 
    final ViewHolder holder; 
    View rowView = convertView; 

    if (rowView == null) { 
     rowView = mInflater.inflate(R.layout.multiselect_row, null); 
     holder = new ViewHolder(); 

     holder.txtField = (TextView) rowView.findViewById(R.id.txtItem); 
     holder.chkField = (CheckBox) rowView.findViewById(R.id.chkItem); 
     holder.chkField.setOnCheckedChangeListener(checkedChangeListener); 
     holder.chkField.setChecked(true); 
     holder.chkField.setTag(R.id.chkItem, position); 
     check.add(position, true);  
     rowView.setTag(holder); 

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

    holder.txtField.setText(arrPublicData.get(position));  
    if(check.get(position) == true) 
    { 
     holder.chkField.setText(arrPublicData.get(position));  
    } 
    else 
    { 
     holder.chkField.setText(arrPublicData.get(position));  
    }  

    return rowView; 
} 

類ViewHolder { 的TextView txtField; CheckBox chkField; }

我覺得你沒有檢查條件複選框是否被選中或不那麼你的複選框得到改變,當你滾動你的ListView的希望,這將有助於

0

我已經創建了一個示例程序,在其中我設置背景根據行的狀態查看顏色,只需更改變化的背景代碼即可查看狀態;

public class SampleActivity extends Activity { 
    private String[] arrItems={"A", "B", "C", "D", "E"}; 
    private boolean[] arrState={false, false, false, false, false}; 
    private ListView lv; 
    private ArrAdapter adapter; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     lv=(ListView) findViewById(R.id.lvTest); 
     adapter=new ArrAdapter(this); 
     lv.setAdapter(adapter); 
     lv.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> adapterView, View view, int position, 
        long id) { 
       // TODO Auto-generated method stub 
       arrState[position]=!arrState[position]; 
       adapter.notifyDataSetChanged(); 
      } 
     }); 

    } 

    private class ArrAdapter extends ArrayAdapter<String> 
    { 
     Context mContext=null; 
     public ArrAdapter(Context context) { 
      super(context, R.layout.row); 
      // TODO Auto-generated constructor stub 
      mContext=context; 
     } 

     @Override 
     public int getCount() { 
      // TODO Auto-generated method stub 
      return arrItems.length; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      // TODO Auto-generated method stub 
      View vi=convertView; 
      ViewHolder holder=null; 
      if(vi==null) 
      { 
       vi=LayoutInflater.from(mContext).inflate(R.layout.row, parent, false); 
       holder=new ViewHolder(); 
       holder.mTxt=(TextView) vi.findViewById(R.id.text1); 
       vi.setTag(holder); 
      } 
      else 
       holder=(ViewHolder) vi.getTag(); 
      holder.mTxt.setText(arrItems[position]); 
      if(arrState[position]) 
       vi.setBackgroundColor(Color.BLUE); 
      else 
       vi.setBackgroundColor(Color.WHITE); 
      return super.getView(position, convertView, parent); 
     } 


     private class ViewHolder 
     { 
      TextView mTxt=null; 
     } 


    } 

    private void clear() 
    { 
     Arrays.fill(arrState, false); 
     adapter.notifyDataSetChanged(); 
    } 
}