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;
精彩评论