Пользовательский Единый выбор ListView - PullRequest
19 голосов
/ 01 декабря 2011

Я хочу создать собственное представление списка с двумя текстовыми представлениями и переключателем в одной строке.И по списку нажмите кнопку переключателя, состояние должно быть переключено.Я не могу использовать Простой адаптер здесь.

Я уже задавал этот вопрос Единый выбор ListView custom Row Layout , но не нашел удовлетворительного решения.

То, чем я сейчас занимаюсьЯ использую simple_list_item_single_choice и помещаю данные обоих TextViews в один, разделенный пробелами.Но здесь становится все хуже (показано на рисунке ниже).

http://db.tt/ulP6pn7V

Мне нужно исправить положение размера и цены и сделать просмотр списка одним выбором.

XML-макет для списка может быть примерно таким:

**<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/tv_size"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:textSize="15sp"
        android:width="200dp" />

    <TextView
        android:id="@+id/tv_price"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:textSize="15sp"
        android:width="70dp" />

    <RadioButton
        android:id="@+id/radioButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>**

Как сделать для этого специальный адаптер?

Ответы [ 4 ]

91 голосов
/ 10 октября 2012

У меня была похожая ситуация, но я легко это исправил.Попробуйте это:

  1. Расширьте ListActivity и установите свой настраиваемый адаптер списка

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE); //if you need title to be hidden
        setContentView(R.layout.activity_add_to_cart_select_service_plan);
        setListAdapter(adapter);
    }
    
  2. Создайте поле для сохранения выбранной позиции индекса в адаптере

    int selectedIndex = -1;
    
  3. Предоставить ему интерфейс

    public void setSelectedIndex(int index){
        selectedIndex = index;
    }
    
  4. Установить проверенное состояние на true или false на основе выбранного индекса внутри getView ()

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        RadioButton rbSelect = (RadioButton) convertView
                            .findViewById(R.id.radio1);
        if(selectedIndex == position){
        rbSelect.setChecked(true);
        }
        else{
        rbSelect.setChecked(false);
        }
    }
    
  5. Установить для фокуса и интерактивных атрибутов с переключателями значение 'false'

     <RadioButton
         android:id="@+id/radio1"
         android:checked="false"
         android:focusable="false"
         android:clickable="false"
     />
    
  6. Установить атрибут списка listprindantFocusability для 'beforeDescendants'

    <ListView
        android:id="@android:id/list"
        android:choiceMode="singleChoice"
        android:descendantFocusability="beforeDescendants"
    />
    
  7. Переопределить onListItemClick

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        adapter.setSelectedIndex(position);
        adapter.notifyDataSetChanged();
    }
    

Вот и все .. запустить и проверить

12 голосов
/ 14 декабря 2011

Я искал ответ на эту проблему все утро, и самая полезная вещь, которую я нашел до сих пор, это эта статья .

Хотя я еще не реализовал предложенное решение, похоже, оно на правильном пути.

По сути, единственный вариант ListView ожидает, что вы предоставите виджеты для реализации интерфейса Checkable. LinearLayout и др. Нет. Поэтому вам нужно создать пользовательский макет, который наследует LinearLayout (или любой другой макет, который вы хотите использовать для своих элементов) и реализует необходимый интерфейс.

3 голосов
/ 05 февраля 2015

Устранена аналогичная проблема с хаком (не идеальное решение .. но все еще работает ..)

 listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {




                for (int i = 0; i < parent.getCount() ; i ++)
                {

                    View v = parent.getChildAt(i);
                    RadioButton radio = (RadioButton) v.findViewById(R.id.radio);
                    radio.setChecked(false);

                }

                    RadioButton radio = (RadioButton) view.findViewById(R.id.radio);
                    radio.setChecked(true);



            }
        });
0 голосов
/ 01 декабря 2011

**

<TextView
    android:id="@+id/tv_size"
    android:layout_width="200dp"
    android:layout_height="wrap_content"
    android:text="TextView"
    android:textSize="15sp"
    android:width="200dp" />

<TextView
    android:id="@+id/tv_price"
    android:layout_width="70dp"
    android:layout_height="wrap_content"
    android:text="TextView"
    android:textSize="15sp"
    android:width="70dp" />

<RadioButton
    android:id="@+id/radioButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

**

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...