Android - сделать ImageView видимым, когда выбран ListItem - PullRequest
2 голосов
/ 27 марта 2012

У меня есть просмотр списка, и у каждого элемента есть заголовок, некоторая информация и пара изображений, которые я использую в качестве кнопок редактирования / удаления.Я не хочу показывать эти «кнопки», пока пользователь не выберет строку.Я могу сделать «кнопки» невидимыми, используя:

        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 ]

4 голосов
/ 27 марта 2012

Другим способом сделать это было бы наличие в вашем классе поля 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() будет работать только для видимых видов.

0 голосов
/ 30 сентября 2015

Это старый вопрос, но я думаю, что все еще могу ответить на него. Я решил эту проблему, создав открытый статический метод, который можно вызывать из любого места:

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

Вы можете вызывать этот метод всякий раз, когда хотите скрыть свое представление

0 голосов
/ 27 марта 2012

Я не знаю, правильно ли я понимаю ваш вопрос, но сделайте определения 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;
...