【发布时间】:2014-09-10 16:11:27
【问题描述】:
我需要帮助我在 viewHolder 对象中设置标签。我有一个比屏幕长的列表(在手机上),我需要为每个视图设置不同的标签。正如您在我的预览应用程序(下面的链接)中看到的,在外部片段中,第一项和最后一项绑定在一起。我不希望那样,我希望每个观点都是独一无二的。我该怎么做。
https://drive.google.com/file/d/0B2xlu23GjnfvTEgtbkprOThtMmM/edit?usp=sharing
谢谢
我的检查列表适配器
public class InspectionListAdapter extends ArrayAdapter<String> {
private final Activity context;
private final String[] inspectionTitles;
private final String[] description;
public InspectionListAdapter(Activity context, String[] inspectionTitles,
String[] description) {
super(context, R.layout.inspection_item_layout, inspectionTitles);
this.context = context;
this.inspectionTitles = inspectionTitles;
this.description = description;
}
public static class ViewHolder {
public ImageView imageView, expandButton;
public TextView txtTitle;
public TextView txtDescription;
public RelativeLayout expandLayout;
public EditText ownDesc, estCost;
public LayerDrawable listItem;
public GradientDrawable color;
public CheckBox checkRepair, checkDone;
public RelativeLayout mainLayout;
}
@Override
public View getView(int position, View view, ViewGroup parent) {
final ViewHolder viewHolder;
View rowView = view;
if (rowView == null) {
LayoutInflater inflater = context.getLayoutInflater();
rowView = inflater.inflate(R.layout.inspection_item_layout, null,
true);
viewHolder = new ViewHolder();
viewHolder.mainLayout = (RelativeLayout) rowView
.findViewById(R.id.item_layout_main);
viewHolder.txtTitle = (TextView) rowView
.findViewById(R.id.textViewItemTitle);
viewHolder.txtDescription = (TextView) rowView
.findViewById(R.id.textViewTip);
viewHolder.listItem = (LayerDrawable) rowView.getResources()
.getDrawable(R.drawable.layer_car_background);
viewHolder.color = (GradientDrawable) (viewHolder.listItem
.findDrawableByLayerId(R.id.item_list_background));
viewHolder.imageView = (ImageView) rowView
.findViewById(R.id.imageViewItem);
viewHolder.expandButton = (ImageView) rowView
.findViewById(R.id.imageViewTitle);
viewHolder.ownDesc = (EditText) rowView
.findViewById(R.id.editTextDescription);
viewHolder.estCost = (EditText) rowView
.findViewById(R.id.editTextEstCost);
viewHolder.checkRepair = (CheckBox) rowView
.findViewById(R.id.checkBox2);
viewHolder.checkDone = (CheckBox) rowView
.findViewById(R.id.checkBox1);
viewHolder.checkRepair
.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton view,
boolean arg1) {
// TODO Auto-generated method stub
if (view.isChecked()) {
viewHolder.checkDone.setChecked(false);
}
}
});
viewHolder.checkDone
.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton view,
boolean arg1) {
// TODO Auto-generated method stub
if (view.isChecked()) {
viewHolder.checkRepair.setChecked(false);
}
}
});
viewHolder.expandLayout = (RelativeLayout) rowView
.findViewById(R.id.relativeLayoutExpandable);
viewHolder.expandLayout.setVisibility(View.GONE);
viewHolder.expandButton
.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
if (viewHolder.expandLayout.getVisibility() == View.VISIBLE) {
viewHolder.expandButton
.setImageResource(R.drawable.ic_action_expand);
viewHolder.expandLayout
.setVisibility(View.GONE);
if (viewHolder.checkDone.isChecked()) {
viewHolder.mainLayout
.setBackgroundResource(R.drawable.layer_car_background_green);
}
if (viewHolder.checkRepair.isChecked()) {
viewHolder.mainLayout
.setBackgroundResource(R.drawable.layer_car_background_red);
}
} else {
viewHolder.expandButton
.setImageResource(R.drawable.ic_action_collapse);
viewHolder.expandLayout
.setVisibility(View.VISIBLE);
viewHolder.mainLayout
.setBackgroundResource(R.drawable.layer_car_background);
}
}
});
rowView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) rowView.getTag();
}
viewHolder.txtTitle.setText(inspectionTitles[position]);
viewHolder.txtDescription.setText("Tip: \n" + description[position]);
viewHolder.imageView.setImageResource(R.drawable.ic_launcher);
viewHolder.expandButton
.setImageResource(R.drawable.ic_action_expand);
return rowView;
}
}
【问题讨论】:
-
我建议您了解 getView 的工作原理。视图将被回收。而且您不应该让“每个视图都独一无二”
-
我的列表不是动态列表,它是由我的 string.xml 文件中的字符串数组生成的预设列表。我希望我所有的观点都保留他们的 onClickListeners 和 onCheckChangedListeners
-
请说明您尝试在哪里为每个视图设置不同的标签。我看到的是您将视图持有者设置为视图的标签。它们在哪些方面不同? “保留点击听众等”与这一切有什么关系?当然,还有更多的项目可以放在屏幕上。而且您的 google 文档在我的平板电脑上无法读取,所以我不知道那里出了什么问题。
-
这是一个 .apk,您应该能够安装它并查看我的问题所在。当您转到第二个片段时(此列表比其他列表长)。如果单击第一项的展开按钮,列表中的最后一项也会展开,如果您选中两个复选框中的任何一个,列表中最后一项的颜色也会改变...
-
不明白你对第二个片段的意思。当我单击圆圈中的 + 时,我只会得到一个列表。如果我然后扩大地下室湿度,其他人不会扩大。另外,当我检查某些东西时,只有它的父级是彩色的。未展开的列表不会填满屏幕。在两台设备上测试。
标签: android android-listview listadapter