1つの行に2つのTextViewとラジオボタンがあるカスタムリストビューを作成します。そして、listitemでラジオボタンの状態をクリックするとトグルになります。ここではシンプルアダプターを使用できません。
私はすでにその質問をしました 単一選択ListViewカスタム行レイアウト ですが、満足のいく解決策が見つかりません。
私が現在していることは、simple_list_item_single_choiceを使用して、両方のTextViewのデータをいくつかの空白で区切られた単一のものに入れることです。しかし、ここでは悪化しています(下の画像を参照)。
私が欲しいのは、サイズと価格の場所を修正し、リストビューを単一の選択肢として作成することです。
リストの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>**
そのためのカスタムアダプタの作成方法は?
私は午前中ずっとこの問題に対する答えを探していましたが、これまでに見つけた最も有用なものは この記事 です。
提案されているソリューションはまだ実装していませんが、正しい軌道に乗っているようです。
基本的に、単一選択のListView
は、Checkable
インターフェースを実装するために提供するウィジェットを期待します。 LinearLayout
などはしません。そのため、LinearLayout
(またはアイテムに使用する任意のレイアウト)を継承し、必要なインターフェイスを実装するカスタムレイアウトを作成する必要があります。
同様の状況がありましたが、簡単に修正できました。これを試して:
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;
}
GetView()内の選択されたインデックスに基づいて、チェック状態をtrueまたはfalseに設定します
@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 attribを「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();
}
それだけです。実行して確認してください
ハック(完璧なソリューションではありませんが、まだ動作します。)で同様の問題を処理しました
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);
}
});