我有一个自定义ListView,每行都有一个radiogroup。 当我更改选中的单选按钮时,我调用一个带有一些edittext字段的对话框(使用onCheckedChanged()方法)。但是,当我专注于编辑文本来编写某些东西时,我丢失了键盘上覆盖的所有已检查的单选按钮,并且该组返回到所选的默认选项。 有人能帮助我吗?
列出适配器
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
ContractItemHolder cih = new ContractItemHolder();
if (row == null){
LayoutInflater inflater = ((Activity)context).getLayoutInflater();
row = inflater.inflate(R.layout.row_proposals_item, parent, false);
cih.setTvItemTitle((TextView)row.findViewById(R.id.textViewItemTitle));
cih.setRgItemStatus((RadioGroup)row.findViewById(R.id.radioGroupStatus));
row.setTag(cih);
}else {
cih=(ContractItemHolder)row.getTag();
}
final ContractItem ci = list.get(position);
cih.getRgItemStatus().setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
groupSel = group;
int selected = group.getCheckedRadioButtonId();
Dialog d;
switch (selected) {
case R.id.radioAccepted:
d = createDialog(context, ACCEPTED_CODE, ci, selected);
d.show();
break;
case R.id.radioRefused:
d = createDialog(context, REFUSED_CODE, ci, selected);
d.show();
break;
default:
break;
}
}
});
cih.getTvItemTitle().setText(ci.getDescItem());
return row;
}
列出项目布局(行..)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="5dp"
android:gravity="center">
<TextView
android:id="@+id/textViewItemTitle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="Large Text"
android:layout_weight="3"
android:textAppearance="?android:attr/textAppearanceLarge"/>
<RadioGroup
android:id="@+id/radioGroupStatus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_weight="1"
android:showDividers="middle">
<RadioButton
android:id="@+id/radioNull"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Non Proposto"
android:checked="true"
android:textAppearance="?android:attr/textAppearanceLarge"/>
<RadioButton
android:id="@+id/radioPending"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="In trattativa"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="@color/Blue"/>
<RadioButton
android:id="@+id/radioAccepted"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Accettato"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="@color/Green"/>
<RadioButton
android:id="@+id/radioRefused"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Rifiutato"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="@color/Red"/>
</RadioGroup>
</LinearLayout>
Dialog impl
private Dialog createDialog(Context context, final int code, ContractItem item,final int selected){ //type: refused, accepted
d = new Dialog(context);
d.setTitle(item.getDescItem());
d.setContentView(R.layout.layout_dialog_prop);
d.getWindow().setLayout(900, LayoutParams.WRAP_CONTENT);
d.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
Button btnOK = (Button)d.findViewById(R.id.buttonPropOK);
Button btnCancel = (Button)d.findViewById(R.id.buttonPropCancel);
btnCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
d.dismiss();
}
});
btnOK.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
d.dismiss();
}
});
return d;
}
对话框布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="50dp" >
<EditText
android:id="@+id/editTextDiscount"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:ems="10"
android:hint="Sconto proposto"
android:inputType="number"
android:textAppearance="?android:attr/textAppearanceLarge" >
<requestFocus />
</EditText>
<Spinner
android:id="@+id/spinnerScuse"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:textAppearance="?android:attr/textAppearanceLarge"
android:visibility="gone" />
<EditText
android:id="@+id/editText1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="30dp"
android:ems="10"
android:gravity="top"
android:hint="Note"
android:inputType="textMultiLine"
android:textAppearance="?android:attr/textAppearanceLarge" />
</LinearLayout>
<View
android:id="@+id/view2"
android:layout_width="match_parent"
android:layout_height="2dp"
android:layout_marginTop="30dp"
android:background="@android:color/holo_blue_light" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<Button
android:id="@+id/buttonPropCancel"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@android:color/transparent"
android:text="Annulla"
android:textColor="@android:color/holo_blue_light" />
<View
android:id="@+id/view1"
android:layout_width="1dp"
android:layout_height="match_parent"
android:background="@android:color/holo_blue_light" />
<Button
android:id="@+id/buttonPropOK"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@android:color/transparent"
android:text="Ok"
android:textColor="@android:color/holo_blue_light" />
</LinearLayout>
</LinearLayout>
答案 0 :(得分:0)
您部分了解列表项视图回收过程。
ListView
组件不会为列表中的每个项生成视图。因此,在您的案例中不会有15
个。屏幕上可以容纳多少。滚动列表时,旧的项目(不再可见)将被回收。然后使用getView
调用convertView != null
,并且适配器为您提供更新此回收项视图的机会。这样做是出于性能原因 - 想象一下具有10000个项目的适配器(在商业应用程序中并不罕见)。它应该创建所有10000个列表项视图吗?想象一下滚动这样一个列表时你会有的表现......
在您的getView()
代码中,您只能部分更新项目视图 - 您始终在此行中设置项目标题:
cih.getTvItemTitle().setText(ci.getDescItem());
当创建新项目视图(即convertView == null
)时,无线电组具有默认选择,在您的情况下可能没问题。
但是,当项目视图被回收时(即convertView != null
),那么你:
在此行中设置更改侦听器:
cih.getRgItemStatus().setOnCheckedChangeListener(...);
设置项目标题:
cih.getTvItemTitle().setText(ci.getDescItem());
但是你永远不会设置被检查的无线电组项目。这意味着,它将具有最后为该项视图实例设置的值 - 不适用于该位置。您应该存储该信息 - 可能在ContractItem
,在选择无线电组项目时更新它,最后 - 在convertView != null
时检索它并将无线电组的选定项目设置为正确的值。
打开对话框时可能会看到此缺陷 - 当软键盘打开时,ListView
的可见区域会变小。这会导致ListView
删除不必要的(技术上:不再可见)项目视图。隐藏软键盘时,ListView
区域会再次变大,从而导致其创建缺少的项目视图。遗憾的是,您不保存和恢复无线电组的最后一个选定项目,因此,在创建后,新显示的项目将在无线电组中选择默认项目。