上面显示的是我使用TextViews和RadioGroup的自定义列表视图。根据项目状态是“待处理”还是“提供”,我更新待处理项目 - TextView(红色,顶部)。 一切都按预期工作,我能够在滚动时保留RadioGroup选择。
但是,当我滚动时,挂起的项目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;
}
答案 0 :(得分:5)
我的Activity
包含TextView
和ListView
。 ListView填充了20个对象(RowObject),它们有自己的布局(row.xml)。代码非常简单,因此您可以轻松阅读并理解它。
<强> activity_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>
<强> row.xml 强>
<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>
<强> RowObject 强>
public class RowObject {
private int ID;
private boolean firstChecked; // else second checked
public RowObject(int iD, boolean firstChecked) {
super();
ID = iD;
this.firstChecked = firstChecked;
}
public boolean isFirstChecked() {
return firstChecked;
}
public void setFirstChecked(boolean firstChecked) {
this.firstChecked = firstChecked;
}
}
<强> MainActivity 强>
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;
}
}
}
答案 1 :(得分:3)
我想我明白了。无论何时滚动,都可以使用
更改值或单选按钮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;
}
});
希望这会对你有所帮助。