Intereting Posts
Как создать полупрозрачную страницу инструкций в Android? Тест инструментальных средств Android не работает на Travis CI AVD, но работает на локальном эмуляторе Нужно ли использовать _ID в качестве первичного ключа SQlite? И он должен быть INT? (Android Dev) Как правильно отображать вкладки (пробелы), поступающие из базы данных MySQL, как в Android, так и в приложении IOS? OnHoverListener не работает в Android Скрытие контруктивной панели действий при открытии навигационного ящика Android listSelector все еще частично отображается, когда элемент прокручивается Общаться между ведущими в приложении MVP android Проверьте, предоставил ли пользователь доступ NotificationListener к моему приложению В чем разница между фоновым и передним планом? Должен ли я раздувать макет или программно его создавать? Ответ HTML с сервера Как обнаружить утечку памяти Объект Greendao при сериализации с использованием GSON не содержит связанного объекта в строке Generated JSON Как уменьшить размер кнопки радио в android

Как выделить строку в 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<Coun> 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(); } }); } } 

Solutions Collecting From Web of "Как выделить строку в ListView в Android?"

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

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

 listview.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 

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

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

Устанавливает текущий выбранный элемент. Для поддержки подклассов доступности, которые переопределяют этот метод, сначала необходимо вызвать метод 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 фоновый ресурс для средства визуализации, если он равен этому 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 .

 <ListView android:id="@+id/invite_friends_fragment_contacts_list" android:layout_width="match_parent" android:layout_height="wrap_content" android:choiceMode="multipleChoice"/> <!-- THIS LINE --> 

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

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@android:color/blue" android:state_selected="true"/> <item android:drawable="@android:color/blue" android:state_activated="true"/> <item android:drawable="@android:color/transparent"/> </selector> 

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

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/state_selector"> <!-- THIS LINE --> <!-- ALL OF YOUR ELEMENTS WILL GO HERE (TextViews, ImageViews, etc) --> </RelativeLayout> 

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

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

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

 listView.setOnItemClickListener(new ItemHighlighterListener ()); 

С этим классом:

 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 до позиции, а затем обновите фон представления. После этого, когда мы нажимаем на один элемент, этот элемент будет выделен, но когда мы прокручиваем списокView (делаем элемент, который мы выбрали вне экрана) и прокручиваем назад, подсветка исчезает, потому что метод 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 в вашем методе 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

 <?xml version="1.0" encoding="UTF-8"?> <transition xmlns:android="http://schemas.android.com/apk/res/android"> <!-- The drawables used here can be solid colors, gradients, shapes, images, etc. --> <item android:drawable="@drawable/new_state" /> <item android:drawable="@drawable/original_state" /> </transition> 

new_state.xml

 <?xml version="1.0" encoding="UTF-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="#92BCE7"/> </shape> 

original_state.xml

 <?xml version="1.0" encoding="UTF-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="#FFFFFF"/> </shape> 

Если вы поняли этот код, который очень прост, я должен сказать, тогда элемент списка в нулевой позиции будет выделяться синим цветом в течение 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); }