带有getView按钮的Android listview适配器,用于更改布局

时间:2015-05-05 12:30:30

标签: android listview android-adapter baseadapter

我有一个带有几个按钮的列表视图,我想披露更多信息。我有一个包含多个嵌套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中的布局,以便它一致地工作并且不会抛出错误?我错过了一个不同的,非常明显的模式吗?

修改 抱歉,忘记放入我初始化评论布局的地方。它绝对存在。

2 个答案:

答案 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);
 }