0

Я пытаюсь создать ListView с установленными приложениями. Пользователь выбирает приложения внутри мастера (в основном, просмотрщик).Multiselect listView с ActionMode - как сохранить выбранные элементы?

Мой план состоит в том, чтобы создать список пользовательских представлений (значок, имя, пакет), которые позволят выбрать более одного элемента. К сожалению, флажки не будут работать, потому что мне нужно это место для другой функциональности. Итак, я изменил фон элемента.

Итак, я нашел решение для stackoverflow и немного изменил его. Во-первых - основной вид деятельности с этим списком.

public class MainActivity extends ListActivity { 

    private static final String TAG = MainActivity.class.getName(); 
    private ApplicationsAdapter applicationsAdapter; 

    private void getAppList(){ 

     //get apps asynch 
     createList(list); 
    } 

    private void createList(ArrayList<ApplicationItem> list){ 
     applicationsAdapter = new ApplicationsAdapter(this, R.layout.application_list_item, list); 

     setListAdapter(applicationsAdapter); 
     getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); 

     getListView().setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() { 

      private int nr = 0; 

      @Override 
      public boolean onCreateActionMode(android.view.ActionMode mode, Menu menu) { 
       MenuInflater inflater = getMenuInflater(); 
       inflater.inflate(R.menu.cabselection_menu, menu); 
       return true; 
      } 

      @Override 
      public boolean onPrepareActionMode(android.view.ActionMode mode, Menu menu) { 
       return false; 
      } 

      @Override 
      public boolean onActionItemClicked(android.view.ActionMode mode, MenuItem item) { 
       return false; 
      } 

      @Override 
      public void onDestroyActionMode(android.view.ActionMode mode) { 
       nr = 0; 
       applicationsAdapter.clearSelection(); 
      } 

      @Override 
      public void onItemCheckedStateChanged(android.view.ActionMode mode, int position, long id, boolean checked) { 
       if (checked) { 
        nr++; 
        applicationsAdapter.setNewSelection(position, checked); 
        L.d(TAG, applicationsAdapter.getItem(position).getAppName()); 
       } else { 
        nr--; 
        applicationsAdapter.removeSelection(position); 
       } 
       mode.setTitle(nr + " rows selected!"); 

      } 

     }); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     getAppList(); 
    } 


    @Override 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
     ApplicationItem item = (ApplicationItem)l.getAdapter().getItem(position); 
     L.d(TAG + "onListItemClick", applicationsAdapter.getItem(position).getAppName()); 

     l.setItemChecked(position, !applicationsAdapter.isPositionChecked(position)); 
    } 


} 

В моем случае, как правило, все это внутри фрагмента, внутри viewpager. Для ясности я изменил это на типичную деятельность.

Теперь адаптер:

public class ApplicationsAdapter extends ArrayAdapter<ApplicationItem> { 

// private HashMap<ApplicationItem, Boolean> objects; 
private HashMap<Integer, Boolean> mSelection = new HashMap<Integer, Boolean>(); 


public ApplicationsAdapter(Context context, int textViewResourceId, ArrayList<ApplicationItem> objects) { 
    super(context, textViewResourceId, objects); 
    //this.objects = objects; 
} 

public void setNewSelection(int position, boolean value) { 
    mSelection.put(position, value); 
    notifyDataSetChanged(); 
} 

public boolean isPositionChecked(int position) { 
    Boolean result = mSelection.get(position); 
    return result == null ? false : result; 
} 

public Set<Integer> getCurrentCheckedPosition() { 
    return mSelection.keySet(); 
} 

public void removeSelection(int position) { 
    mSelection.remove(position); 
    notifyDataSetChanged(); 
} 

public void clearSelection() { 
    mSelection = new HashMap<Integer, Boolean>(); 
    notifyDataSetChanged(); 
} 

public ApplicationItem getItem(int position){ 
    return super.getItem(position); 
} 

public View getView(int position, View convertView, ViewGroup parent){ 
    View v = convertView; 

    if (v == null) { 
     LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = inflater.inflate(R.layout.application_list_item, null); 
    } 

    ApplicationItem item = super.getItem(position); 


    if(item != null){ 
     TextView appName = (TextView) v.findViewById(R.id.appName); 
     TextView appPackage = (TextView) v.findViewById(R.id.appPackage); 
     ImageView appIcon = (ImageView) v.findViewById(R.id.appIcon); 

     if (appName != null){ 
      appName.setText(item.getAppName()); 
     } 

     if (appPackage != null){ 
      appPackage.setText(item.getPackageName()); 
     } 

     if (appIcon != null){ 
      appIcon.setImageDrawable(item.getIcon()); 
     } 


    } 

    v.setBackgroundColor(Color.parseColor("#00FFFFFF")); //default color 
    if (mSelection.get(position) != null) { 
     v.setBackgroundColor(Color.BLUE);// this is a selected position so make it red 
    } 

    return v; 
} 
} 

ПРОБЛЕМА: ActionMode хорошо, однако я не уверен, как сохранить выбранные элементы после его уничтожения. Обычно внутри onDestroyActionMode Я очищаю выбор. Отлично, поэтому я просто удалю это. Теперь после нажатия на значок «tick» все приложения по-прежнему выбраны. Однако возвращение к ним теперь проблематично, потому что ActionMode будет только «запускаться» при нажатии на невыбранный элемент.

Итак - как я должен справиться с этим?

ответ

0

Ха, ответ был довольно прост. Я должен был подумать об этом вчера, но, по-видимому, я был слишком измучен.

Прежде всего, я изменил режим ListView в

getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 

И удалил setMultiChoiceModeListener() и я только с помощью

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    ApplicationItem item = (ApplicationItem)l.getAdapter().getItem(position); 
    L.d(TAG + "onListItemClick", applicationsAdapter.getItem(position).getAppName()); 

    boolean checked = item.isSelected(); 

    if (!checked) { 
     item.setSelected(true); 
     applicationsAdapter.setNewSelection(position, checked); 
     L.d(TAG, applicationsAdapter.getItem(position).getAppName()); 
    } else { 
     item.setSelected(false); 
     applicationsAdapter.removeSelection(position); 
    } 
} 

просто. Очевидно, ActionMode может быть интересным, но это не был подходящий инструмент для этой работы.

А также - адаптер из первого сообщения может использоваться как пример многозадачного списка, который меняет фоны вместо флажков. По-видимому, я не мог найти ничего такого простого.

Смежные вопросы