2013-04-18 31 views
5

Tôi đã tìm kiếm nhiều lần câu hỏi, có rất nhiều câu hỏi tôi đã tìm thấy trong stackoverflow nhưng tôi không đưa ra giải pháp. Đây là vấn đề của tôi. Tôi có một danh sách các mục trong linearlayout như sau: enter image description hereChỉ chọn một nút radio từ listview

Khi màn hình đến trước, nút radion cuối cùng được chọn tự động. Nhưng nếu tôi chọn một nút radio khác, nút radio cuối cùng đã ở trạng thái đã chọn. Tôi muốn chọn chỉ có một nút radion nhưng đồng thời khi màn hình đến trước, nút radio cuối cùng sẽ được tự động chọn và tự động sẽ không được chọn. Làm cách nào để đạt được điều này. lớp bộ chuyển đổi của tôi là:

public class AdapterPaymentMethod extends ArrayAdapter<PaymentData> { 
    private Context context; 
    private boolean userSelected = false; 
    ViewHolder holder; 

    public AdapterPaymentMethod(Context context, int resource, 
      List<PaymentData> items) { 
     super(context, resource, items); 
     this.context = context; 
    } 

    /* private view holder class */ 
    private class ViewHolder { 
     RadioButton radioBtn; 
     Button btPaymentMethod; 
     // ImageView ivLine; 
    } 

    public View getView(final int position, View convertView, ViewGroup parent) { 
     holder = null; 
     PaymentData rowItem = getItem(position); 
     LayoutInflater mInflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     if (convertView == null) { 
      convertView = mInflater.inflate(
        com.android.paypal.homeactivity.R.layout.list_item, null); 
      holder = new ViewHolder(); 
      holder.radioBtn = (RadioButton) convertView 
        .findViewById(com.android.paypal.homeactivity.R.id.rdb_payment_method); 
      holder.btPaymentMethod = (Button) convertView 
        .findViewById(com.android.paypal.homeactivity.R.id.bt_item_event); 
      convertView.setTag(holder); 
     } else 
      holder = (ViewHolder) convertView.getTag(); 

     if(position==getCount()-1 && userSelected==false){ 
      holder.radioBtn.setChecked(true); 
     Log.d("if position", ""+position); 
     } 
     else{ 
      holder.radioBtn.setChecked(false); 
      Log.d("else position", ""+position); 
     } 

     holder.radioBtn.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       userSelected=true; 
       if(getCount()-1==position&&userSelected==true){   
       } 
       else if(getCount()-2==position&&userSelected==true) 
       { 
        holder.radioBtn.setChecked(true); 
       } 
      } 
     }); 



     holder.radioBtn.setText(rowItem.getRdbText()); 
     holder.btPaymentMethod.setText(rowItem.getBtText()); 
     return convertView; 
    } 
} 
+0

im cũng bị mắc kẹt trên các vấn đề cùng u có thể giúp tôi, nhưng trong hộp kiểm –

Trả lời

13

Giữ hiện kiểm tra RadioButton trong một biến trong Activity của bạn. Trong OnClickListener của RadioButtons bạn làm điều này:

// checks if we already have a checked radiobutton. If we don't, we can assume that 
// the user clicked the current one to check it, so we can remember it. 
if(mCurrentlyCheckedRB == null) 
    mCurrentlyCheckedRB = (RadioButton) v; 
    mCurrentlyCheckedRB.setChecked(true); 
} 

// If the user clicks on a RadioButton that we've already stored as being checked, we 
// don't want to do anything.  
if(mCurrentlyCheckedRB == v) 
    return; 

// Otherwise, uncheck the currently checked RadioButton, check the newly checked 
// RadioButton, and store it for future reference. 
mCurrentlyCheckedRB.setChecked(false); 
((RadioButton)v).setChecked(true); 
mCurrentlyCheckedRB = (RadioButton)v; 
+0

Giải pháp của bạn hoạt động tốt. Bạn có thể giải thích mã của bạn không. Tôi không hiểu mã của bạn. Tôi là người mới. Cảm ơn. – androidcodehunter

+1

Tôi đã thêm một số nhận xét để giải thích. Nếu điều này phù hợp với bạn, vui lòng đặt câu trả lời là được chấp nhận! – Catherine

+1

Cảm ơn bạn đã giải thích. Tôi thích nó. – androidcodehunter

5

Dưới đây là mã của tôi:

ListAdapter.java

public class ListAdapter extends BaseAdapter { 

    private Context context; 
    private String[] version; 
    private LayoutInflater inflater; 
    private RadioButton selected = null; 

    public ListAdapter(Context context, String[] version) { 
     this.context = context; 
     this.version = version; 
     inflater = LayoutInflater.from(context); 
    } 

    @Override 
    public int getCount() { 
     return version.length; 
    } 

    @Override 
    public Object getItem(int position) { 
     return version; 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(final int position, View view, ViewGroup viewGroup) { 

     final Holder holder; 
     if (view == null) { 
      holder = new Holder(); 
      view = inflater.inflate(R.layout.row_list, null); 

      holder.radioButton = (RadioButton) view.findViewById(R.id.radio1); 
      holder.textViewVersion = (TextView) view.findViewById(R.id.textView1); 
      holder.btnMore = (Button) view.findViewById(R.id.button1); 

      view.setTag(holder); 
     } else { 
      holder = (Holder) view.getTag(); 
     } 

     holder.textViewVersion.setText(version[position]); 

     //by default last radio button selected 
     if (position == getCount() - 1) { 
      if (selected == null) { 
       holder.radioButton.setChecked(true); 
       selected = holder.radioButton; 
      } 
     } 

     holder.radioButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       if (selected != null) { 
        selected.setChecked(false); 
       } 
       holder.radioButton.setChecked(true); 
       selected = holder.radioButton; 
      } 
     });  
    } 

    private class Holder { 
     private RadioButton radioButton; 
     private TextView textViewVersion; 
     private Button btnMore; 
    } 
} 

Hy vọng điều này sẽ giúp bạn :)

+0

Cảm ơn bạn .. bạn là người tiết kiệm cuộc sống !! :) –

0

Hãy thử hack này.

Trong bố cục, việc này sẽ thay đổi.

<RadioButton 
    android:id="@+id/radio" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center_vertical" 
    **android:clickable="false" 
    android:focusable="false"** 
/> 

Trong Adaptor của bạn chỉ cần thêm những dòng này:

private int selectedPosition = -1; 

viewHolder.choiceButton = (RadioButton)convertView.findViewById(R.id.radio); 

if(selectedPosition == -1) { 
    viewHolder.choiceButton.setChecked(position==getCount()-1); 
} 
else{ 
    viewHolder.choiceButton.setChecked(selectedPosition == position); 
} 

Trong getView() gán selectedPosition:

viewHolder.clickLayout.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       selectedPosition = (int) view.getTag(); 
       notifyDataSetChanged(); 
      } 
     }); 
+0

Mã này không hoạt động. Nhiều nút radio được chọn. –

+1

Bạn đã chỉ định vị trí đã chọn trên bố cục nhấp chuột bằng cách sử dụng getTag()? –