webentwicklung-frage-antwort-db.com.de

Wählen Sie programmgesteuert das Element ListView in Android

Ich habe zwei Fragmente. Das erste mit Knöpfen im Inneren, das andere mit einem ListView im Inneren (ListFragment).

Ich möchte, dass das erste Fragment (dank seiner Schaltflächen) es dem Benutzer ermöglicht, die ListView zu durchsuchen, die sich im zweiten Fragment befindet.

Daher möchte ich, dass die ListView vom ersten Fragment mit Schaltflächen gesteuert wird.

Ich habe keine Probleme bei der Kommunikation zwischen Fragmenten (Senden von Befehlen vom 1. Fragment zum 2. Fragment), aber ich weiß nicht, wie ich ListView anweisen kann, ein bestimmtes Listenelement (programmgesteuert) auszuwählen.

Welche Art von ListView sollte ich verwenden und wie kann ich die ListView anweisen, eines ihrer Elemente auszuwählen/hervorzuheben/zu fokussieren?

Ich bin im Touch-Modus, während der Benutzer die Tasten des 1. Fragments drückt.

Soll ich setFocusableInTouchMode(true) oder setChoiceMode(ListView.CHOICE_MODE_SINGLE) oder etwas anderes verwenden?

50
Jecimi

Dies ist für alle, die versuchen:

-Programmgesteuert ein Element in einer ListView auswählen

-Diesen Gegenstand hervorheben lassen

Ich arbeite an Android ICS, ich weiß nicht, ob es für alle Ebenen Api funktioniert.

Erstellen Sie zuerst eine Listenansicht (oder rufen Sie sie ab, wenn Sie sich bereits in einer listActivity/listFragment befinden).

Dann setze den Auswahlmodus deiner Listenansicht auf single mit: Mylistview.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

Dann wählen Sie Ihren Artikel programmatisch aus mit: Mylistview.setItemChecked(position, true); (Position ist eine Ganzzahl, die den Rang des Artikels angibt, den Sie auswählen möchten)

Jetzt ist Ihr Artikel tatsächlich ausgewählt, es wird jedoch möglicherweise nichts angezeigt, da kein visuelles Feedback zur Auswahl vorliegt. Jetzt haben Sie zwei Möglichkeiten: Sie können entweder eine vorgefertigte Listenansicht oder eine benutzerdefinierte Listenansicht verwenden.

1) Wenn Sie eine vorgefertigte Listenansicht wünschen, probieren Sie simple_list_item_activated_1, simple_list_item_checked, simple_list_item_single_choice Usw. aus.

Sie können Ihre Listenansicht folgendermaßen einrichten: setListAdapter(new ArrayAdapter<String>(this, R.layout.simple_list_item_activated_1, data))

nach Auswahl der vorgefertigten Listenansicht sehen Sie jetzt, dass bei Auswahl ein Kontrollkästchen aktiviert ist oder die Hintergrundfarbe geändert wurde, usw.

2) Wenn Sie eine benutzerdefinierte Listenansicht verwenden, definieren Sie ein benutzerdefiniertes Layout, das in jedem Element verwendet wird. In diesem XML-Layout weisen Sie jeder Teileansicht in Ihrer Zeile einen Selektor zu, der bei Auswahl geändert werden muss.

Angenommen, Sie möchten, dass Ihre Zeile bei Auswahl die Farbe des Texts und die Farbe des Hintergrunds ändert. Ihr XML-Layout kann wie folgt geschrieben werden:

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

Jetzt erstellen Sie im zeichnungsfähigen Ordner menu_item_background_selector.xml und 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>

Der ausgewählte Text ist weiß.

Dann machen Sie etwas Ähnliches für Ihren Hintergrund:

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>

Hier ist der Hintergrund blau, wenn er ausgewählt ist, und grün, wenn er nicht ausgewählt ist.

Das Hauptelement, das mir fehlte, war Android:state_activated. Es gibt in der Tat (zu) viele Zustände: aktiviert, gedrückt, fokussiert, geprüft, ausgewählt ...

Ich bin nicht sicher, ob das Beispiel, das ich mit Android:state_activated Und Android:state_pressed Gegeben habe, das beste und sauberste ist, aber es scheint für mich zu funktionieren.

Aber ich musste keine eigene Klasse erstellen, um ein benutzerdefiniertes CheckableRelativeLayout zu erhalten (das schmutzig und beängstigend war), und ich habe auch CheckableTextViews nicht verwendet. Ich weiß nicht, warum andere solche Methoden verwendeten, es hängt vielleicht von der Api-Ebene ab.

135
Jecimi

Versuchen Sie AbsListView.performItemClick (...)

Siehe dieser Beitrag zur Verwendung von performItemClick.

15

Das hat bei mir funktioniert:

1) Legen Sie das Auswahlverhalten für die Liste fest.

 mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

2) Legt den aktivierten Status der angegebenen Position fest.

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

3) Fügen Sie einen neuen Stil wie folgt in die Stilressource (res/values) ein:

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

Fühlen Sie sich frei, welche Farben Sie mögen.

4) Verwenden Sie das zuvor definierte Format in Ihrer 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"/>

Oder im Layout, das Sie als Zeile verwenden.

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

Hoffe das hilft jedem!

8
Axel

Versuchen Sie mListView.setSelection(position);

5
J_D

Jecimis Antwort funktionierte bis auf einen kleinen Teil für mich. Ich möchte es für andere teilen. Das Aufrufen von list.setItemChecked( 0, true ); in onCreate () von FragmentActivity funktionierte nicht. In getView() des Adapters list.getCheckedItemPosition( ) wurde -1 zurückgegeben.

Ich muss diese Methode von protected void onPostCreate( Bundle savedInstanceState ) aufrufen.

4
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>

wählen Sie ein Element in einer Listenansicht aus. Wenn Sie auf die Schaltfläche klicken, wird die Seite für das ausgewählte Element angezeigt. Der Code befindet sich oben

0
Hasid Mansoori

Sie können ListView#setSelection(int) verwenden

0
asenovm

Ich mag das:

@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
Faisal Shaikh