Android 每行中都有RadioGroup的ListView
上面显示的是我的自定义listview和TextView和RadioGroup。根据项目状态是“待定”还是“已送达”,我更新待定项目文本视图(红色,顶部)。 一切都按预期进行,我能够在滚动中保留RadioGroup选项 但是,当我滚动时,pending Items TextView不会保留其值。只要列表滚动,它就会改变。这是我的getView方法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)
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;
}
}
}