Пользовательский одиночный выбор ListView
Я хочу создать пользовательский вид списка с двумя текстовыми элементами и радиокнопкой в одной строке. И в списке выберите состояние переключателя, чтобы переключиться. Я не могу использовать Simple Adapter здесь.
Я уже задал этот вопрос Индивидуальный выбор строки ListView CustomView, но не нашел удовлетворительного решения.
В настоящее время я использую 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>**
Как сделать для этого пользовательский адаптер?
Ответы
Ответ 1
Я все время искал ответ на эту проблему, и самая полезная вещь, которую я нашел до сих пор, - в этой статье.
Пока я еще не реализовал решение, которое оно предлагает, оно звучит как на правильном пути.
В принципе, единственный вариант ListView
ожидает, что виджеты, которые вы ему предоставили, реализуют интерфейс Checkable
. LinearLayout
и др. нет. Поэтому вам нужно создать собственный макет, наследующий LinearLayout
(или любой другой макет, который вы хотите использовать для своих элементов) и реализует необходимый интерфейс.
Ответ 2
У меня была схожая ситуация, но это было легко. Попробуйте следующее:
-
Расширьте 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);
}
-
Создайте поле для сохранения выбранной позиции индекса в адаптере
int selectedIndex = -1;
-
Предоставить ему интерфейс
public void setSelectedIndex(int index){
selectedIndex = index;
}
-
Установите для установленного состояния значение 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);
}
}
-
Установить радиокнопку фокусируемым и кликабельным атрибутом "false"
<RadioButton
android:id="@+id/radio1"
android:checked="false"
android:focusable="false"
android:clickable="false"
/>
-
Установить listview descendantFocusability, связанный с 'beforeDescendants'
<ListView
android:id="@android:id/list"
android:choiceMode="singleChoice"
android:descendantFocusability="beforeDescendants"
/>
-
Переопределить onListItemClick
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
adapter.setSelectedIndex(position);
adapter.notifyDataSetChanged();
}
Чтобы он... рубил и проверял
Ответ 3
Обрабатывается аналогичная проблема с Hack (Не идеальное решение, но все еще работает..)
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);
}
});
Ответ 4
**
<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" />
**