Программно выбрать пункт ListView в Android

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

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

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

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

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

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

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

9 ответов

Решение

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

-Программно выбрать элемент в ListView

-Создание этого предмета остается выделенным

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

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

Затем установите режим выбора вашего списка на одиночный с помощью:Mylistview.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

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

Теперь ваш элемент фактически выбран, но вы можете увидеть абсолютно ничего, потому что нет визуальной обратной связи о выборе. Теперь у вас есть два варианта: вы можете использовать готовый просмотр списка или свой собственный просмотр списка.

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.

Попробуйте AbsListView.performItemClick(...)

Смотрите этот пост о том, как использовать performItemClick,

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

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) Используйте ранее определенный стиль в вашем 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>

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

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

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

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

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>

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

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

Я делаю так:

@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();
            }
        } 
    }

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

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

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

https://elimelec@bitbucket.org/elimelec/custombaseadapter.git

Другие вопросы по тегам