我有一个带有几个按钮的列表视图,我想披露更多信息。我有一个包含多个嵌套LinearLayouts的布局的xml文件。当按下“注释”按钮时,我想要显示适当的布局然后消失。在模型对象内部,我会跟踪视图是否被披露。
public View getView(int position, View convertView, ViewGroup parent) {
final CarmenGrade grade = (CarmenGrade) getItem(position);
convertView = mInflater.inflate(R.layout.carmen_grade_item, null);
commentsLayout = (LinearLayout) convertView.findViewById(R.id.commentsLayout);
commentsButton = (Button) convertView.findViewById(R.id.commentsButton);
commentsButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (grade.isShowingComments() == true) {
commentsLayout.setVisibility(View.GONE);
grade.setShowingComments(false);
/* other similar layout parts cut */
} else {
commentsLayout.setVisibility(View.VISIBLE);
grade.setShowingComments(true);
/* other similar layout parts cut */
}
notifyDataSetChanged();
}
});
}
在Android 4.x上,它在第一次按下时工作,并且正确的布局变得可见。再次按下按钮似乎不能始终如一地工作。每隔一段时间它就会消失。
在Android 5.0上我收到很多警告,虽然它似乎在大部分时间都有效:
W/View﹕ requestLayout() improperly called by android.widget.TextView{2d2581cb V.ED.... ......ID 0,57-231,114 #7f0a0086 app:id/weightedValueTextView} during layout: running second layout pass
所以我的问题是 - 我如何使用列表中的项来更改getView中的布局,以便它一致地工作并且不会抛出错误?我错过了一个不同的,非常明显的模式吗?
修改 抱歉,忘记放入我初始化评论布局的地方。它绝对存在。
答案 0 :(得分:2)
在Adapter中,多次调用getView()函数。因此,当您在侦听器中查找carmen_grade_item
内部视图时,它将返回最后启动的对象(其中的意思可能指向listview中其他行的相同对象)。
所以要克服这个问题:
如果要在适配器类中使用它:将特定行的viewHolder维护到数组中。或找到像clickedView.getParent().findViewById(R.id.someLayout)
这样的特定布局;然后执行你的行动。
所以你的听众会是这样的
commentsButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LinearLayout layout=(LinearLayout) ((MainParent which contains child)
v.getParent()).findViewById(R.id.commentsLayout);
if(layout.isShown()){
layout.setVisibility(View.GONE);
}else{
layout.setVisibility(View.VISIBLE);
}
notifyDataSetChanged();
}
});
答案 1 :(得分:0)
无需使用布尔变量,如下所示。
if (commentsLayout.isShown()) {
commentsLayout.setVisibility(View.GONE);
} else {
commentsLayout.setVisibility(View.VISIBLE);
}