Rakesh
Rakesh

Reputation: 1133

Select only one radio button at a time in custom list view, android

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

Answers (3)

Akshay Shah
Akshay Shah

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

Ariq
Ariq

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.

  1. I took an instance of RadioButton "selected" and initially made it null.
  2. I implemented onClickListener on each of the radio buttons in getView function
  3. Now I'll use "selected" to hold the reference of the "last" radio button that was checked
  4. Then I simply uncheck the previous radio button and check the current one
  5. Also don't forget to use "selected" to hold the reference of this radio button which was just checked
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

Laurent Meyer
Laurent Meyer

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

Related Questions