Reputation: 1133
I am trying to make a custom list view. Each entry in the list view will have a imageview, a textview and a radiobutton. I finally made the list but now I am having a problem in selecting radio buttons.
What I want is Whenever a user clicks anywhere in an entry then this should set the corresponding radio button and automatically deselect other radio buttons in list.
Here's my code: bus_item.xml :-
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<ImageView
android:id="@+id/imglist_icon"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_gravity="center_vertical"
android:layout_margin="10dp"
android:src="@drawable/alaknanda" />
<TextView
android:id="@+id/txtlist_name"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:text="Alaknanda"
android:textSize="22sp"
android:textStyle="bold" />
<RadioButton
android:id="@+id/radio_list"
android:focusable="false"
android:focusableInTouchMode="false"
android:layout_margin="10dp"
android:layout_width="wrap_content"
android:layout_height="match_parent" />
</LinearLayout>
BusListActivity.java :-
package com.hpubts50.hpubustrackerserver;
import android.app.ListActivity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.TextView;
public class BusListActivity extends ListActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bus_list);
// Setting List Adapter for custom list
setListAdapter(new MyBusListAdapter(this, android.R.layout.simple_list_item_1, R.id.txtlist_name, getResources().getStringArray(R.array.HPU_Buses)));
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
// TODO Auto-generated method stub
//super.onListItemClick(l, v, position, id);
Log.e("MYTAG",""+position);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.bus_list, menu);
return true;
}
// Custom Adapter inner class for custom list
private class MyBusListAdapter extends ArrayAdapter<String> {
public MyBusListAdapter(Context context, int resource, int textViewResourceId, String[] strings) {
super(context, resource, textViewResourceId, strings);
// TODO Auto-generated constructor stub
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.e("MYTAG","one");
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View row = inflater.inflate(R.layout.bus_item, parent, false);
String[] items = getResources().getStringArray(R.array.HPU_Buses);
Log.e("MYTAG","two");
ImageView imglist_icon = (ImageView) row.findViewById(R.id.imglist_icon);
TextView txtlist_name = (TextView) row.findViewById(R.id.txtlist_name);
RadioButton radio_list = (RadioButton) row.findViewById(R.id.radio_list);
Log.e("MYTAG","three");
txtlist_name.setText(items[position]);
Log.e("MYTAG","four");
if (items[position].equals("Alakananda")) {
imglist_icon.setImageResource(R.drawable.alaknanda);
} else if (items[position].equals("Alakananda")) {
imglist_icon.setImageResource(R.drawable.alaknanda);
}else if (items[position].equals("Chetanya")) {
imglist_icon.setImageResource(R.drawable.chetanya);
}else if (items[position].equals("Garuda")) {
imglist_icon.setImageResource(R.drawable.garuda);
}else if (items[position].equals("Nandi")) {
imglist_icon.setImageResource(R.drawable.nandi);
}else if (items[position].equals("Neela")) {
imglist_icon.setImageResource(R.drawable.neela);
}
Log.e("MYTAG","five");
return row;
}
}
}
activity_bus_list.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".BusListActivity" >
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</ListView>
</LinearLayout>
Upvotes: 3
Views: 16708
Reputation: 788
@Override
public View getView(final int position, View convertView, ViewGroup viewGroup) {
View vi = convertView;
if (vi == null) {
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
vi = inflater.inflate(R.layout.row_search_engine, null);
}
browserImage = (ImageView) vi.findViewById(R.id.list_image);
browserType = (TextView) vi.findViewById(R.id.browswer_name);
browserType.setText(browser_names[position]);
browserImage.setImageResource(image_id[position]);
check = (RadioButton) vi.findViewById(R.id.check);
check.setChecked(position == selectedPosition);
check.setTag(position);
check.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
selectedPosition = (Integer)view.getTag();
notifyDataSetChanged();
}
});
return vi;
}
try this might help...for others facing same problem.. selectedPosition = 0 initialize this anywhere.
Upvotes: 2
Reputation: 281
You might want to take a look at my piece of work. I'm using a custom adapter as a subclass but what I did can obviously be applied to the list activity.
class FolderAdapter extends ArrayAdapter<String> { ArrayList<File> list; Context context; RadioButton selected=null; public FolderAdapter(Context context, int resource, ArrayList<File> list) { super(context, resource); this.list = list; this.context = context; } @Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.fragment_e_row, parent, false); final RadioButton rbFolder = (RadioButton) view.findViewById(R.id.rbFolder); rbFolder.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(selected != null) { selected.setChecked(false); } rbFolder.setChecked(true); selected = rbFolder; } }); rbFolder.setText(list.get(position).getName()); return view; } @Override public int getCount() { return list.size(); } }
Upvotes: 12
Reputation: 2881
The solution to your problem is to do so :
ListView l = getListView();
// because you just want a single selection
l.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
Then your listview row must implement Checkable, here is how : see here for an explanation --> ListView with CHOICE_MODE_MULTIPLE using CheckedText in a custom view
Also, your question is the same as here : How to use RadioGroup in ListView custom adapter?
Upvotes: 0