简体   繁体   English

如何获取多个选定的已选中项目(Android)?

[英]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.

相关问题 如何在Android recyclerview中获取选中项{先前选择的数组项列表}设置为已选中{总计项} - How to get Selected items {list of previously selected array items} set as checked in android recyclerview {Total items} 在ListView中获取选中的项目-Android - Get the checked items in a ListView — Android 如何从Alert.Builder中的多项选项中获取已检查的项目? - How to get the checked items from a multi choice item in a Alert.Builder? 如何在多语言Android应用程序中获取选定的单选按钮? - How to get the selected Radiobutton in multi-lingual Android app? 如何创建一种算法来设置RecyclerView中的多个已检查项目 - How to create an algorithm to set a multi checked items in a RecyclerView 如何获取DualListField中的选定项目? - how to get the selected items in DualListField? 如何使用IStructuredSelection获得多个选定项目? - How to use IStructuredSelection get multi selected projects? 如何在Android中的RecyclerView中跟踪所选项目? - How to keep track of the selected items in a RecyclerView in Android? 如何从Android中的数据库中删除选中的项目? - How to delete checked items from the data base in android? 如何在OpenSymphony WebWork select中获取所选项目 - How to get selected items in OpenSymphony WebWork select
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM