开发者

How do I get the position of a togglebutton that is clicked in a gridview?

How do I get the position of the android togglebutton that was clicked in a gridview?

If I use the following example code I dont get a Toast message of the position.

public class HelloGridView extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    GridView gridview = (GridView) findViewById(R.id.gridview);
    gridview.setAdapter(new ToggleButtonAdapter(this));

    gridview.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View v, int position,
                long id) {
            Toast.makeText(HelloGridView.this, "" + position, Toast.LENGTH_SHORT).show();
        }

    });
}

}

And the toggle adapter:

public class ToggleButtonAdapter extends BaseAdapter {
private Context mContext;

public ToggleButtonAdapter(Context c) {
    mContext = c;
}

@Override
public int getCount() {
    return 5;
}

@Override
public Object getItem(int position) {
    return null;
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view;
    LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    if (convertView == null) {  // reuse it if it already exists
        view = (View) inflater.inflate(R.layout.items, null);

    } else {
        view = (View) convertView;
    }

    ToggleButton toggleButton = (ToggleButton) view.findViewById(R.id.toggleButton1);
    TextView textView = (TextView) view.findViewById(R.id.textView1);
    textView.setText("Toggle Button " + position);

    /*toggleButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            ToggleButton t = (ToggleButton) v.findViewById(R.id.toggleButton1);

            Toast.makeText(mContext, Boolean.toString(t.isChecked()), Toast.LENGTH_SHORT).show();
        }
    });*/
    return view;
}

}

Uncomment the toggle listener to play with that part and show me how to get the position. Is there a way to inject some data into the toggle button as the grid view is being constructed that I could later reference? I couldn't find a way reading the ToggleButton javadoc.

Thanks much!

EDIT:

Oops! here are the layouts:

main.xml

<GridView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/gridview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:columnWidth="90dp"
    android:numColumns="auto_fit"
    android:verticalSpacing="10dp"
    android:horizontalSpacing="10dp"
    android:stretchMode="columnWidth"
    android:gravity="center"
    >



</GridView>

items.xml:

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"
    android:orientation="horizontal">
    <LinearLayout 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"
        android:orientation="vertical">

        <TextView 
            android:text="Some label" 
            android:id="@+id/textView1" 
            android:layout_width="wrap_content" 
            android开发者_如何转开发:layout_height="wrap_content"
            android:layout_margin="10dp"/>

        <ToggleButton 
            android:id="@+id/toggleButton1" 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content"
            android:layout_margin="10dp"/>
    </LinearLayout>
</LinearLayout>


In the getView method, define final int pos = position;

and in the onClickListener,

toggleButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            ToggleButton t = (ToggleButton) v.findViewById(R.id.toggleButton1);
            Toast.makeText(mContext, Boolean.toString(t.isChecked()) + " : " + String.valueOf(pos), Toast.LENGTH_SHORT).show();
        }
    });

Works fine, I checked :)

This works because, the OnClickListener we create in the getView method is a Local Class, which retains a local copy of the variables that it accesses of the outer class (this is the reason we need to declare pos as final). An instance of this class is attached with the Toggle Button that is returned from the method, and its lifetime is attached to the lifetime of the Toggle Button.

More about local classes here


Hello Jayson you could try this in your click method: AdapterView.ContextMenuInfo info = (AdapterView.ContextMenInfo)view.getMenuInfo();

int position = info.position;

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜