无法以编程方式设置列表视图中按钮的可见性

Posted

技术标签:

【中文标题】无法以编程方式设置列表视图中按钮的可见性【英文标题】:Not able to set the visibility of a button inside a listview programmatically 【发布时间】:2015-03-22 13:55:58 【问题描述】:

我正在尝试根据列表视图中的特定条件设置按钮的可见性。

上下文:列表视图具有响应帖子的参数。它包含响应的标题、描述等以及投票按钮。只有作为父帖子所有者的用户才能看到该按钮,以便他可以对响应进行投票。

我试图设置按钮可见性的代码的 java 部分:

adapter= new SimpleAdapter(MainActivity.this, list,
                    R.layout.response_list, columns, mapping);  //response_list is the xml layout file where response parameters are defined.
ListView listView = (ListView) findViewById(R.id.listallresponses); //listallresponses is the id of response_list layout file.

if (!parent.equals(userLoggedin))  //"parent" is the userid of the parent post. "userLoggedin" is the current user who is viewing the parent post and its responses.
    LayoutInflater li = LayoutInflater.from(this);
    View v = li.inflate(R.layout.response_list, null, false);
    Button upVoteButton = (Button) v
                        .findViewById(R.id.upvoteButton); //upvoteButton is the one whose visibility we are talking about.
    upVoteButton.setVisibility(View.GONE);


listView.setAdapter(adapter);

我在其中定义响应参数的 response_list.xml 如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:id="@+id/responseList"
android:layout_
android:orientation="vertical"
android:padding="6dip" >
<!-- Other views are present here-->
<Button
  android:id="@+id/upvoteButton"
  android:layout_
  android:layout_
  android:onClick="upVoteResponse"
  android:text="VoteUp"/>

问题:upvoteButton 在响应列表中始终可见,即使登录的用户不等于父帖子的所有者。想知道我怎样才能让它工作!提前致谢。

注意:我对 Android 的熟悉只有五个月。我已经搜索了很多以弄清楚如何使它工作,但直到现在才成功。

【问题讨论】:

在适配器本身中做同样的事情,在getView 您是否处理过视图回收?好像不是这样! @Skynet :你的意思是 adapter.notifyDataSetChanged(); ?我试过了,如果是的话。 @MurtazaHussain :将在 getView 上阅读并尝试实施。很快就会更新帖子。 尝试自定义您的适配器并包含适配器的生命周期方法here 是一个很好的起点。 【参考方案1】:
   LayoutInflater li = LayoutInflater.from(this);
    View v = li.inflate(R.layout.response_list, null, false);
    Button upVoteButton = (Button) v.findViewById(R.id.upvoteButton); 
    upVoteButton.setVisibility(View.GONE);

第 2 行和第 3 行中引用的视图“v”和“upVoteButton”在任何地方都不可见。请注意,您已经在内存中夸大了视图“v”和“upVoteButton”,但在用户界面中没有。

您的代码中引用的视图和按钮根本不是您真正想要引用的那个。

你不应该在你的 if 块中膨胀任何视图,相反你必须使用 getView() 方法的参数 - 视图和位置来实现你的目标。

【讨论】:

好的。我将对 getView() 方法进行一些阅读。直到现在才使用它。 通过自定义 simpleadapter 并覆盖 getView() 方法来实现。我接受这个答案,因为它给了我正确的解释。

以上是关于无法以编程方式设置列表视图中按钮的可见性的主要内容,如果未能解决你的问题,请参考以下文章

如何通过外部按钮在列表视图中设置可见性?

在活动中更改列表视图的按钮可见性

无法将XAML按钮可见性与C#视图模型专用可见性变量绑定

显示/隐藏片段并以编程方式更改可见性属性

ListView 使 textview 在超出屏幕可见性时可见

如何在阵列适配器中长按时设置按钮的可见性