【问题标题】:Android - Make ImageView Visible When ListItem is selectedAndroid - 选择 ListItem 时使 ImageView 可见
【发布时间】:2012-04-10 10:52:11
【问题描述】:

我有一个列表视图,每个项目都有一个标题、一些信息和几个我用作编辑/删除按钮的 ImageView。除非用户选择该行,否则我不想显示这些“按钮”。我可以使用以下方法使“按钮”不可见:

        DeleteButton.setVisibility(View.INVISIBLE);
        EditButton.setVisibility(View.INVISIBLE);

在我的 BindView 中。

我可以让按钮在 onListItemClick 中可见:

    ImageView DeleteButton = (ImageView) v.findViewById(R.id.button_delete);
    ImageView EditButton = (ImageView) v.findViewById(R.id.button_edit);
    DeleteButton.setVisibility(View.VISIBLE);
    EditButton.setVisibility(View.VISIBLE);

我不能做的是在选择另一个项目或滚动离开时使“按钮”不可见。

我发现的最接近的方法是循环遍历当前视图中的列表项,并将它们全部设置为不可见,然后再使选定的项可见:

protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);

    \\loop through all the items and set them back to invisible
    for (int i=0;i<=l.getLastVisiblePosition();i++){
        View vChild = l.getChildAt(i);
        ImageView DeleteButton = (ImageView) vChild.findViewById(R.id.button_delete);
        ImageView EditButton = (ImageView) vChild.findViewById(R.id.button_edit);
        DeleteButton.setVisibility(View.INVISIBLE);
        EditButton.setVisibility(View.INVISIBLE);
    }

    \\set the selected one visible
    ImageView DeleteButton = (ImageView) v.findViewById(R.id.button_delete);
    ImageView EditButton = (ImageView) v.findViewById(R.id.button_edit);
    DeleteButton.setVisibility(View.VISIBLE);
    EditButton.setVisibility(View.VISIBLE);

}

您可以猜到...这种方法仅在您有几件物品时才有效。
我考虑向我的列表用来跟踪按钮可见性的 SQLite 数据库添加一个字段(类似于您为复选框所做的),但这似乎很愚蠢。请告诉我还有其他方法。

【问题讨论】:

    标签: android android-listview visibility android-imageview


    【解决方案1】:

    另一种方法是在你的类中有一个int 字段来记住当前位置:

    private int current = -1;
    

    然后在onItemCLick() 方法中使用该字段来隐藏/显示您的视图:

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
                // if it is the first click ignore this part
        if (current != -1) {
            View last = l.getChildAt(current); // the last one clicked
            last.findViewById(R.id.button1).setVisibility(View.GONE); // kill it
        }
        v.findViewById(R.id.button1).setVisibility(View.VISIBLE);
        current = position; // remember the new clicked position
    }
    

    如果您希望在滚动列表时视图也消失并且这些视图不可见,则在 bindView() 方法中添加隐藏视图的行:

    //...
    ImageView DeleteButton = (ImageView) view.findViewById(R.id.button_delete); // view is the view that you get as a parameter
    ImageView EditButton = (ImageView) view.findViewById(R.id.button_edit);
    DeleteButton.setVisibility(View.INVISIBLE);
    EditButton.setVisibility(View.INVISIBLE);
    
    //...
    

    当用户滚动列表时,所有视图的Buttons 可见性将设置为GONEonItemCLick() 逻辑仅适用于可见视图。

    【讨论】:

    • 谢谢,这正是我需要的想法。我曾考虑尝试跟踪单击的最后一行,但我不确定一旦该行滚动离开该做什么。我没有意识到绑定视图可以处理它。
    【解决方案2】:

    我不知道我是否正确理解您的问题,但请定义 ImageViews

        ImageView DeleteButton = (ImageView) v.findViewById(R.id.button_delete);
        ImageView EditButton = (ImageView) v.findViewById(R.id.button_edit);
    

    一次 onCreate() 而不是每次都!不知道这是否能解决您的问题,但请尝试一下。

    编辑:

    if(tempEditButton != null && tempDeleteButton != null){
    tempDeleteButton.setVisibility(View.INVISIBLE);
    tempEditButton.setVisibility(View.INVISIBLE);
    }
    EditButton.setVisibility(View.VISIBLE);
    DeleteButton.setVisibility(View.VISIBLE);
    
    tempEditButton = EditButton;
    tempDeleteButton = DeleteButton;
    

    【讨论】:

    • 由于有不止一组 ImageViews(我的列表中的每个项目都有一组),我必须在填充列表视图时定义 ImageViews。所以我在 BindView 中执行此操作(因为我的列表绑定到 SimpleCursorAdapter)。但这让我思考。我正在查看我的 NewView Override 没有做任何事情......也许我可以让按钮在其中不可见。
    • 您不必每次新建时都初始化 DeleteButton 和 EditButton。一个私有的 ImageView Editbutton 和私有的
    • ImageView DeleteButton 在你的类定义中就可以了。目前的问题是,每次新建时都要初始化 EditButton 和 DeleteButton。你不必那样做!您可以在运行时提供另一个值,但不要再次将它们初始化为 ImageView,因为它们将是新元素并且没有您设置的属性!
    • 感谢您的跟进。我想我知道你要去哪里。我可以将我的声明 EditButton 和 DeleteButton 移到顶部,然后在我的绑定视图中一遍又一遍地使用它们。但我不明白这如何解决我的问题。我现在拥有的是一个列表视图,每行都有 2 个隐藏按钮。当我单击一个项目时,按钮变得可见。到目前为止,一切都很好。当我单击另一行时,该行上的按钮变得可见......但我希望第一行上的按钮恢复为不可见状态。这就是我无法开始工作的原因。
    • 您可以初始化 tempEditButton 和 tempDeleteButton 并将 DeleteButton 和 EditButton 的最后一个实例保存在那里。所以在你的听众中:看看我的主要答案......
    【解决方案3】:

    这是一个老问题,但我想我仍然可以回答。我通过创建一个可以从任何地方调用的公共静态方法解决了这个问题:

    public static void hideOptions(Activity activity){
        for (int i = 0; i< listviewSize; i++) {
            Listview x = (Listview ) activity.findViewById(R.id.contactRecyclerView);
            x.getChildAt(i).findViewById(R.id.myView).setVisibility(View.GONE);
        }
    }
    

    然后,您可以在想要隐藏视图时调用此方法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-26
      • 2014-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多