【问题标题】:Select only one radio button at a time in custom list view, android在自定义列表视图中一次只选择一个单选按钮,android
【发布时间】:2014-03-13 22:10:40
【问题描述】:

我正在尝试制作自定义列表视图。列表视图中的每个条目都有一个图像视图、一个文本视图和一个单选按钮。我终于列出了列表,但现在我在选择单选按钮时遇到了问题。

我想要的是每当用户点击条目中的任意位置时,这应该设置相应的单选按钮并自动取消选择列表中的其他单选按钮。

这是我的代码: 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>

【问题讨论】:

标签: android listview


【解决方案1】:

您的问题的解决方案是这样做:

ListView l = getListView();
// because you just want a single selection
l.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

那么你的 listview 行必须实现 Checkable,这里是如何实现的:见这里解释 --> ListView with CHOICE_MODE_MULTIPLE using CheckedText in a custom view

另外,你的问题和这里一样:How to use RadioGroup in ListView custom adapter?

【讨论】:

    【解决方案2】:

    你可能想看看我的作品。我使用自定义适配器作为子类,但我所做的显然可以应用于列表活动。

    1. 我将 RadioButton 的一个实例设为“已选择”,最初将其设为 null。
    2. 我在 getView 函数中的每个单选按钮上实现了 onClickListener
    3. 现在我将使用“selected”来保存选中的“last”单选按钮的引用
    4. 然后我只需取消选中上一个单选按钮并选中当前单选按钮
    5. 另外不要忘记使用“已选择”来保存刚刚选中的此单选按钮的引用
    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();
        }
    }
    

    【讨论】:

      【解决方案3】:
      @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;
      }
      

      尝试这可能会有所帮助...对于其他面临相同问题的人.. selectedPosition = 0 在任何地方初始化它。

      【讨论】:

        猜你喜欢
        • 2013-02-22
        • 1970-01-01
        • 2018-01-03
        • 2012-04-23
        • 2017-06-28
        • 2019-02-16
        • 2014-02-16
        • 2013-04-12
        • 2015-04-21
        相关资源
        最近更新 更多