2015-05-12 2 views
1

Я создаю что-то вроде приложения в блокноте. Одна из возможностей - позволить пользователям выбирать несколько заметок и одновременно удалять их с помощью longclicks, чтобы начать процесс выбора. Пока все работает хорошо, нет никаких физических указаний на выбранные элементы (цвет фона). Использование метода getChildAt(position), как показано ниже, помогает мне достичь этого, но проблема заключается в том, когда я прокручиваю вниз, чтобы выявить элементы, не содержащиеся на начальном экране (в зависимости от количества обнаруженных нот), назначение цвета неуместно. Например, если я прокручиваю вниз, чтобы показать два элемента, не содержащихся на экране, при выборе элементов, если я нажимаю на заметку, он выбирается, но цвет фона устанавливается на ноту, расположенную под ней. То же самое происходит, если я прокручу, чтобы открыть 3 ноты и т. Д., Заметки под ними (в зависимости от количества заметок, обнаруженных во время прокрутки) получает цвет, а не выбранную заметку.Настройка цвета фона на элемент списка

Любая помощь была бы очень благодарна. Я только начал работать на платформе Android после того, как был введен в Java на моем нынешнем году университета. Я уверен, что использование пользовательского адаптера будет работать, но я стараюсь, чтобы это было максимально просто для меня. Beneath - это фрагмент моего проекта.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_list_entries); 
//SOME CODES HERE 

     final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, theNamesOfFiles); 


     entriesView = (ListView) findViewById(R.id.listEntriesView); 
     entriesView.setAdapter(adapter); 
     entriesView.setOnItemClickListener(this); 
     entriesView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); 
     entriesView.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() { 

      @Override 
      public boolean onCreateActionMode(ActionMode mode, Menu menu) { 

       MenuInflater inflater = mode.getMenuInflater(); 
       inflater.inflate(R.menu.context_menu, menu); 
       return true; 
      } 

      @Override 
      public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { 
       String a = entriesView.getItemAtPosition(position).toString(); 
//This if statement is necessary because should the user de-selects an item, the system should remove it from the arraylist so they don't get passed to the delete method 
       if (selectedMenuItems.contains(a)) { 
        int b = selectedMenuItems.indexOf(a); 
        selectedMenuItems.remove(b); 
        itemSelectedCount = selectedMenuItems.size(); 
        mode.setTitle(itemSelectedCount + " Item(s) Selected"); 
        View view = entriesView.getChildAt(position); 
        view.setBackgroundColor(Color.TRANSPARENT); 
       } 
       else { 
        selectedMenuItems.add(entriesView.getItemAtPosition(position).toString()); 
        itemSelectedCount = selectedMenuItems.size(); 
        mode.setTitle(itemSelectedCount + " Item(s) Selected"); 
       // entriesView.getChildAt(position).setBackgroundColor(Color.LTGRAY); 
        View view = entriesView.getChildAt(position); 
        view.setBackgroundColor(Color.LTGRAY); 
       } 
       mode.invalidate(); 
      } 

      @Override 
      public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 

       int id = item.getItemId(); 
       switch (id) { 
        case(R.id.delete_menu_button): 
         deleteMethod(); 
         selectedMenuItems.clear(); 
         mode.finish(); 
        break; 
        case(R.id.edit_menu_button1): 
         callEditActiity(); 
         selectedMenuItems.clear(); 
         mode.finish(); 
        break; 
        default: 
         return false; 
       } 
       return true; 
      } 


      @Override 
      public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 

       if (itemSelectedCount == 1){ 
        MenuItem item = menu.findItem(R.id.edit_menu_button1); 
        item.setVisible(true); 
        return true; 
       } else { 
        MenuItem item = menu.findItem(R.id.edit_menu_button1); 
        item.setVisible(false); 
        return true; 
       } 
      } 


      @Override 
      public void onDestroyActionMode(ActionMode mode) { 
       selectedMenuItems.clear(); 

      } 
     }); 
    } 

свою деятельность в XML-файл

<ListView 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:id="@+id/listEntriesView"> 

    </ListView> 

ответ

0

Вы должны сделать заказ адаптера и вашего элемента помнить проверенное состояние. В качестве альтернативы вы можете использовать SparseBooleanArray, чтобы запомнить позиции отмеченных предметов, а когда вы раздуваете представление, вы проверяете, установлен ли этот элемент/положение и задан ли фон.

Посмотреть мою другую должность here для аналогичного решения.

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