Вопрос по highlight, android, listview – Программно выбрать пункт ListView в Android

49

У меня есть два фрагмента. Первый с кнопками внутри, другой сListView внутри (ListFragment).

Я хотел бы, чтобы первый фрагмент (благодаря его кнопкам) позволял пользователю просматривать ListView, который находится во втором фрагменте.

Поэтому я хочу, чтобы ListView управлялся первым фрагментом с кнопками.

У меня нет проблем при обмене данными между фрагментами (отправка заказов от 1-го фрагмента ко 2-му), но я не знаю, как сказать моему ListView выбрать (программно) конкретный элемент списка.

Какой вид ListView я должен использовать и как я могу сказать ListView выбрать / выделить / сфокусировать один из его элементов?

Я в сенсорном режиме, так как пользователь нажимает на кнопки 1-го фрагмента.

Должен ли я использоватьsetFocusableInTouchMode(true) или жеsetChoiceMode(ListView.CHOICE_MODE_SINGLE) или что-то другое?

Другой мудрый у вас есть Дайте мне идею, не нажимая на элемент представления списка, автоматически выбирайте представление списка, чье лицо проходит через строковое значение. Это слишком срочно, пожалуйста, помогите мне. Заранее спасибо. Ashish Shahi
я делаю приложение для чата и делаю push-уведомление fcm. Я хочу, чтобы уведомление FCM приходило в чат-комнату, но когда я установил ссылку на приложение в чат-комнате, будет сбой, пожалуйста, помогите мне, как я могу это сделать. Ashish Shahi

Ваш Ответ

9   ответов
133

Это для всех, кто пытается:

-Select programmatically an Item in a ListView

-Making this Item stay Highlighted

Я работаю на Android ICS, я не знаю, работает ли он для всех уровней Api.

Сначала создайте просмотр списка (или получите его, если вы уже находитесь в listActivity / listFragment)

затемset the choice mode of your listview to single с :Mylistview.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

затемselect programmatically your item с :Mylistview.setItemChecked(position, true); (позиция является целым числом, указывающим ранг элемента для выбора)

Теперь ваш элемент фактически выбран, но вы можете абсолютно ничего не видеть, поскольку визуальная обратная связь при выборе отсутствует. Теперь у вас есть два варианта:you can either use a prebuilt listview or your custom listview.

1) Если вы хотите предварительно составленный список, попробуйтеsimple_list_item_activated_1, simple_list_item_checked , simple_list_item_single_choice, так далее...

Вы можете настроить свой просмотр списка следующим образом, например:setListAdapter(new ArrayAdapter<String>(this, R.layout.simple_list_item_activated_1, data))

следуя выбранному вами предварительно скомпонованному представлению списка, вы увидите, что при выборе вы отметили флажок или изменили цвет фона и т. д.

2) Если вы используете настраиваемый просмотр списка, вы будете определять настраиваемый макет, который будет использоваться в каждом элементе. В этом XML-макете вы будете присваивать селектор для каждого вида детали в строке, который необходимо изменить при выборе.

Допустим, что при выборе вы хотите, чтобы ваша строка изменила цвет текста и цвет фона. Ваш 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/menu_item_background_selector"
    android:orientation="horizontal" >

<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:textColor="@drawable/menu_item_text_selector" />

Теперь в папке drawable вы создаете menu_item_background_selector.xml и menu_item_text_selector.xml.

menu_item_text_selector.xml:

 <?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">

<item android:state_activated="true"
     android:color="#FFF">
</item>

<item android:state_pressed="true"
     android:color="#FFF">
</item>

<item android:state_pressed="false"
     android:color="#000">
</item>

</selector>

Текст будет белым при выборе.

Затем сделайте что-то подобное для своего фона: (помните, что вы не обязаны использовать цвет, но вы также можете использовать рисованные элементы)

menu_item_background_selector.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">


        <item android:state_activated="true"
        android:color="#0094CE">
        </item>

        <item android:state_pressed="true"
        android:color="#0094CE">
        </item>

        <item android:state_pressed="false"
        android:color="#ACD52B">
        </item>


      </selector>

Здесь фон синий, когда он выбран, и зеленый, если он не выбран.

Основным элементом, которого мне не хватало, былоandroid:state_activated, Действительно (слишком) много состояний: активировано, нажато, фокусировано, проверено, выбрано ...

Я не уверен, что пример, который я дал сandroid:state_activated а такжеandroid:state_pressed самый лучший и чистый, но, похоже, он мне подходит.

Но мне не нужно было делать свой собственный класс, чтобы получитьCustom CheckableRelativeLayout (что было грязно и страшно), и я не использовал CheckableTextViews. Я не знаю, почему другие использовали такие методы, возможно, это зависит от уровня API.

Благодарю. и спасибо @Quentin за подсказку, иначе это могло бы стоить мне нескольких часов! При использовании android: drawable пришлось использовать @ color / & lt; customcolor & gt; это указано в colors.xml. пример: android: drawable = & quot; @ color /ressed_color & quot; где & quot; прессованный_цвет & quot; определяется в файле colors.xml как & lt; color name = "press_color" & gt; # CACFD2 & lt; / color & gt;
Просто чтобы быть в безопасности, вы не должны устанавливать Mylistview.setChoiceMode равным 1. Вы должны установить его в AbsListView.CHOICE_MODE_SINGLE. Это в настоящее время равно 1, но они могут изменить его в будущих версиях API.
Отличный ответ! Однако я могу подтвердить, что это не работает в Gingerbread и ранее. (state_activation был добавлен в Honeycomb, уровень API 11).
Я не знаю, для других, но со своей стороны у меня был RelativeLayout для селектора фона, и приложение зависало (XML Inflate exception). Мне удалось заставить его работать, изменивandroid:color сandroid:drawable на фоне рисования (вы можете использовать цвет в любом случае). В любом случае, спасибо за решение, оно отлично сработало!
Вы забыли упомянуть, что вы должны использоватьMylistview.getCheckedItemPosition(); метод, чтобы получить позицию выбранного элемента.
0

Ты можешь использоватьListView#setSelection(int)

8

Вот что сработало для меня:

1) Установите поведение выбора для списка.

 mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

2) Устанавливает проверенное состояние указанной позиции.

mListView.setItemChecked(1,true); //Don't make the same mistake I did by calling this function before setting the listview adapter.

3) Добавьте новый стиль внутри ресурса стиля (res / values) следующим образом:

<style name="activated" parent="android:Theme.Holo">
<item name="android:background">@android:color/holo_green_light</item>
</style>

Не стесняйтесь использовать любые цвета, которые вам нравятся.

4) Используйте ранее определенныеstyle в вашем ListView:

<ListView
        android:id="@+id/listview"
        style="@style/activated"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp"/>

Или в макете вы используете в качестве строки.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="wrap_content" 
  style="@style/activated"
>
  <!--widgets for your row here-->

</LinearLayout>

Надеюсь, это кому-нибудь поможет!

-1

Просто добавьте следующую строку в макет вашего пользовательского списка:

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

Полный рабочий пример смотрите:

https: //[email protected]/elimelec/custombaseadapter.git

0
package com.example.samsung;

import com.example.samsung.*;
import com.example.samsung.R;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.Toast;

public class Firstscreen extends Activity implements OnItemSelectedListener {
    Button btn;
     Spinner sp;
     public String[] product = { "ML-1676P/XIP","SLM2021W/XIP","SL-M2826ND/XIP","SL-M2826ND/XIP","SL-M2826ND/XIP","SL-M3320ND/XIP","SL-M3820ND/XIP","SL-M4020ND/XIP"};  


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_firstscreen);
        btn = (Button) findViewById(R.id.bn);
        sp= (Spinner) findViewById(R.id.sp);
    }
        public void button (View v){
            {

        Intent i = new Intent(Firstscreen.this,ML1676P.class);
        startActivity(i);
        }

        Spinner s1 = (Spinner) findViewById(R.id.sp);
        ArrayAdapter<String> adapter 
        = new ArrayAdapter<String>(this, 
                android.R.layout.simple_spinner_item, product); // find other layout parameters
        s1.setAdapter(adapter);
        s1.setOnItemSelectedListener(new OnItemSelectedListener()
        {

            @Override
            public void onItemSelected(AdapterView<?> arg0, View arg1,
                    int arg2, long arg3) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0) {
                // TODO Auto-generated method stub

            }

    });
    }

    private Object product() {
            // TODO Auto-generated method stub
            return null;
        }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.firstscreen, menu);
        return true;
    }

    @Override
    public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
            long arg3) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onNothingSelected(AdapterView<?> arg0) {
        // TODO Auto-generated method stub


    }



}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".Firstscreen"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/tv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#FF35B5E5"
        android:layout_centerInParent="true"
        android:text="CHOOSE THE PRODUCT FROM THE LIST" />

    <Spinner
        android:id="@+id/sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:drawSelectorOnTop="true" />

    <Button
        android:id="@+id/bn"
        android:layout_width="285dp"
        android:layout_height="wrap_content"
        android:text="       GO             " 
        android:onClick="button"/>


</LinearLayout>

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

4

Ответ Джецими сработал для меня, за исключением небольшой части. Я хотел бы поделиться этим для других. призваниеlist.setItemChecked( 0, true ); в onCreate () FragmentActivity не работал. ВgetView() адаптераlist.getCheckedItemPosition( ) вернулся -1.

Я должен вызвать этот метод изprotected void onPostCreate( Bundle savedInstanceState ).

list.setItemChecked (0, true) работает !!
Любое решение, если динамически менять адаптер, после всех трюков lifeCycle?
0

Я делаю так:

@Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser) {
            try {
                int pos = 0;
                listview.performItemClick(null, pos, listview.getItemIdAtPosition(pos) );
            } catch (Exception e) {
                e.printStackTrace();
            }
        } 
    }
15

ПытатьсяAbsListView.performItemClick (...)

Увидетьэта почта о том, как использоватьperformItemClick.

4

ПытатьсяmListView.setSelection(position);

setSelection() будет работать, только если не в сенсорном режиме (документация четко указывает это).
@Constantin Вот, пожалуйста.developer.android.com/reference/android/widget/…, Фраза"If in touch mode, the item will not be selected but it will still be positioned appropriately." больше нигде не "ясно" чем это в настоящее время.
Это работает, например, если я поставлюmListView.setSelection(20) он отправляет пользователя к 20-му элементу списка. Но есть ли у вас идея сделать этот элемент выбранным (или выделенным)? Jecimi
@AlexSemeniuk Я думаю, что у нас разные взгляды на «ясно», где это указано в документации? Кроме того, для записи, я согласенsetSelection() похоже, не работает в сенсорном режиме.
Ну, на самом деле лучше в моем случае пойти сlistview.setItemChecked(position, true); (см. мой ответ, если вы хотите больше деталей). В любом случае, спасибо за ваш ответ :). Jecimi

Похожие вопросы