当我们滚动列表时,自定义列表视图中的 Android 单选按钮会更改其状态 [英] Android Radio buttons in a custom listview changes its state when we scroll the list

查看:14
本文介绍了当我们滚动列表时,自定义列表视图中的 Android 单选按钮会更改其状态的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是一个初学者,面临一个问题,我正在创建一个带有两个 RadioButton 和一个 TextViewListView.一切都很好,但是当我设置 RadioButton 并滚动它时,以前的 RadioButton 的值会改变它们的值或显着失去它们的状态.我试图解决这个问题很长时间.我应该做出哪些改变来克服这个问题?

I am a beginner and facing a problem where I am creating a ListView with two RadioButtons and a TextView. Everything goes fine, but when I set RadioButtons and scroll it, the values of previous RadioButtons change their values or lose their state dramatically. I am trying to solve this problem for long time. What changes should I make to overcome this problem?

MainActivity.java

MainActivity.java

public class MainActivity extends Activity {

     private ListView listView1;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            Option weather_data[] = new Option[]
                    {
                        new Option("Heading1"),
                        new Option("Heading12"),
                        new Option("Heading3"),
                        new Option("Heading4"),
                        new Option("Heading5"),
                        new Option("Heading6"),
                        new Option("Heading7"),
                        new Option("Heading8"),
                        new Option("Heading9"),
                        new Option("Heading10")
                    };
            RadioGroupAdapter adapter = new RadioGroupAdapter(this, 
                            R.layout.listitem, weather_data);
                    listView1 = (ListView)findViewById(R.id.list);
                    listView1.setAdapter(adapter);
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.activity_main, menu);
            return true;
        }
    }

Option.java

Option.java

public class Option {
     public String title;
        public Option(){
            super();
        }

        public Option( String title) {
            super();
            this.title = title;
        }
    }

RadioGroupAdapter.java

RadioGroupAdapter.java

public class RadioGroupAdapter extends ArrayAdapter<Option> {

    Context context;
    int layoutResourceId;
    Option data[] = null;

    public RadioGroupAdapter(Context context, int layoutResourceId,
            Option[] data) {
        super(context, layoutResourceId, data);
        this.layoutResourceId = layoutResourceId;
        this.context = context;
        this.data = data;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        MatrixHolder holder = null;

        if (row == null) {
            LayoutInflater inflater = ((Activity) context).getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);

            holder = new MatrixHolder();
            holder.txtTitle = (TextView) row.findViewById(R.id.heading);
            holder.group = (RadioGroup) row.findViewById(R.id.radio_group1);
            final RadioButton[] rb = new RadioButton[2];
            for(int i=0; i<2; i++){
                rb[i]  = new RadioButton(context);
                //rb[i].setButtonDrawable(R.drawable.single_radio_chice);
                rb[i].setId(i);
                RadioGroup.LayoutParams params = new RadioGroup.LayoutParams(
                        0, LayoutParams.WRAP_CONTENT);
                params.weight=1.0f;
                params.setMargins(5, 0, 5, 10);
                holder.group.addView(rb[i],params); //the RadioButtons are added to the radioGroup instead of the layout
            }
            row.setTag(holder);
        } else {
            holder = (MatrixHolder) row.getTag();
        }

        Option option = data[position];
        holder.txtTitle.setText(option.title);
        return row;
    }

    static class MatrixHolder {
        TextView txtTitle;
        RadioGroup group;
        int position;
    }
}

listitem.xml

listitem.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"
    android:weightSum="100" >

    <TextView
        android:id="@+id/heading"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_gravity="left"
        android:padding="10dp"
        android:textSize="18sp"
        android:textStyle="bold"
        android:layout_weight="50" />

    <RadioGroup
        android:id="@+id/radio_group1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical|center_horizontal"
        android:orientation="horizontal"
        android:layout_weight="50" >
    </RadioGroup>

</LinearLayout>

推荐答案

需要为每个item保存RadioButton的状态,所以在滚动的时候首先在 getView() 方法中检查每个 RadioButton 的状态.

You need to save the state of RadioButton for each item, so while scrolling in getView() method first it will check the state of each RadioButton.

Step1:- 你需要创建一个 Pojo 类(Setter & Getter) 来保存 RadioButton 的状态.

Step1:- You need to create a Pojo class(Setter & Getter) for saving the state of RadioButton.

更多详情请点击以下链接

For more details go through the below link

http://amitandroid.blogspot.in/2013/03/android-listview-with-checkbox-and.html

这个例子是一个带有 CheckBox 的 ListView,你需要根据你的要求把它改成 RadioButton.

This example is a ListView with CheckBox you need to change it to RadioButton according to your requirement.

这篇关于当我们滚动列表时,自定义列表视图中的 Android 单选按钮会更改其状态的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆