在listview android

时间:2016-08-09 08:46:37

标签: android listview android-studio

我正在尝试实施自定义列表视图。一切正常,直到我在if ()方法

中使用getView()语句

如果没有if()条件,当我选择一个项目时会选择一个项目但是当我添加if()条件时,视图会正确显示但是会选择两个项目(非相邻)最后一个或第二个,任何这样的组合。)

View getView(...){
    ....
    if (!item.getPriceTo().equals(""))
                priceToTV.setText(item.getPriceTo());
            else
                priceToTV.setText(item.getPriceFrom());
    return view;
}

此外,我使用保存上一个视图来显示选择,以便当前选择有一个red_border,当选择它时,black_border设置为它。:

subItemsListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Log.d("New Order", "........");
                if (previousViewOfSubItems != null && previousViewOfSubItems != view) {
                    previousViewOfSubItems.setBackgroundResource(R.drawable.black_border);
                    if (quantity.getText().toString().equals("xx") || quantity.getText().toString().equals("0")) {
                        viewForVisibility.setVisibility(View.GONE);
                        layoutForQuantity.setVisibility(View.GONE);
                    }

                }
                if (previousViewOfSubItems == view)
                    return;
                previousViewOfSubItems = view;
                previousViewOfSubItems.setBackgroundResource(R.drawable.red_border);
                viewForVisibility = previousViewOfSubItems.findViewById(R.id.viewForVisibility);
                viewForVisibility.setVisibility(View.VISIBLE);
                layoutForQuantity = (LinearLayout) previousViewOfSubItems.findViewById(R.id.layoutForQuantity);
                layoutForQuantity.setVisibility(View.VISIBLE);
                quantity = (TextView) previousViewOfSubItems.findViewById(R.id.subTypeQuantity);

            }
        });

5 个答案:

答案 0 :(得分:1)

previousViewOfSubItems = view;似乎导致了这个问题,

在带有适配器的Listviews中,您应该避免保存视图实例,因为适配器会重复使用视图,因此两行的视图可以相同,而不是保存视图实例的引用[{3}}并使用视图标记

答案 1 :(得分:1)

您需要使用ViewHolder Pattern和视图标记来正确识别不同位置的每个视图。 ListView始终回收视图,而不是一次又一次地重新膨胀视图。

您可以参考Android Training documentation了解如何实现ViewHolder模式。

答案 2 :(得分:0)

ListViews回收列表中的视图。滚动时,将重复使用顶视图,并使用这些方法替换内容。

如果您将背景设置为红色等,请使用Else语句将其设置为默认黑色。

答案 3 :(得分:0)

因为它的列表视图重复使用视图来显示项目,一旦滚动出第一个视图,就会重复使用相同的视图来显示列表视图底部的视图。而不是比较视图尝试compair点击视图的位置

答案 4 :(得分:0)

我在Recyclerview上的blog中解释了这个异常行为,你引用它来解决这个问题。

使用pojo类获取状态并相应地更新视图