2016-03-04 86 views
1

我在radiogroup中创建了两个单选按钮的自定义列表视图。单选按钮没有被选中,而在列表视图中选择单选按钮

我的代码getter和setter文件

Item_radio.java

package com.example.customlistview_radio; 

public class Item_radio 
{ 
    public boolean isSelected_radio1; 
    public boolean isSelected_radio2; 

    public Item_radio(boolean radio1_status,boolean radio2_status) 
    { 
     this.isSelected_radio1=radio1_status; 
     this.isSelected_radio2=radio2_status; 
    } 

    public boolean isSelected_radio1() { 
     return isSelected_radio1; 
    } 
    public void setSelected_radio1(boolean isSelected_radio1) { 
     this.isSelected_radio1 = isSelected_radio1; 
    } 
    public boolean isSelected_radio2() { 
     return isSelected_radio2; 
    } 
    public void setSelected_radio2(boolean isSelected_radio2) { 
     this.isSelected_radio2 = isSelected_radio2; 
    } 
} 

MyRadioAdapter.java

package com.example.customlistview_radio; 

import java.util.ArrayList; 
import java.util.List; 

import android.app.Activity; 
import android.content.Context; 
import android.graphics.Color; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.RadioButton; 

public class MyRadioAdapter extends BaseAdapter 
{ 
    Context context; 
    List<Item_radio> radioList; 
    public MyRadioAdapter(Context context,List<Item_radio> radiolist) 
    { 
     this.context=context; 
     this.radioList=new ArrayList<Item_radio>(); 
     this.radioList.addAll(radiolist); 
    } 

    @Override 
    public int getCount() { 
     return radioList.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return radioList.get(position); 
    } 

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

    public static class ViewHolder 
    { 
     RadioButton radio_button1; 
     RadioButton radio_button2; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     final ViewHolder holder; 
     View view = convertView; 

     if(view==null) 
     { 
      LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
      view = inflater.inflate(R.layout.list_item, parent, false); 
      holder = new ViewHolder(); 

      holder.radio_button1=(RadioButton)view.findViewById(R.id.my_radio_but1); 
      holder.radio_button2=(RadioButton)view.findViewById(R.id.my_radio_but2); 

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

     if (position % 2 == 1) 
     { 
      view.setBackgroundColor(Color.CYAN); 
     } 
     else 
     { 
      view.setBackgroundColor(Color.WHITE); 
     } 

     final Item_radio radio = (Item_radio) getItem(position); 
     holder.radio_button1.setChecked(radio.isSelected_radio1()); 
     holder.radio_button2.setChecked(radio.isSelected_radio2()); 

     holder.radio_button1.setOnClickListener(new OnClickListener() 
     { 

      @Override 
      public void onClick(View v) 
      { 

       Log.e("button1","Clicked:button1"); 
       RadioButton rb=(RadioButton)v; 
       radio.setSelected_radio1(rb.isChecked()); 
       Log.e("button1","Clicked:button1:"+rb.isChecked()); 
      } 
     }); 
     holder.radio_button2.setOnClickListener(new OnClickListener() 
     { 

      @Override 
      public void onClick(View v) 
      {  
       RadioButton rb=(RadioButton)v; 
       Log.e("button2","Clicked:button2"+rb.isChecked()); 
       radio.setSelected_radio2(rb.isChecked()); 
      } 
     }); 
     return view; 
    } 

} 

MainActivity.java

package com.example.customlistview_radio; 


import java.util.ArrayList; 
import java.util.List; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.Button; 
import android.widget.ListView; 

public class MainActivity extends Activity 

{ 

    ListView mylist; 
    Button submit_but; 

    ArrayList<Item_radio> radio_list; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mylist=(ListView)findViewById(R.id.mylist_demo); 
     submit_but=(Button)findViewById(R.id.submit_but); 


     radio_list=new ArrayList<Item_radio>(); 

     for(int i=0;i<20;i++) 
     { 
      radio_list.add(new Item_radio(false,false)); 
     } 

     mylist.setAdapter(new MyRadioAdapter(MainActivity.this, radio_list)); 
    } 
} 

list_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/RelativeLayout1" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <RadioGroup 
     android:id="@+id/my_radio_group" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     > 

     <RadioButton 
      android:id="@+id/my_radio_but1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="radio1" /> 

     <RadioButton 
      android:id="@+id/my_radio_but2" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="radio2" /> 
    </RadioGroup> 

</RelativeLayout> 

activity_main.xml中

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/LinearLayout1" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    tools:context="com.example.customlistview_radio.MainActivity" > 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/hello_world" 
     /> 

    <ListView 
     android:id="@+id/mylist_demo" 
     android:layout_width="match_parent" 
     android:layout_height="fill_parent" 
     android:choiceMode="singleChoice" 
     tools:listitem="@layout/list_item" 
     android:layout_weight="0.3" > 
    </ListView> 

    <Button 
     android:id="@+id/submit_but" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:text="submit" 
     android:layout_weight="1.5"/> 

</LinearLayout> 

在选择一些单选按钮被选择在列表中排单选按钮。

如果我滚动列表视图并选择最后5或6项之间的单选按钮,它将不会被选中。

问题

这是假设无线电按钮1没有被选择的话,我选择radiobutton2它被选中之后radiobutton1选择

我logcat的

03-04 10:22:17.221: E/button2(4665): Clicked:button2true 
03-04 10:22:20.201: E/button2(4665): Clicked:button2true 
03-04 10:22:21.221: E/button2(4665): Clicked:button2true 
03-04 10:22:22.101: E/button2(4665): Clicked:button2true 
03-04 10:22:23.711: E/button2(4665): Clicked:button2true 
03-04 10:22:24.671: E/button2(4665): Clicked:button2true 
03-04 10:22:25.711: E/button2(4665): Clicked:button2true 
03-04 10:22:40.770: E/button2(4665): Clicked:button2true 
03-04 10:22:42.371: E/button2(4665): Clicked:button2false 
03-04 10:22:52.271: E/button2(4665): Clicked:button2false 

请参阅我的要价较高的前8行正常工作。 当我点击第9行的单选按钮2没有被选中时,打印检查状态为false,但是我选择了按钮,并且选中的外观在未选定模式下仍未更改。

我做错了什么? 请帮我解决问题。 谢谢...

回答

0

工程之一和某个时候不一样做后,这一切都因为你的代码的其余部分之前使用setChecked。所以我可以建议你只是删除这些行

holder.radio_button1.setChecked(radio.isSelected_radio1()); 
    holder.radio_button2.setChecked(radio.isSelected_radio2()); 

UPDATE:如果这损害了您的列表,然后执行以下操作

只是扭转你的逻辑在这里,设置radio_1之后检查,设置radio_2未被选中。你的代码看起来像这样

holder.radio_button1.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      Log.e("button1", "Clicked:button1"); 
      RadioButton rb = (RadioButton) v; 

      radio.setSelected_radio1(rb.isChecked()); 
      radio.setSelected_radio2(!rb.isSelected()); 
      Log.e("button1", "Clicked:button1:" + rb.isChecked()); 
     } 
    }); 
    holder.radio_button2.setOnClickListener(new View.OnClickListener() 
    { 

     @Override 
     public void onClick(View v) 
     { 
      RadioButton rb=(RadioButton)v; 
      Log.e("button2","Clicked:button2"+rb.isChecked()); 
      radio.setSelected_radio2(rb.isChecked()); 
      radio.setSelected_radio1(!rb.isSelected()); 
     } 
    }); 

更新2

不管目前发生的一切都是因为你的观点被回收,你可以使用的最后一个选项是,删除此if(view==null)条件和配套else条款与它的代码也是如此。

+0

感谢您的回答@Shree克里希纳。我尝试你的建议。如果我这样做,当我滚动列表视图列表视图中的单选按钮自动被选中。 – Asha

+0

@Asha我更新了我的答案,看看。如果发生任何错误,请留下评论。我目前正在明天休假。一天后我会抓住这个。对不起,但..我认为最后的选择将解决你的问题,你的代码是好的。 –

+0

谢谢@Shree克里希纳在最后,当我删除if和else条件**时,所有行中的单选按钮被选中。但现在我面临滚动问题。我会尝试修复滚动问题。谢谢... – Asha

0

你需要稍微改变你的代码。

第1步:

在适配器这样

HashMap<Integer,Integer> selectedItems = new HashMap<Integer, Integer>(); 

第2步创建的HashMap: 和getView内添加以下

if (selectedItems.get(position) != null) { 
       holder.radio_button1.setChecked(radio.isSelected_radio1()); selectedItems.get(position)); 
      } 

步骤3: 里面的你单选按钮添加以下内容

selectedItems.put(position, your_value); 

注意:

这里your_value是0或1。如果1表示单选按钮选择0表示不选。

试试这个让我知道你是否面临任何问题。

我只为单选按钮1添加了这个选项。先试试这个。如果它是工作然后修改您的单选按钮2

编辑1:

你为什么不尝试用radioGroup中像下面?????

rg.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(RadioGroup group, int checkedId) { 
Log.d("chk", "id" + checkedId); 



      } 

     }); 
+0

感谢您的回答。但问题仍然存在。了解我的问题单选按钮没有被选中,而我选择radiobutton1或radiobutton2 – Asha

+0

真正的问题是每当你滚动你的列表视图得到回收。这是问题的原因。所以你需要保存每一行选择的值。我希望你明白 – Amsheer

+0

我明白,获得回收的观点是主要问题。根据你的建议,如果我想保存选定的行值,首先选择单选按钮。我的问题是在这里按钮没有被选中,而我检查单选按钮。 – Asha