2012-03-26 2 views
1

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

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

То, что я не могу сделать, это «кнопку» невидимой при выборе другого элемента или прокрутке прочь.

Ближайший я нашел, чтобы сделать петлю через ListItems в текущем виде и установить их все, прежде чем сделать невидимым выбранный один видимый:

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

Другой способ сделать это будет иметь 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

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

0

Я не знаю, если я понимаю ваш вопрос правильно, но сделать определение из ImageViews

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

один раз в OnCreate(), а не каждый раз снова! Не знаю, решает ли это вашу проблему, но попробуйте.

Edit:

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; 
+0

Поскольку существует более чем один набор ImageViews (набор для каждого элемента в моем списке), я должен определить ImageViews по мере заполнения списка. Поэтому я делаю это в BindView (так как мой список привязан к SimpleCursorAdapter). Но это заставляет меня думать.Я смотрю на свой NewView Override, который ничего не делает ... возможно, я мог бы сделать кнопки невидимыми в этом. – Jeff

+0

Вам не нужно каждый раз инициализировать DeleteButton и EditButton. Частный ImageView Editbutton и частный –

+0

ImageView DeleteButton в вашем определении класса будут делать трюк. проблема на данный момент заключается в том, что вы каждый раз запускаете EditButton и DeleteButton каждый раз. вам это не нужно! вы можете дать другое значение во время выполнения, но не инициализируйте их как ImageView снова, поскольку они будут новыми элементами и не будут иметь свойства, которые вы задали! –

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

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

Смежные вопросы