0

ラジオボタンでリストビューを作成しましたが、アイテムを結合するラジオグループがないため、アイテムは通常のラジオボタンのように動作しません。

プログラムでxmlにないラジオグループにそれらを追加できますか? ユーザーがリストビューにないボタンを押したときに、どの項目が選択されているかを見つけたい。

これを試してみましたが失敗しました。誰か助けてもらえますか?

これは私のフラグメントです:

public class DietTypeFragment extends Fragment implements AdapterView.OnItemClickListener, View.OnClickListener {
    Button Next;
    Button Back;
    private InteractionListener listener;
    ListView list;
    private static String[] DietList = {"Low Fat", "Low Carb", "Bodybuilder", "Balanced", "Diabetes", "Gluten Free", "Vegeterian"};
    private static String[] DietListSubTxt = {"For weight loss and the less active", "For weight loss and general fitness",
                             "For Strength building", "For all around fitness and nutrition",
                             "Carbohydrates monitored diet", "Diet excluding foods containing gluten", "Plant-based diet"};
    List<NameValuePair> DietType = new ArrayList<NameValuePair>();

    public DietTypeFragment() {
        // Required empty public constructor
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        Next = (Button) getActivity().findViewById(R.id.next_btn);
        Next.setOnClickListener(this);

        Back = (Button) getActivity().findViewById(R.id.back_btn);
        Back.setOnClickListener(this);

        listener = (InteractionListener) getActivity();

        list = (ListView) getActivity().findViewById(R.id.list_diet_type);

        // If you call this fragment more than once (press the back button) then you dont want to add the string again
        if (DietType.isEmpty()) {
            for(int i=0; i< DietList.length; i++) {
                DietType.add(new BasicNameValuePair(DietList[i], DietListSubTxt[i]));
            }
        }
        ArrayAdapter adapter = new ArrayAdapter (getActivity(), R.layout.simple_list_item_2_single_choice, android.R.id.text1, DietType) {

            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                View view = super.getView(position, convertView, parent);
                TextView text1 = (TextView) view.findViewById(android.R.id.text1);
                TextView text2 = (TextView) view.findViewById(android.R.id.text2);

                NameValuePair data = DietType.get(position);

                text1.setText(data.getName());
                text2.setText(data.getValue());

                return view;
            }
        };
        list.setAdapter(adapter);
        list.setOnItemClickListener(this);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_diet_type, container, false);
    }

    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
        Log.d("DietTypeFrag",Integer.toString(view.getId()));
    }

    public void onStop() {
        super.onDetach();
        //listener = null;
    }
    @Override
    public void onClick(View view) {
        listener.DietTypeFragmentChangeScreen(view.getId());
        Log.d("DietTypeFrag","next or back clicked?");
    }
    public interface InteractionListener {
        public void DietTypeFragmentChangeScreen(int id);
    }
}

これは、フラグメントが呼び出す xml レイアウトです: simple_list_item_2_single_choice

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:gravity="center_vertical"
    android:paddingStart="16dip"
    android:paddingEnd="12dip"
    android:minHeight="?android:attr/listPreferredItemHeightSmall"
    android:background="@android:color/transparent">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:orientation="vertical"
        android:gravity="center_vertical">

        <TextView android:id="@android:id/text1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceListItem"
            android:textColor="?android:attr/textColorAlertDialogListItem"
            android:gravity="center_vertical|start"
            android:singleLine="true"
            android:ellipsize="marquee" />

        <TextView android:id="@android:id/text2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="?android:attr/textColorAlertDialogListItem"
            android:gravity="center_vertical|start"
            android:singleLine="true"
            android:ellipsize="marquee" />

    </LinearLayout>

    <RadioButton
        android:id="@+id/rdbtn_sc"
        android:layout_width="35dip"
        android:layout_height="wrap_content"
        android:paddingEnd="12dip"
        android:gravity="center_vertical"
        android:focusable="false"
        android:clickable="false" />

</LinearLayout>

そして、戻るボタンと次へボタンを含む独自の xml を持つ別のフラグメントがありますが、それは問題の一部ではありません。

4

1 に答える 1

0

リストビューには CustomAdapter が必要です または ここに重要なアイデアがあります

RadioButton がチェックされたら、notifyDataSet() を呼び出す必要があります。これにより、すべてのビューが更新されます。RadioButton がチェックされている場合、どの RadioButton が選択されているかを追跡するために selectedPosition を設定する必要があります。ビューは ListView 内で再利用されます。したがって、ListView 内での絶対位置が変わります。したがって、ListAdapter#getView() 内では、各 RadioButton で setTag() を呼び出す必要があります。これにより、RadioButton がクリックされたときに、リスト内の RadioButton の現在の位置を特定できます。RadioButton#setChecked() は、新規または既存のビューの getView() 内で更新する必要があります。これらのアイデアを実証するために、私が作成してテストした ArrayAdapter の例を次に示します。

public class MainActivity extends ListActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // I do no use these values anywhere inside the ArrayAdapter. I could, but don't.
    final Integer[] values = new Integer[] {1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,};

    ArrayAdapter<Integer> adapter = new ArrayAdapter<Integer>(this, R.layout.row, R.id.textview, values) {

        int selectedPosition = 0;

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View v = convertView;
            if (v == null) {
                LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                v = vi.inflate(R.layout.row, null);
                RadioButton r = (RadioButton)v.findViewById(R.id.radiobutton);
            }
            TextView tv = (TextView)v.findViewById(R.id.textview);
            tv.setText("Text view #" + position);
            RadioButton r = (RadioButton)v.findViewById(R.id.radiobutton);
            r.setChecked(position == selectedPosition);
            r.setTag(position);
            r.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    selectedPosition = (Integer)view.getTag();
                    notifyDataSetInvalidated();
                }
            });
            return v;
        }

    };
    setListAdapter(adapter);
}

}

元のスレッドは次のとおりです: Android: カスタム リスト ビューのラジオ ボタン

于 2014-08-04T21:54:06.450 に答える