[英]How to get multi selected checked items (android)?
I followed this tutorial chapter 14, http://www.vogella.com/tutorials/AndroidListView/article.html#listviewselection but I am trying to figure out how to implement my submit button to grab the checked items... 我遵循了本教程的第14章, http://www.vogella.com/tutorials/AndroidListView/article.html#listviewselection,但是我试图弄清楚如何实现提交按钮来获取已选中的项目...
This was my attempt but apparently the checked items return as false in my submit button, not sure what is going on exactly and looking through google and SO I only found answers to having a regular adapter. 这是我的尝试,但显然检查项目在我的提交按钮中返回为false,不确定到底发生了什么,并通过google和SO查看,我仅找到了使用常规适配器的答案。
Here is the code: 这是代码:
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());
}
}
}
Here is my code for the adapter: 这是我的适配器代码:
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;
}
}
Here is the model: 这是模型:
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;
}
}
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);
}
}
}
}
does that make any sence to you ? 那对你有意义吗? :)
:)
EDIT: 编辑:
@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 ;
}
}
I ended up making these edits to the code: 我最终对代码进行了以下编辑:
Added this to the end of the adapter as 3 more methods 作为3种其他方法将其添加到适配器的末尾
public int getCount() {
return list.size();
}
public MultiSelectItem getItem(int position) {
return list.get(position);
}
public long getItemId(int position) {
return 0;
}
Then added this to my activity: (in the button) 然后将其添加到我的活动中:(在按钮中)
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());
}
}
and this minor change to the adapter on top: 并对顶部适配器进行的微小更改:
//adapter with custom model
private MultiSelectAdapter adapter;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.