Как выделить строку в ListView в Android?

Мне нужно выделить строку в ListView которая была выбрана (чтобы показать пользователю, что он выбрал), так что это не тот, который будет выбран, это тот, который он выбрал раньше.

У меня уже есть место:

 ListView.setSelection(position); 

И теперь я хочу выбрать эту конкретную строку и выделить ее.

Код функции onCreate() в onCreate() который содержит ListView :

 public class CountryView extends Activity { protected static final String LOG_TAG = null; /** Called when the activity is first created. */ String[] lv_arr = {}; ListAdapter adapter; TextView t; private ListView lvUsers; private ArrayList mListUsers; String responce=null; public int d; int selectedListItem = -1; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.country); Intent data =getIntent(); mListUsers = getCoun(); lvUsers = (ListView) findViewById(R.id.counlistView); lvUsers.setAdapter(new ListAdapter(this, R.id.counlistView, mListUsers)); selectedListItem=data.getExtras().getInt("PositionInList"); lvUsers.setChoiceMode(ListView.CHOICE_MODE_SINGLE); lvUsers.setOnItemClickListener(new OnItemClickListener() { int positionItem; public void onItemClick(AdapterView parent, View view,int position, long id) { Intent pongIntent = new Intent(getApplicationContext(),Trav.class); int counId=mListUsers.get(position).id; pongIntent.putExtra("response",mListUsers.get(position).p); pongIntent.putExtra("responseCounID",counId); //Put the position of the choose list inside extra positionItem=position; pongIntent.putExtra("PositionInListSet",positionItem); setResult(Activity.RESULT_OK,pongIntent); Log.i("CounID *******************************"," "+counId); finish(); } }); } } 

Поскольку по умолчанию ListViews установлены в режим выбора NONE , в сенсорном режиме метод setSelection не будет иметь визуального эффекта.

Чтобы сохранить предыдущий выбор / визуально отобразить явный выбор, сначала вы должны правильно настроить режим выбора списка просмотров:

 listview.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 

Полезно прочитать API-документы этих методов:

  • setSelection
 void android.widget.AdapterView.setSelection(int position) 

Устанавливает текущий выбранный элемент. Для поддержки подclassов доступности, которые переопределяют этот метод, сначала необходимо вызвать метод overriden super.

Параметры :
(начиная с 0) выбранного элемента данных.

  • setChoiceMode
 void android.widget.ListView.setChoiceMode(int choiceMode) 

Определяет поведение выбора для списка. По умолчанию списки не имеют никакого поведения выбора ( CHOICE_MODE_NONE ). Установив для параметра choiceMode значение CHOICE_MODE_SINGLE , List позволяет до одного элемента находиться в выбранном состоянии. Установив для параметра choiceMode значение CHOICE_MODE_MULTIPLE , список позволяет выбрать любое количество элементов.

Параметры :
choiceMode Один из CHOICE_MODE_NONE , CHOICE_MODE_SINGLE или CHOICE_MODE_MULTIPLE

В случае, если этого недостаточно (скажем, вы хотите всегда показывать последний выбор по-другому рядом с текущим выбором), вы должны сохранить свой последний выбранный элемент (данные, которые заполняют ListAdapter ), как lastSelectedItem , и в getView метода getView вашего адаптера другой фоновый ресурс для рендеринга, если он равен этому lastSelectedItem .

Если ваш последний выбор не будет обновляться при изменении выбора, вы должны явно вызвать метод notifyDataSetChanged для вашего экземпляра адаптера.

Обновить
Поскольку ваша деятельность, содержащая ListView является дочерним элементом активности, которая ждет этого результата (на основе части setResult(Activity.RESULT_OK,pongIntent); ), исходная идея верна, последняя позиция должна быть передана через намерение, когда начиная деятельность:

 selectedListItem = getIntent().getIntExtra("PositionInList", -1); lvUsers.setChoiceMode(ListView.CHOICE_MODE_SINGLE); lvUsers.setSelection(selectedListItem); 

Решение ListView.CHOICE_MODE_SINGLE будет работать, если вы останетесь в том же самом действии, но вы заканчиваете его на каждом itemClick (изменение выбора), поэтому дополнительные данные должны быть переданы стартовому Intent .

Вы также можете установить фон ранее выбранного элемента из вашего адаптера – упомянутый выше -, переопределяя его метод getView :

 lvUsers.setAdapter(new ArrayAdapter(this, R.id.counlistView, groups) { @Override public View getView(int position, View convertView, ViewGroup parent) { final View renderer = super.getView(position, convertView, parent); if (position == selectedListItem) { //TODO: set the proper selection color here: renderer.setBackgroundResource(android.R.color.darker_gray); } return renderer; } }); 

Просто:

  1. Установите правильный режим выбора в своем списке. setChoiceMode
  2. Установите фон для поддержки состояния выбора в макете элементов, например:

     android:background="?android:attr/activatedBackgroundIndicator" 

FYI:

Это намного проще реализовать в ваших файлах макета и позволить Android справиться с остальными …

1) Убедитесь, что у вас установлен android:choiceMode="" на вашем макете ListView ( singleChoice , multipleChoice и т. Д.). По умолчанию установлено значение none .

   

2) Создайте XML-файл селектора состояний и сохраните его в папке с вашими возможностями. В этом примере мы назовем его state_selector.xml :

       

3) В макете списка элементов добавьте файл state_selector.xml в качестве фона:

      

Если вы используете multipleChoice , вы можете переопределить onItemClick() и соответственно установить / отключить выбранные элементы . Android изменит цвет фона, как указано в файле state_selector.xml.

У меня возникла проблема в том, чтобы найти легкое решение этого, потому что в большом количестве руководств и ответов содержалась информация о единственном выборе с помощью переключателей (которые в значительной степени основывались на RadioGroup’s).

Моя проблема заключалась в том, что я мог установить элемент в мое состояние «Выделено», но затем не смог сбросить список при выборе следующего элемента. Вот что я придумал:

 listView.setOnItemClickListener(new ItemHighlighterListener ()); 

С этим classом:

 private class ItemHighlighterListener implements OnItemClickListener{ private View lastSelectedView = null; public void clearSelection() { if(lastSelectedView != null) lastSelectedView.setBackgroundColor(android.R.color.transparent); } @Override public void onItemClick(AdapterView arg0, View view, int arg2, long arg3) { clearSelection(); lastSelectedView = view; view.setBackgroundDrawable(view.getContext().getResources().getDrawable(R.drawable.shape_selected_menu_item)); } } 

Я решаю эту проблему следующим образом: 1. установите lastClickId, щелкнув элемент в спискеView, обновите значение lastClickId до позиции, а затем обновите фон представления. После этого, когда мы нажимаем один элемент, этот элемент будет выделен, но когда мы прокручиваем listView (делаем элемент, который мы выбрали из экрана) и прокручиваем назад, подсветка исчезнет, ​​потому что метод getView () повторится в ваш адаптер, поэтому мы должны сделать следующее. 2. в вашем адаптере измените фон в методе getView (), вот код:

 private static int lastClickId = -1; private OnItemClickListener listener = new OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { if ((lastClickId != -1) && (lastClickId != position)) { parent.getChildAt(lastClickId).setBackgroundResource( R.color.grey); view.setBackgroundResource(R.color.blue); } if (lastClickId == -1) { view.setBackgroundResource(R.color.blue); } lastClickId = position; } }; public static int getCurrentSelectedItemId() { return lastClickId; } 

адаптер:

 public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub View view = mInflater.inflate(R.layout.tweet_list_layout, null); // set selected item's background to blue if (position == MainUserFeedFragment.getCurrentSelectedItemId()) { view.setBackgroundResource(R.color.blue); } } 

Почему вы не храните выбор в массиве, а затем передаете этот массив в конструкторе адаптера массива ListView, что-то вроде myArrayAdapter(context,layoutID,dataArray,selectionArray)

то в вашем методе getView для arrayadapter просто выполните проверку. Например, в псевдокоде

 if row was previously selected change background color 

Вы можете использовать переход. Следуйте моему коду, потому что я добился выделения определенного элемента списка по выбору. Предположим, вы хотите выделить первый элемент в течение 5 секунд.

  if(position == 0){ viewHolderThubnail.relImage.setBackgroundResource(R.drawable.translate); TransitionDrawable transition = (TransitionDrawable) viewHolderThubnail.relImage.getBackground(); transition.startTransition(1000); }else{ viewHolderThubnail.relImage.setBackgroundResource(R.color.white); } 

translate.xml

       

new_state.xml

     

original_state.xml

     

Если вы поняли этот код, который очень прост, я должен сказать, то элемент списка в нулевой позиции будет выделяться синим цветом в течение 5 секунд, а затем он будет медленно исчезать до белого цвета.

ПРОСТО ОТ ВСЕГО

Просмотреть updatedview = null;

  @Override public void onItemClick(AdapterView parent, View view, int position, long id) { //these two lines of code means that only one item can be selected at a time if(updatedview != null) updatedview.setBackgroundColor(Color.TRANSPARENT); updatedview=view; Toast.makeText(getApplicationContext(), " " + str[position], Toast.LENGTH_LONG).show(); view.setBackgroundColor(Color.CYAN); } 
  • При проверке флажка в listview также проверяются другие случайные флажки
  • SearchView In ListView с пользовательским адаптером
  • Как я могу обновить одну строку в ListView?
  • Скрытие ActionBar в RecyclerView / ListView onScroll
  • ListFragment не принимает мой макет
  • Есть ли разница между «ListView.invalidateViews ()» и «Adapter.notifyDataSetChanged ()»?
  • Множественный выбор в пользовательском ListView с CAB
  • Пользовательский адаптер Listview с фильтром Android
  • удалить несколько элементов в пользовательском listview
  • Android - ListView слайд влево / вправо, как и Samsung
  • Справка относительно события onClick () для элемента пользовательской строки списка ListView
  • Давайте будем гением компьютера.