Listview中的onClick侦听器更改了另一行

时间:2018-04-23 19:32:38

标签: android android-layout listview android-arrayadapter

我有一个包含三个textview和一个imageview的列表视图。其中一个textview的可见性设置为GONE' GONE'在xml中。

然而,当我点击imageview时,我希望listview中的文字变得可见。这是有效的,但不是仅使该行上的textview可见,另一行的文本视图也显示。

当我点击该行时,如何仅使行的文本视图可见?

这是我的代码

public class Main {
    public static void main(String[] args) {
        Reiziger r1 = new Reiziger("Joost", "01-01-1994");
        Reiziger r2 = new Reiziger("Hans", null);

        ReizigerOracleDaoImpl i1 = new ReizigerOracleDaoImpl();
        i1.alleReizigers.add(r1);
        i1.alleReizigers.add(r2);
        System.out.println(i1.alleReizigers);
    }
}

}

注意:我已尝试使用ViewHolder模式并且问题仍然存在

2 个答案:

答案 0 :(得分:1)

ListView重新使用View。别忘了。

这样,如果在任何位置设置任何属性,可能会在不同的位置产生类似的效果,因为最终会重复使用相同的视图。

在您的代码中,您可以看到:

public View getView(int position,  View view, ViewGroup parent) {

    if (view == null) {
        // I just create a view if received view is null... 
        // In another words, just create a View with View.GONE if current is null
    } else {
        // Since some View are re-used.. they are not null
        // If you don't set visibility again, it will keep last state (in another workds, View.VISIBLE)
    }
};

因此,在使用ListView时,您必须在View期间恢复getView(int position)的所有属性。

如果更改可见性,则必须跟踪哪个位置可见以及哪个位置不可见。然后,在getView()期间,您再次设置正确的状态。

您必须对每个媒体资源执行此操作:setText()setVisibility()setClickable()等等。您必须恢复在其他位置可能发生变化的所有内容。

所以,你可以保留一个单独的列表来跟踪哪一个是可见的(这只是一个例子):

public class CustomListAdapter2 extends ArrayAdapter<ObjectItem> {

    private ObjectItem[] data = null;
    private boolean[] viewVisibility = null;


    public CustomListAdapter2(Activity context, ObjectItem[] data) {
        ...
        this.data = data;
        this.viewVisibility = new boolean[data.lenght];
    }

    public View getView(int position,  View view, ViewGroup parent) {
        ...
        final TextView textView = (TextView) view.findViewById(R.id.list_detail2);
        if(viewVisibility[position]) {
            textView.setVisibility(View.VISIBLE);
        } else {
            textView.setVisibility(View.GONE);
        }

        ...

        imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                textView.setVisibility(View.VISIBLE);
                viewVisibility[position] = true;
            }
        });

        return view;

    };
}

答案 1 :(得分:0)

您需要使用OnItemClickListener,它会为您提供对回调方法中点击的View的引用。

参考此处:https://developer.android.com/reference/android/widget/AdapterView.OnItemClickListener.html

此处的示例实施:https://stackoverflow.com/a/18405437/4321774