【问题标题】:onClick listener in Listview changes another rowListview 中的 onClick 侦听器更改另一行
【发布时间】:2018-04-23 19:32:38
【问题描述】:

我有一个包含三个文本视图和一个图像视图的列表视图。其中一个文本视图的可见性在 xml 中设置为“GONE”。

但是,当我单击图像视图时,我希望列表视图中的文本可见。这是有效的,但不是只显示该行上的文本视图,而是显示另一行的文本视图。

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

这是我的代码

public class CustomListAdapter2 extends ArrayAdapter<ObjectItem> {

//to reference the Activity
private final Activity context;

private ObjectItem[] data = null;


public CustomListAdapter2(Activity context, ObjectItem[] data) {

    super(context, R.layout.most_lodged_complaints, data);

    this.context = context;
    this.data = data;

}

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


    if (view == null) {
        LayoutInflater inflater = context.getLayoutInflater();
        view = inflater.inflate(R.layout.most_lodged_complaints, parent, false);
    }


    final ObjectItem objectItem = data[position];

    TextView headerTextField = (TextView) view.findViewById(R.id.list_header);
    TextView detailTextField = (TextView) view.findViewById(R.id.list_detail);

    final TextView textView = (TextView) view.findViewById(R.id.list_detail2);

    ImageView imageView = (ImageView) view.findViewById(R.id.most_complaints_expand);

    headerTextField.setText(objectItem.header);
    detailTextField.setText(objectItem.detail);

    imageView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            textView.setVisibility(View.VISIBLE);
        }
    });

    return view;

};

}

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

【问题讨论】:

    标签: android android-layout listview android-arrayadapter


    【解决方案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 时,您必须在getView(int position) 期间恢复View 的所有属性。

    如果您更改可见性,则必须跟踪哪个位置可见,哪个位置不可见。然后,在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;
    
        };
    }
    

    【讨论】:

    • 它给出了这个错误 java.lang.NullPointerException: Attempt to read from null array。我认为这是因为 viewVisibility 默认设置为 null 。我该怎么办?
    • 嗨,忘记添加这一行 this.viewVisibility = new boolean[data.lenght];现在工作得很好,我很感激
    • @johnson 很高兴知道...当您发布此新评论时,我正在阅读您的评论!很高兴它有效!
    【解决方案2】:

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

    参考这里:https://developer.android.com/reference/android/widget/AdapterView.OnItemClickListener.html

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

    【讨论】:

    • 但是imageview不支持onItemClickListener,怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 2021-10-19
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多