2014-02-27 15 views
0

我跟着這個教程第14章,http://www.vogella.com/tutorials/AndroidListView/article.html#listviewselection但我試圖找出如何實現我的提交按鈕搶選中的項目...如何獲取多選的選中項目(android)?

這是我的嘗試,但顯然已選中的項目返回我提交虛假按鈕,不知道究竟發生了什麼,並通過谷歌和所以我只找到答案有一個普通的適配器。

下面是代碼:

public class RegisterFollowup extends ListActivity implements OnClickListener { 
Button btnCategoriesSubmit; 
ListView categoriesList; 

//adapter with custom model 
ArrayAdapter<MultiSelectItem> adapter; 

//list with custom model 
List<MultiSelectItem> list; 

ArrayList<MultiSelectItem> selected; 


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

    //setup portrait mode for app 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

    //button categories submit 
    btnCategoriesSubmit = (Button) findViewById(R.id.btnCategoriesSubmit); 
    btnCategoriesSubmit.setOnClickListener(this); 

    //Set adapter for multi-select model and adapter 
    adapter = new MultiSelectAdapter(this, getMultiSelectItem()); 
    setListAdapter(adapter); 

    //get the list view and set it in activity to a listview 
    //categoriesList = getListView(); 

    //setChoicemode 
    //getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 

    selected = new ArrayList<MultiSelectItem>(); 

} 

//call to retrieve list 
private List<MultiSelectItem> getMultiSelectItem() { 
    //initiate new list 
    list = new ArrayList<MultiSelectItem>(); 

    //called to get string array 
    Resources res = getResources(); 
    String[] categories = res.getStringArray(R.array.categories); 

    //loop through string array 
    for(String category: categories) { 
     Log.e("cat", "categ: " + category); 
     list.add(get(category)); 
    } 
    return list; 
} 

//call model to set names and methods for each item 
private MultiSelectItem get(String s) { 
    return new MultiSelectItem(s); 
} 

@Override 
public void onClick(View view) { 
    if(view == btnCategoriesSubmit) { 
     Log.e("string results", "string results " + getMultiSelectItem().size()); 
     for(int i=0;i< getMultiSelectItem().size();i++){ 
      MultiSelectItem item = getMultiSelectItem().get(i); 
      if(item.isSelected()){ 
       selected.add(item); 
      } 
     } 

     Log.e("string results", "string results selected " + selected.size()); 
     } 
     } 
    } 

這裏是我的適配器代碼:

public class MultiSelectAdapter extends ArrayAdapter<MultiSelectItem> { 

private final List<MultiSelectItem> list; 
private final Activity context; 


public MultiSelectAdapter(Activity context, List<MultiSelectItem> list) { 
    super(context, R.layout.multi_select_layout, list); 
    this.context = context; 
    this.list = list; 
} 

static class ViewHolder { 
    protected TextView text; 
    protected CheckBox checkbox; 
} 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View view = null; 
    if (convertView == null) { 
     LayoutInflater inflater = context.getLayoutInflater(); 
     view = inflater.inflate(R.layout.multi_select_layout, null); 
     final ViewHolder viewHolder = new ViewHolder(); 
     viewHolder.text = (TextView) view.findViewById(R.id.label); 
     viewHolder.checkbox = (CheckBox) view.findViewById(R.id.check); 
     viewHolder.checkbox 
       .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

        @Override 
        public void onCheckedChanged(CompoundButton buttonView, 
               boolean isChecked) { 
         MultiSelectItem element = (MultiSelectItem) viewHolder.checkbox 
           .getTag(); 
         element.setSelected(buttonView.isChecked()); 

        } 
       }); 
     view.setTag(viewHolder); 
     viewHolder.checkbox.setTag(list.get(position)); 
    } else { 
     view = convertView; 
     ((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; 
} 
} 

這裏是模型:

public class MultiSelectItem { 
private String name; 
private boolean selected; 

public MultiSelectItem(String name) { 
    this.name = name; 
    selected = false; 
} 

public String getName() { 
    return name; 
} 

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

public boolean isSelected() { 
    return selected; 
} 

public void setSelected(boolean selected) { 
    this.selected = selected; 
} 
} 
+0

首先,你爲什麼只在點擊提交按鈕後設置選擇模式?我相信,你應該在允許用戶選擇項目之前進行設置。 – vida

+0

好吧,即使我移動它的位置,它仍然給我提交相同的結果,即使在明確選擇項目時,它也會顯示爲false ... – Lion789

+0

按照本教程,可能會幫助您http:// www.quicktips.in/how-to-create-multi-select-listview-android-with-custom-adapter/ –

回答

0

我最終作出這些修改的代碼:

已將此添加適配器,然後加入3種方法

結束這對我的活動:(在按鈕中)

List<MultiSelectItem> checkedData = adapter.list; 
      Log.e("string results", "string results " + getMultiSelectItem().size()); 
      for(MultiSelectItem item :checkedData) { 
       if(item.isSelected()) { 
        Log.e("checker", item.getName()); 
       } 
      } 

和這個小改變適配器上:

//adapter with custom model 
    private MultiSelectAdapter adapter; 
1
ArrayList<MultiSelectedItem> selected = new ArrayList<MultiSelectedItem>(); 


@Override 
public void onClick(View view) { 
    if(view == btnCategoriesSubmit) { 
     for(int i=0;i< getMultiSelectItem().size;i++){ 
      MultiSelectItem item = getMultiSelectItem().get(i); 
      if(item.isSelected()){ 
       selected.add(item); 
      } 
     } 
    } 
} 

不會使任何對你感興趣? :)

編輯:

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder = null; 
     if (convertView == null) { 

      LayoutInflater vi = (LayoutInflater) getActivity() 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = vi.inflate(R.layout.multi_select_layou, null); 

      holder = new ViewHolder(); 

      holder.text = (TextView) convertView.findViewById(R.id.label); 
      holder.checkbox = (CheckBox) convertView.findViewById(R.id.check); 
        convertView.setTag(holder); 
      holder.checkBox.setOnClickListener(new View.OnClickListener() { 
       public void onClick(View v) { 
        CheckBox cb = (CheckBox) v; 
        MultiSelectItem element = (MultiSelectItem) cb.getTag(); 
        element .setSelected(cb.isChecked()); 
       } 
      }); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 
     holder.text.setText(list.get(position).getName()); 
     holder.checkbox.setChecked(list.get(position).isSelected()); 
     holder.checkBox.setTag(list.get(position)); 
     return convertView ; 
    } 
} 
+0

是的,但我得到一個錯誤java.lang.IndexOutOfBoundsException:索引4無效,大小爲4,它是引用此行MultiSelectItem item = getMultiSelectItem()。get(i);我假設我應該擺脫這一行getListView()。setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);對? – Lion789

+0

對不起...我的壞...我

+0

是的,你做...你已經有在你自己的適配器中定義的按鈕listview ... –

相關問題