【发布时间】:2016-10-07 15:48:44
【问题描述】:
我正在开发一个应用程序,它使用检查列表来通知车辆的状态。
我正在为 ListView 使用一个自定义 Adater,其中包含一个 TextView 和两个复选框。
复选框用于指示特性是否符合修订。
实际上列表有七个项目但在手机中只显示六个,因为布局大小,问题不在这里。问题是 ListView 中 View 的重用,当检查第一个或第二个位置时,当我滚动到第六个和第七个位置时也会检查它们,但是 TextView 的文本显示正确。
我已经阅读了这些问题,但我现在不知道该怎么做:
Duplicated entries in ListView
TextView in listview rows showing repeated values on scroll in Android?
List items position repeating in getview
Android Listview row repeating item <--- this question show my problem
The code:
列表适配器:
public class ListAdapter extends ArrayAdapter<String> {
Context context;
int layoutResourceId;
String data[] = null;
LayoutInflater inflater;
boolean[] cumpleCheckboxState;
boolean[] noCumpleCheckboxState;
public ListAdapter(Context context, int layoutResourceId,
String[] data) {
super(context, layoutResourceId, data);
this.layoutResourceId = layoutResourceId;
this.context = context;
this.data = data;
cumpleCheckboxState = new boolean[data.length];
noCumpleCheckboxState = new boolean[data.length];
}
@Override
public View getView(final int position, final View convertView, ViewGroup parent) {
View row = convertView;
final MatrixHolder holder;
if (row == null) {
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
holder = new MatrixHolder();
holder.txtTitle = (TextView) row.findViewById(R.id.headingitem);
holder.cumpleCheckbox = (CheckBox) row.findViewById(R.id.cumple);
holder.noCumpleCheckbox = (CheckBox) row.findViewById(R.id.noCumple);
holder.cumpleCheckbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Log.e("Position","Nro.: " + position + " " + isChecked);
cumpleCheckboxState[position] = isChecked;
}
});
holder.noCumpleCheckbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Log.e("Position","Nro.: " + position + " " + isChecked);
noCumpleCheckboxState[position] = isChecked;
}
});
row.setTag(holder);
} else {
holder = (MatrixHolder) row.getTag();
}
for (int i = 0; i < cumpleCheckboxState.length; i++) {
Log.e("Estados","item: " + i + " Posicion:" + cumpleCheckboxState[i]);
}
Log.e("Position","Posicion:" + position);
holder.txtTitle.setText(data[position]);
holder.cumpleCheckbox.setChecked(cumpleCheckboxState[position]);
holder.cumpleCheckbox.setChecked(noCumpleCheckboxState[position]);
row.setTag(holder);
return row;
}
static class MatrixHolder {
TextView txtTitle;
LinearLayout layout;
int position;
}
}
添加适配器:
ListAdapter listAdapter = new ListAdapter(getContext(),R.layout.horizontal_checkbox, itemList);
final ListView listView2 = (ListView)view.findViewById(R.id.listView);
listView2.setAdapter(listAdapter);
列表布局
<?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="vertical" >
<TextView
android:id="@+id/headingitem"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:padding="5dp"
android:textSize="20dp"/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/linearmain"
android:layout_gravity="center_horizontal|center_vertical"
android:orientation="horizontal" >
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Cumple"
android:paddingLeft="2sp"
android:paddingRight="2sp"
android:layout_weight="1"
android:id="@+id/cumple"
/>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="No Cumple"
android:paddingLeft="2sp"
android:paddingRight="2sp"
android:layout_weight="1"
android:id="@+id/noCumple"
/>
</LinearLayout>
截图
附加问题。如何为这些复选框添加侦听器并防止选中一行中的两个复选框
欢迎所有意见或建议
对不起我的英语不好
编辑:我已经更新了@jereksel 所说的代码,但是当我向下滚动然后向上滚动时,我看到布尔值设置为 false,有什么建议吗?
【问题讨论】:
-
当活动打开时,所有的复选框都是空的,然后用户将它们用作输入字段,你最后保存了吗?对吗?
-
@Jj 是的,先生,然后我使用这些数据在 Web 服务中做一些工作。实际上,该列表显示在一个片段中。我为此而来,因为客户要求进行此更改,但我使用 CheckedTextView 完成此操作没有问题,但这更复杂。 T_T 问候。
-
你可以看看我的回答:stackoverflow.com/questions/39926388/…。这应该会有所帮助。
标签: android android-layout listview checkbox