Подтвердить что ты не робот

Программно выберите элемент ListView в Android

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

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

Итак, я хочу, чтобы ListView управлялся первым фрагментом с помощью кнопок.

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

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

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

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

4b9b3361

Ответ 1

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

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

- Пребывание этого элемента пребывания выделено

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

Сначала создайте listview (или получите его, если вы уже находитесь в спискеActivity/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" />

Теперь в выпадающей папке вы создадите 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>

При выборе текста текст будет белым.

Затем сделайте что-то похожее для своего фона: (помните, что вы не вынуждены использовать цвет, но вы также можете использовать 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>

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

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

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

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

Ответ 3

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

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>

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

Ответ 4

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

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

Ответ 5

Попробуйте mListView.setSelection(position);

Ответ 6

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

Ответ 7

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>

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

Ответ 8

Мне нравится следующее:

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

Ответ 9

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

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

Для полного рабочего примера см.

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