1

gridview にラジオボタンを追加することは可能ですか? または、チェックボックスを gridview のラジオボタンのように機能させることはできますか?

4

4 に答える 4

1

例を示します。ラジオボタンを使用することは本当に可能です。しかし、これは役立つはずの例です。もちろん、私はあなたにすべてを与えたわけではありませんが、これはそれが可能であることを示しているはずです

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.RadioButton;
import android.widget.TableLayout;
import android.widget.TableRow;


public class ToggleButton extends TableLayout  implements OnClickListener {

    private static final String TAG = "ToggleButton";
    private RadioButton activeRadioButton;

    /** 
     * @param context
     */
    public ToggleButton(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    /**
     * @param context
     * @param attrs
     */
    public ToggleButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void onClick(View v) {
        final RadioButton rb = (RadioButton) v;
        ///////// do whatever /////////////


    }

    /* (non-Javadoc)
     * @see android.widget.TableLayout#addView(android.view.View, int, android.view.ViewGroup.LayoutParams)
     */
    @Override
    public void addView(View child, int index,
            android.view.ViewGroup.LayoutParams params) {
        super.addView(child, index, params);
        setChildrenOnClickListener((TableRow)child);
    }


    /* (non-Javadoc)
     * @see android.widget.TableLayout#addView(android.view.View, android.view.ViewGroup.LayoutParams)
     */
    @Override
    public void addView(View child, android.view.ViewGroup.LayoutParams params) {
        super.addView(child, params);
        setChildrenOnClickListener((TableRow)child);
    }


    private void setChildrenOnClickListener(TableRow tr) {
        final int c = tr.getChildCount();
        for (int i=0; i < c; i++) {
            final View v = tr.getChildAt(i);
            if ( v instanceof RadioButton ) {
                v.setOnClickListener(this);
            }
        }
    }

    public int getCheckedRadioButtonId() {
        if ( activeRadioButton != null ) {
            return activeRadioButton.getId();
        }

        return -1;
    }
}

このようなレイアウトを作成します(もちろん、それをクリーンアップする必要がありますが、アイデアは得られました)

<?xml version="1.0" encoding="utf-8"?>
<com.example.android.view.ToggleButton
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content" android:layout_height="wrap_content"
    android:id="@+id/radGroup1">
    <TableRow>
            <RadioButton android:id="@+id/rad1" android:text="Button1"
                android:layout_width="105px" android:layout_height="wrap_content"
                android:textSize="13px" />
            <RadioButton android:id="@+id/rad2" android:text="Button2"
                android:layout_width="105px" android:textSize="13px"
                android:layout_height="wrap_content" />
            <RadioButton android:id="@+id/rad3" android:text="Button3"
                android:layout_width="105px" android:textSize="13px"
                android:layout_height="wrap_content" />
    </TableRow>
    <TableRow>
            <RadioButton android:id="@+id/rad1" android:text="Button1"
                android:layout_width="105px" android:layout_height="wrap_content"
                android:textSize="13px" />
            <RadioButton android:id="@+id/rad2" android:text="Button2"
                android:layout_width="105px" android:textSize="13px"
                android:layout_height="wrap_content" />
            <RadioButton android:id="@+id/rad3" android:text="Button3"
                android:layout_width="105px" android:textSize="13px"
                android:layout_height="wrap_content" />
    </TableRow>
    <TableRow>
            <RadioButton android:id="@+id/rad1" android:text="Button1"
                android:layout_width="105px" android:layout_height="wrap_content"
                android:textSize="13px" />
            <RadioButton android:id="@+id/rad2" android:text="Button2"
                android:layout_width="105px" android:textSize="13px"
                android:layout_height="wrap_content" />
            <RadioButton android:id="@+id/rad3" android:text="Button3"
                android:layout_width="105px" android:textSize="13px"
                android:layout_height="wrap_content" />
    </TableRow>
</com.example.android.view.ToggleButton>
于 2012-07-12T13:37:24.373 に答える
0

コードを編集します。RadioGridView は次のように変更する必要があります...

上記のコードでは、Gridview の最初の項目が更新されていないためです。

背景 mItemsBg は最初に設定する必要がありました...うーん...

public class RadioGridView extends LinearLayout {

    private int mClickedPosition = -1;

    private Context mContext;

    private int[] mItems;
    private int[] mItemsBg;
    private ImageView[] iv_items;

    RadioGridViewAdapter adapter;

    public RadioGridView(Context context, int[] items) {
        super(context);

        this.mContext = context;
        this.mItems = items;

        init();
    }

    private void init() {

    if (mItems != null) {
        iv_items = new ImageView[mItems.length];

        mItemsBg = new int[mItems.length];
        for (int i = 0; i < mItems.length; i++) {
        mItemsBg[i] = Color.WHITE;
        }

        GridView gv = new GridView(mContext);
        addView(gv);

        gv.setBackgroundColor(0xffffffff);
        gv.setColumnWidth(50);
        gv.setNumColumns(GridView.AUTO_FIT);
        gv.setVerticalSpacing(10);
        gv.setHorizontalSpacing(10);
        gv.setStretchMode(GridView.STRETCH_COLUMN_WIDTH);
        gv.setGravity(Gravity.CENTER);

        adapter = new RadioGridViewAdapter();
        gv.setAdapter(adapter);

        gv.setOnItemClickListener(new OnItemClickListener() {

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

            if (mClickedPosition >= 0) {
            mItemsBg[mClickedPosition] = Color.WHITE;
            }
            mItemsBg[position] = Color.RED;
            mClickedPosition = position;

            adapter.notifyDataSetChanged();

            if (mOnGridItemClickListener != null) {
            mOnGridItemClickListener.onItemClick(position);
            }

        }
        });

    }

    }

    /*********************************************************
     * Listener Interface
     ********************************************************/
    public interface OnGridItemClickListener {
         public void onItemClick(int position);
    }

    public OnGridItemClickListener mOnGridItemClickListener = null;

    public void setOnGridItemClickListener(OnGridItemClickListener l) {
         mOnGridItemClickListener = l;
    }

    /*********************************************************
     * RadioGidViewAdapter
     *********************************************************/
    class RadioGridViewAdapter extends BaseAdapter {

    @Override
    public int getCount() {
        return mItems.length;
    }

    @Override
    public Object getItem(int position) {
        return mItems[position];
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        if (convertView == null) {
            convertView = new ImageView(mContext);
        }

        iv_items[position] = (ImageView) convertView;
        iv_items[position].setImageResource(mItems[position]);
        iv_items[position].setBackgroundColor(mItemsBg[position]);

        return convertView;
    }

    }
}
于 2013-01-03T09:11:26.420 に答える
0

チェックボックスを使用して機能させました。ここでcheckedVideoは、チェックされているチェックボックスの値を保持するブール配列です。

selectCB.setId(position);
                selectCB.setOnClickListener(new OnClickListener() {

                    public void onClick(View v) {
                        // TODO Auto-generated method stub

                        CheckBox cb = (CheckBox) v;
                        int id = cb.getId();
                        Log.i(LOG_TAG, "Clicked ? "+id);
                        if(checkedVideo[id])
                        {
                            checkedVideo[id] = false;
                            cb.setChecked(false);
                        }
                        else
                        {
                            for(int index = 0; index < count; index++)
                            {
                                checkedVideo[index] = false;
                            }
                            checkedVideo[id] = true;
                            cb.setChecked(true);
                            notifyDataSetChanged();
                        }
                    }
                });

                Log.i(LOG_TAG, "Checked ? "+checkedVideo[position]);
                selectCB.setChecked(checkedVideo[position]);
于 2012-07-12T14:07:10.840 に答える