2014-02-14 60 views
3

我想製作一個自定義列表視圖。列表視圖中的每個條目都有一個imageview,一個textview和一個單選按鈕。我終於列出了名單,但現在我在選擇單選按鈕時遇到了問題。在自定義列表視圖中一次只選擇一個單選按鈕,android

我想要的是每當用戶點擊一個條目中的任何地方,那麼這應該設置相應的單選按鈕,並自動取消選擇列表中的其他單選按鈕。

這裏是我的代碼: 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> 
+1

嘗試使用'RadioGroup'只允許一次選擇項目:http://developer.android.com/intl/es/reference/android/widget/RadioGroup.html – Sonhja

+0

可能的重複[如何使用RadioGroup在ListView自定義適配器?](http://stackoverflow.com/questions/7329856/how-to-use-radiogroup-in-listview-custom-adapter) –

回答

10

你可能想看看我的工作。我使用自定義適配器作爲子類,但我所做的顯然可以應用於列表活動。

  1. 我拿了RadioButton的一個實例「選中」,並最初使其爲空。
  2. 我實現onClickListener每個在getView功能單選按鈕的
  3. 現在,我將使用「選擇」來保存被檢查
  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(); 
    } 
} 
+0

簡單的解決方案,爲我工作。 –

+0

謝謝@Ariq !!! –

1
@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初始化這個任何地方。

相關問題