web-dev-qa-db-ja.com

カスタム単一選択リストビュー

1つの行に2つのTextViewとラジオボタンがあるカスタムリストビューを作成します。そして、listitemでラジオボタンの状態をクリックするとトグルになります。ここではシンプルアダプターを使用できません。

私はすでにその質問をしました 単一選択ListViewカスタム行レイアウト ですが、満足のいく解決策が見つかりません。

私が現在していることは、simple_list_item_single_choiceを使用して、両方のTextViewのデータをいくつかの空白で区切られた単一のものに入れることです。しかし、ここでは悪化しています(下の画像を参照)。

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>**

そのためのカスタムアダプタの作成方法は?

19
Nitin4Android

私は午前中ずっとこの問題に対する答えを探していましたが、これまでに見つけた最も有用なものは この記事 です。

提案されているソリューションはまだ実装していませんが、正しい軌道に乗っているようです。

基本的に、単一選択のListViewは、Checkableインターフェースを実装するために提供するウィジェットを期待します。 LinearLayoutなどはしません。そのため、LinearLayout(またはアイテムに使用する任意のレイアウト)を継承し、必要なインターフェイスを実装するカスタムレイアウトを作成する必要があります。

12
Jules

同様の状況がありましたが、簡単に修正できました。これを試して:

  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. 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);
        }
    }
    
  5. ラジオボタンのフォーカス可能およびクリック可能な属性を「false」に設定します

     <RadioButton
         Android:id="@+id/radio1"
         Android:checked="false"
         Android:focusable="false"
         Android:clickable="false"
     />
    
  6. Listview descendantFocusability attribを「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();
    }
    

それだけです。実行して確認してください

91
skpal202

ハック(完璧なソリューションではありませんが、まだ動作します。)で同様の問題を処理しました

 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);



            }
        });
3
ASP