listview自定义适配器多选

von4xj4u  于 2021-07-11  发布在  Java
关注(0)|答案(1)|浏览(427)

我正在尝试创建一个多选项列表视图。
我使用自定义适配器和自定义布局。
但我没能做到。
活动(片段):

  1. public class RegisterGroupFragment extends Fragment {
  2. @Override
  3. public void onViewCreated(View view, Bundle savedInstanceState){
  4. super.onViewCreated(view, savedInstanceState);
  5. GroupRepository.getInstance(getActivity().getApplication()).getGroups().observe(getActivity(), new Observer<ArrayList<Group>>() {
  6. @Override
  7. public void onChanged(ArrayList<Group> groups) {
  8. populateList(groups,view);
  9. }
  10. });
  11. }
  12. private void populateList(ArrayList<Group> groups,View view){
  13. ArrayList<NormalListModel> models = new ArrayList<>();
  14. for(int i=0;i<groups.size();i++){
  15. Group gp = groups.get(i);
  16. models.add(gp);
  17. }
  18. NormalListAdapter listAdapter = new NormalListAdapter(this.getActivity(),R.layout.fragment_normal_checked_task_list_row, models);
  19. ListView listView = (ListView) view.findViewById(R.id.groups_listview);
  20. listView.setAdapter(listAdapter);
  21. listView.setItemsCanFocus(false);
  22. listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
  23. //listView.setItemChecked(2,true);
  24. listView.setMultiChoiceModeListener(new ListView.MultiChoiceModeListener() {
  25. @Override
  26. public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
  27. mode.setTitle(""+listView.getCheckedItemCount()+" گروه انتخاب شده");
  28. Log.d("multiple","multiple changed"+listView.getCheckedItemCount());
  29. }
  30. @Override
  31. public boolean onCreateActionMode(ActionMode mode, Menu menu) {
  32. MenuInflater menuInflater = mode.getMenuInflater();
  33. menuInflater.inflate(R.menu.menu_contextual_action_bar,menu);
  34. return true;
  35. }
  36. @Override
  37. public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
  38. return false;
  39. }
  40. @Override
  41. public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
  42. switch (item.getItemId()){
  43. case R.id.menu_confirm:
  44. //action on clicking contextual action bar menu item
  45. SparseBooleanArray checkedItems = listView.getCheckedItemPositions();
  46. for(int i =0;i<checkedItems.size();i++){
  47. if(checkedItems.valueAt(i) == true){
  48. }
  49. }
  50. mode.finish();
  51. }
  52. return true;
  53. }
  54. @Override
  55. public void onDestroyActionMode(ActionMode mode) {
  56. }
  57. });
  58. //for page #2
  59. /*listAdapter.setOnItemClickListener(new NormalListAdapter.OnItemClickListener() {
  60. @Override
  61. public void onItemClick(View view, int id) {
  62. //((RegisterActivity) RegisterGroupFragment.this.getActivity()).usrGroupSet(id);
  63. ArrayList<Integer> arr = new ArrayList<>();
  64. arr.add(id);
  65. registerViewModel.setGroupId(arr);
  66. }
  67. });*/
  68. }
  69. }

这是normallistadapter:

  1. public class NormalListAdapter extends ArrayAdapter {
  2. //to reference the Activity
  3. private final Activity context;
  4. private ArrayList<NormalListModel> models;
  5. private OnItemClickListener onItemClickListener;
  6. public interface OnItemClickListener {
  7. void onItemClick(View view, int id);
  8. }
  9. public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
  10. this.onItemClickListener = onItemClickListener;
  11. }
  12. public NormalListAdapter(Activity context, ArrayList<NormalListModel> models){
  13. super(context, R.layout.fragment_normal_task_list_row, models);
  14. this.context=context;
  15. this.models = models;
  16. }
  17. public NormalListAdapter(Activity context,int layout, ArrayList<NormalListModel> models){
  18. super(context, layout, models);
  19. this.context=context;
  20. this.models = models;
  21. }
  22. public View getView(final int position, View view, ViewGroup parent) {
  23. LayoutInflater inflater=context.getLayoutInflater();
  24. View rowView=inflater.inflate(R.layout.fragment_normal_task_list_row, null,true);
  25. //this code gets references to objects in the listview_row.xml file
  26. TextView nameTextField = (TextView) rowView.findViewById(R.id.list_item_text_title);
  27. TextView infoTextField = (TextView) rowView.findViewById(R.id.list_item_text_info);
  28. ImageView imageView = (ImageView) rowView.findViewById(R.id.list_item_image);
  29. //this code sets the values of the objects to values from the arrays
  30. final NormalListModel model = models.get(position);
  31. nameTextField.setText(model.getTitle());
  32. infoTextField.setText(model.getInfo());
  33. if(model.is_local_img()){
  34. imageView.setImageResource(model.getImage());
  35. }else{
  36. Glide.with(parent)
  37. .load(model.getImageUrl())
  38. .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
  39. .error(Glide.with(parent).load(R.drawable.fallback512).fitCenter().dontAnimate())
  40. .into(imageView);
  41. }
  42. //to every row listener, we will call a function
  43. // function has been initialized when adapter has been made
  44. if (onItemClickListener != null) {
  45. rowView.setOnClickListener(new View.OnClickListener() {
  46. @Override
  47. public void onClick(final View v) {
  48. onItemClickListener.onItemClick(v, model.getId());
  49. }
  50. });
  51. }
  52. return rowView;
  53. }
  54. }

这是自定义布局:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="horizontal"
  4. android:layout_width="match_parent"
  5. android:layout_height="wrap_content"
  6. android:layoutDirection="rtl"
  7. >
  8. <ImageView
  9. android:layout_width="@dimen/finger"
  10. android:layout_height="@dimen/finger"
  11. android:id="@+id/list_item_image"
  12. android:src="@drawable/ic_auth_confirm"
  13. android:layout_marginEnd="@dimen/text_title"
  14. />
  15. <LinearLayout
  16. android:layout_width="match_parent"
  17. android:layout_height="wrap_content"
  18. android:orientation="vertical">
  19. <TextView
  20. android:layout_width="wrap_content"
  21. android:layout_height="wrap_content"
  22. android:id="@+id/list_item_text_title"
  23. android:textSize="18sp"
  24. android:gravity="center_vertical"
  25. />
  26. <TextView
  27. android:layout_width="wrap_content"
  28. android:layout_height="wrap_content"
  29. android:id="@+id/list_item_text_info"
  30. android:textSize="12sp"
  31. />
  32. </LinearLayout>
  33. <CheckedTextView
  34. android:id="@+id/text3"
  35. android:layout_width="0dp"
  36. android:layout_height="wrap_content"
  37. android:layout_weight="1"
  38. android:gravity="center"
  39. android:textAppearance="?android:attr/textAppearanceMedium"
  40. android:checkMark="?android:attr/listChoiceIndicatorSingle" />
  41. </LinearLayout>

这是要在操作栏中显示的菜单:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <menu xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools">
  4. <item
  5. android:id="@+id/menu_confirm"
  6. android:orderInCategory="100"
  7. android:showAsAction="ifRoom|withText"
  8. android:title="Delete"
  9. android:icon="@android:drawable/ic_menu_send"
  10. tools:ignore="AppCompatResource" />
  11. </menu>

listview显示正确,但多项选择不起作用。我不知道我错过了什么??!

csbfibhn

csbfibhn1#

创建列表

  1. List<NormalListModel> selectedModel

在你的 getView() 方法。每次用户单击列表视图中的某个项目时,请通过下面的方法将该项目添加到此列表中,并确保检查用户是否再次选择所选项目,然后将其从selectedmodel列表中删除。

  1. rowView.setOnClickListener(new View.OnClickListener() {
  2. @Override
  3. public void onClick(final View v) {
  4. if (selectedModel != null && selectedModel.contains(model) {
  5. selectedModel.remove(model);
  6. }
  7. else {
  8. selectedModel.add(model);
  9. }
  10. }
  11. });

相关问题