Android 每行中都有RadioGroup的ListView

Android 每行中都有RadioGroup的ListView,android,android-listview,textview,radio-group,Android,Android Listview,Textview,Radio Group,上面显示的是我的自定义listview和TextView和RadioGroup。根据项目状态是“待定”还是“已送达”,我更新待定项目文本视图(红色,顶部)。 一切都按预期进行,我能够在滚动中保留RadioGroup选项 但是,当我滚动时,pending Items TextView不会保留其值。只要列表滚动,它就会改变。这是我的getView方法 public View getView(final int position, View convertView, ViewGroup parent)

上面显示的是我的自定义listview和TextView和RadioGroup。根据项目状态是“待定”还是“已送达”,我更新待定项目文本视图(红色,顶部)。 一切都按预期进行,我能够在滚动中保留RadioGroup选项

但是,当我滚动时,pending Items TextView不会保留其值。只要列表滚动,它就会改变。这是我的getView方法

public View getView(final int position, View convertView, ViewGroup parent) 
{
    System.out.println(" --- position ---"+position+" --- isChecked[position] --- "+isChecked[position]);

    ViewHolder viewHolder = null;
    if(convertView == null)
    {

        convertView = layoutInflater.inflate(R.layout.order_status_listview_row, null);
        viewHolder = new ViewHolder();
        convertView.setTag(viewHolder);
    }
    else
    {
        viewHolder = (ViewHolder)convertView.getTag();
        convertView.setTag(viewHolder);
    }

    viewHolder.itemName = (TextView)convertView.findViewById(R.id.textview_order_status_item_name);
    viewHolder.itemQuantity = (TextView)convertView.findViewById(R.id.textview_order_status_item_quantity);
    viewHolder.radioGroup = (RadioGroup)convertView.findViewById(R.id.radiogroup_order_status_dialog);

//      isUserChanged[position] = false;
    viewHolder.radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() 
    {           
        public void onCheckedChanged(RadioGroup group, int checkedId) 
        {
 //             if(isUserChanged[position])
            {
                switch(checkedId) 
                {
                    case R.id.radiobutton_served:
                         System.out.println(" --- radiobutton_served ---"+" position "+position+" isChecked[position] "+isChecked[position]);
                         count--;
 //                          countView.setText(DataHelper.getAppropriateCountValue(count));
                         isChecked[position] = true;
                         break;

                    case R.id.radiobutton_pending:
                         System.out.println(" --- radiobutton_pending ---"+" position "+position+" isChecked[position] "+isChecked[position]);
                         isChecked[position] = false;
                         count++;
 //                          countView.setText(DataHelper.getAppropriateCountValue(count));
                         break;             
                }
                countView.setText(DataHelper.getAppropriateCountValue(count));

            }
 //             isUserChanged[position] = false;
        }
    });

    viewHolder.radioGroup.setOnClickListener(new OnClickListener() 
    {
        public void onClick(View view) 
        {
 //             isUserChanged[position] = true;
        }
    }); 

    viewHolder.itemName.setText(orderList.get(position).getDishName());
    viewHolder.itemQuantity.setText(orderList.get(position).getDishQuantity());

    // change selection state for item checked when selection for radioButton changes
    if(isChecked[position])
        viewHolder.radioGroup.check(R.id.radiobutton_served);
    else
        viewHolder.radioGroup.check(R.id.radiobutton_pending);

    return convertView;
}

我想我明白了。每当您滚动时,您都可以用鼠标更改值或单选按钮

if(isChecked[position])
    viewHolder.radioGroup.check(R.id.radiobutton_served);
else
    viewHolder.radioGroup.check(R.id.radiobutton_pending);
但是你在调用之前设置了一个侦听器。因此,每次都会调用侦听器

请尝试以下方法:

viewHolder.radioGroup.setOnCheckedChangeListener(null);

if(isChecked[position])
    viewHolder.radioGroup.check(R.id.radiobutton_served);
else
    viewHolder.radioGroup.check(R.id.radiobutton_pending);

viewHolder.radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() 
    {           
        public void onCheckedChanged(RadioGroup group, int checkedId) 
        {
 //             if(isUserChanged[position])
            {
                switch(checkedId) 
                {
                    case R.id.radiobutton_served:
                         System.out.println(" --- radiobutton_served ---"+" position "+position+" isChecked[position] "+isChecked[position]);
                         count--;
 //                          countView.setText(DataHelper.getAppropriateCountValue(count));
                         isChecked[position] = true;
                         break;

                    case R.id.radiobutton_pending:
                         System.out.println(" --- radiobutton_pending ---"+" position "+position+" isChecked[position] "+isChecked[position]);
                         isChecked[position] = false;
                         count++;
 //                          countView.setText(DataHelper.getAppropriateCountValue(count));
                         break;             
                }
                countView.setText(DataHelper.getAppropriateCountValue(count));

            }
 //             isUserChanged[position] = false;
        }
    });

希望这能对你有所帮助。

Dya,我举了一个小例子

我的
活动
包含
文本视图
列表视图
。ListView中有20个对象(RowObject),它们有自己的布局(row.xml)。代码非常简单,因此您在阅读和理解它时不会遇到任何问题

活动\u main.xml

<RelativeLayout 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" >

    <TextView
        android:id="@+id/mTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="0" />

    <ListView
        android:id="@+id/mListView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/mTextView" >
    </ListView>

</RelativeLayout>
<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" >

    <RadioGroup
        android:id="@+id/mRadioGroup"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

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

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

</LinearLayout>
main活动

public class MainActivity extends Activity {

    private TextView mCountTextView;
    private ArrayList<RowObject> mSource;

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

        mSource = new ArrayList<RowObject>();
        for (int i = 0; i < 20; i++) {
            mSource.add(new RowObject(i, false));
        }

        mCountTextView = (TextView) findViewById(R.id.mTextView);

        ListView mListView = (ListView) findViewById(R.id.mListView);
        mListView.setAdapter(new RadioButtonAdapter(getApplicationContext(), mSource));
    }

    private class RadioButtonAdapter extends ArrayAdapter<RowObject> {

        class ViewHolder {
            RadioGroup rbGroup;
            RadioButton btn1;
            RadioButton btn2;
        }

        private LayoutInflater mInflater;

        public RadioButtonAdapter(Context context, ArrayList<RowObject> mSource) {
            super(context, R.layout.row, mSource);
            mInflater = LayoutInflater.from(context);
        }

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

            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.row, null);

                holder = new ViewHolder();
                holder.rbGroup = (RadioGroup) convertView.findViewById(R.id.mRadioGroup);
                holder.btn1 = (RadioButton) convertView.findViewById(R.id.mRadio1);

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

            holder.rbGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() {

                public void onCheckedChanged(RadioGroup group, int checkedId) {
                    switch (checkedId) {
                    case R.id.mRadio1:
                        mSource.get(position).setFirstChecked(true);
                        break;

                    case R.id.mRadio2:
                        mSource.get(position).setFirstChecked(false);
                        break;
                    }
                    mCountTextView.setText("There are " + getNumberOfFirstCheckedViews() + " first buttons selected");
                }
            });

            if (mSource.get(position).isFirstChecked()) {
                holder.btn1.setChecked(true);
                holder.btn2.setChecked(false);
            } else {
                holder.btn1.setChecked(false);
                holder.btn2.setChecked(true);
            }

            return convertView;
        }

        private int getNumberOfFirstCheckedViews() {
            int count = 0;
            for (RowObject object : mSource) {
                if (object.isFirstChecked()) {
                    count++;
                }
            }
            return count;
        }
    }
}
公共类MainActivity扩展活动{
私有文本视图mCountTextView;
私有arraylistmsource;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSource=newarraylist();
对于(int i=0;i<20;i++){
添加(新的RowObject(i,false));
}
mCountTextView=(TextView)findViewById(R.id.mTextView);
ListView mListView=(ListView)findViewById(R.id.mListView);
setAdapter(新的RadioButtonAdapter(getApplicationContext(),mSource));
}
私有类RadioButtonAdapter扩展了ArrayAdapter{
类视图持有者{
放射组RB组;
无线按钮btn1;
无线按钮btn2;
}
私人停车场;
公共RadioButtonAdapter(上下文,ArrayList mSource){
super(context,R.layout.row,mSource);
mInflater=LayoutInflater.from(上下文);
}
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
视窗座;
if(convertView==null){
convertView=mInflater.充气(R.layout.row,空);
holder=新的ViewHolder();
holder.rbGroup=(RadioGroup)convertView.findViewById(R.id.mRadioGroup);
holder.btn1=(单选按钮)convertView.findViewById(R.id.mRadio1);
convertView.setTag(支架);
}否则{
holder=(ViewHolder)convertView.getTag();
}
holder.rbGroup.setOnCheckedChangeListener(新的OnCheckedChangeListener(){
检查更改后的公共无效(RadioGroup组,int checkedId){
开关(检查EDID){
案例R.id.mRadio1:
mSource.get(position).setFirstChecked(true);
打破
案例R.id.mRadio2:
mSource.get(position).setFirstChecked(false);
打破
}
mCountTextView.setText(“选择了“+getNumberOfFirstCheckedViews()+”第一个按钮”);
}
});
if(mSource.get(position.isFirstChecked()){
保持架.btn1.设置已检查(正确);
持有者.btn2.setChecked(假);
}否则{
保持架.btn1.设置已检查(假);
holder.btn2.setChecked(真);
}
返回视图;
}
私有int getNumberOfFirstCheckedViews(){
整数计数=0;
for(RowObject对象:mSource){
if(object.isFirstChecked()){
计数++;
}
}
返回计数;
}
}
}

请将findViewById方法放入if(convertView==null)中,否则您的viewHolder就没用了。@PareshMayani它不是重复的。我已经解决了该链接中提到的问题。@CFlex完成,谢谢!但是这个问题中提到的问题是什么?尽量不要使用viewHolder.radioGroup.check(R.id.radiobutton_);但将单选按钮保存在viewholder中,然后保存viewholder.radiobutton1.setchecked(true);或者类似的事情。我发布了一个答案,忽略我的评论:pCFlex的解决方案成功了。非常感谢您的时间,不过Martijn:)很好,@DroidBender当我选中任何单选按钮时,我想打开或切换另一个活动,以便在哪里设置onclicklistener?请尽可能地帮助我当我尝试设置适配器并单击一个单选按钮时,这很好,但问题是当我滚动listview时,它会在每10行滚动一次后自动调用。我不知道这么小的事情会解决这个问题!你给了我一个我花了两天时间解决的问题的解决方案!非常感谢:)
public class MainActivity extends Activity {

    private TextView mCountTextView;
    private ArrayList<RowObject> mSource;

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

        mSource = new ArrayList<RowObject>();
        for (int i = 0; i < 20; i++) {
            mSource.add(new RowObject(i, false));
        }

        mCountTextView = (TextView) findViewById(R.id.mTextView);

        ListView mListView = (ListView) findViewById(R.id.mListView);
        mListView.setAdapter(new RadioButtonAdapter(getApplicationContext(), mSource));
    }

    private class RadioButtonAdapter extends ArrayAdapter<RowObject> {

        class ViewHolder {
            RadioGroup rbGroup;
            RadioButton btn1;
            RadioButton btn2;
        }

        private LayoutInflater mInflater;

        public RadioButtonAdapter(Context context, ArrayList<RowObject> mSource) {
            super(context, R.layout.row, mSource);
            mInflater = LayoutInflater.from(context);
        }

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

            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.row, null);

                holder = new ViewHolder();
                holder.rbGroup = (RadioGroup) convertView.findViewById(R.id.mRadioGroup);
                holder.btn1 = (RadioButton) convertView.findViewById(R.id.mRadio1);

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

            holder.rbGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() {

                public void onCheckedChanged(RadioGroup group, int checkedId) {
                    switch (checkedId) {
                    case R.id.mRadio1:
                        mSource.get(position).setFirstChecked(true);
                        break;

                    case R.id.mRadio2:
                        mSource.get(position).setFirstChecked(false);
                        break;
                    }
                    mCountTextView.setText("There are " + getNumberOfFirstCheckedViews() + " first buttons selected");
                }
            });

            if (mSource.get(position).isFirstChecked()) {
                holder.btn1.setChecked(true);
                holder.btn2.setChecked(false);
            } else {
                holder.btn1.setChecked(false);
                holder.btn2.setChecked(true);
            }

            return convertView;
        }

        private int getNumberOfFirstCheckedViews() {
            int count = 0;
            for (RowObject object : mSource) {
                if (object.isFirstChecked()) {
                    count++;
                }
            }
            return count;
        }
    }
}