Programowo wybierz pozycję ListView w systemie Android

Mam dwa fragmenty. Pierwszy z przyciskami wewnątrz, drugi z ListView wewnątrz (ListFragment).

Chciałbym, aby pierwszy fragment (dzięki jego przyciskom) umożliwiał użytkownikowi przeglądanie ListView, który znajduje się w drugim fragmencie.

Więc chcę, aby ListView był kontrolowany przez pierwszy fragment przyciskami.

Nie mam problemu z komunikacją pomiędzy fragmentami( wysyłanie zamówień z 1. fragmentu do 2.), ale nie wiem jak powiedzieć ListView, aby wybrać (programowo) konkretny element listy.

Jakiego rodzaju widoku listy powinienem używać i jak mogę powiedzieć ListView, aby wybrać/wyróżnić / skupić jeden z jego elementów?

Jestem w trybie dotykowym, gdy użytkownik naciska przyciski pierwszego fragmentu.

Powinienem użyć setFocusableInTouchMode(true) lub setChoiceMode(ListView.CHOICE_MODE_SINGLE) lub czegoś innego?

Author: JDJ, 2012-05-28

9 answers

To jest dla wszystkich próbujących:

-Wybierz programowo element w widoku listy

-aby ten element pozostał podświetlony

Pracuję na Android ICS, Nie wiem, czy działa na wszystkich poziomach Api.

Najpierw Utwórz listview (lub pobierz go, jeśli jesteś już w listActivity/listFragment)

Następnie ustaw tryb wyboru listy na pojedynczy z: Mylistview.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

Następnie wybierz programowo swój pozycja z: Mylistview.setItemChecked(position, true); (pozycja jest liczbą całkowitą wskazującą rangę elementu do wyboru)

Teraz twój przedmiot jest rzeczywiście wybrany, ale możesz nic nie zobaczyć, ponieważ nie ma wizualnej informacji zwrotnej o wyborze. Teraz masz dwie opcje: możesz użyć wstępnie zbudowanego listview lub niestandardowego listview.

1) Jeśli chcesz mieć prebuilt listview, spróbuj simple_list_item_activated_1, simple_list_item_checked , simple_list_item_single_choice, itd...

Możesz skonfigurować listview w ten sposób np. : setListAdapter(new ArrayAdapter<String>(this, R.layout.simple_list_item_activated_1, data))

Po wybraniu prebuilt listview zobaczysz, że po wybraniu masz zaznaczone pole wyboru lub zmieniony kolor tła itp...

2) Jeśli używasz niestandardowego widoku listy, zdefiniujesz układ niestandardowy, który będzie używany w każdym elemencie. W tym układzie XML przypisany zostanie selektor dla każdego widoku części w wierszu, który należy zmienić po wybraniu.

Powiedzmy, że po wybraniu chcesz, aby twój wiersz zmienił kolor tekst i kolor tła. Układ XML można zapisać następująco:

<?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" />

Teraz w folderze drawable tworzysz menu_item_background_selector.xml i 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>

Tekst będzie biały po wybraniu.

Następnie zrób coś podobnego dla tła: (pamiętaj, że nie jesteś zmuszony do używania koloru, ale możesz również użyć drawables)

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>

Tutaj tło jest niebieskie, gdy jest zaznaczone, a zielone, gdy nie jest zaznaczone.

Główny element, którego mi brakowało, to android:state_activated. Rzeczywiście jest (zbyt) wiele stanów: aktywowany,wciśnięty,skupiony,zaznaczony, wybrany...

Nie jestem pewien, czy exemple, który dałem z android:state_activated i android:state_pressed jest najlepszy i najczystszy, ale wydaje się działać dla mnie.

Ale nie musiałem tworzyć własnej klasy, aby uzyskać Custom CheckableRelativeLayout (co było brudne i straszne) ani nie użyłem CheckableTextViews. Nie wiem po co komu takie metody, może to zależy od poziomu Api.

 131
Author: Jecimi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-17 09:12:31

Spróbuj AbsListView.performItemClick(...)

Zobacz Ten post o tym, jak używać performItemClick.

 14
Author: AlikElzin-kilaka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:27

To mi się udało:

1) ustawia zachowanie wyboru dla listy.

 mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

2) ustawia stan sprawdzony podanej pozycji.

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

3) Dodaj nowy styl wewnątrz zasobu stylu (res / wartości) w następujący sposób:

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

Możesz używać dowolnych kolorów.

4) Użyj wcześniej zdefiniowanego stylu w widoku listy:

<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"/>

Lub w układzie używanym jako wiersz.

<?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>
Mam nadzieję, że to komuś pomoże!
 7
Author: Axel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-17 05:48:58

Odpowiedź Jecimiego zadziałała dla mnie z wyjątkiem małej części. Chciałbym podzielić się nim z innymi. Wywołanie list.setItemChecked( 0, true ); W OnCreate() FragmentActivity nie zadziałało. W getView() adaptera list.getCheckedItemPosition( ) zwrócono -1.

Muszę wywołać tę metodę z protected void onPostCreate( Bundle savedInstanceState ).

 4
Author: Swapnil Chaudhari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-24 06:20:14

Try mListView.setSelection(position);

 3
Author: J_D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-28 18:00:41

Możesz użyć ListView#setSelection(int)

 0
Author: asenovm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-28 17:59:10
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>

Wybierz element w widoku listy powinien przejść do strony wybranego elementu po kliknięciu przycisku Jak to zrobić.Kod jest urywkiem powyżej

 0
Author: Hasid Mansoori,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-06 12:22:33

Lubię to:

@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();
            }
        } 
    }
 0
Author: Faisal Shaikh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-04 11:01:57

Wystarczy dodać następujący wiersz do układu niestandardowego listview:

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

Pełny przykład pracy Zobacz:

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

 -1
Author: zibetto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-12 02:42:40