Android - 选择ListItem时使ImageView可见

时间:2012-03-26 22:02:29

标签: android android-listview visibility android-imageview

我有一个列表视图,每个项目都有一个标题,一些信息,以及一些我用作编辑/删除按钮的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数据库中添加一个字段来跟踪按钮的可见性(类似于你对复选框的操作)但这看起来很傻。请告诉我另一种方式。

3 个答案:

答案 0 :(得分:4)

另一种方法是在班级中设置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);

//...

当使用滚动列表时,所有视图都会将Button的可见性设置为GONE,而onItemCLick()逻辑仅适用于可见视图。

答案 1 :(得分:0)

我不知道我是否理解你的问题是正确的,但要做出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;

答案 2 :(得分:0)

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

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);
    }
}

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