2016-08-25 4 views
5

У меня есть 2 всплывающих окна. При первом всплывающем окне у меня есть ListView с возможностью выбора. Когда я нажимаю элемент из первого списка, появляется второе всплывающее окно, которое также имеет ListView с параметрами для выбора.Событие onClick не работает с элементом управления вложенным элементом списка в android

Я реализовал первые элементы списка просмотра в качестве пользовательских View и подписавшись на щелчки внутри вида конструктору, что:

class CustomListItem extends RelativeLayout{ 
    public CustomListItem(){ 
     ... 
     //inflating stuff there 
     ((Button)findViewById(R.id.listItemButton)).setOnClickListener(
      //This code not working as expected, but then could fire a lot of times 
      v -> System.out.println("item clicked"); 
     ); 
    } 
} 

Когда я открываю первый диалог в первый раз onClick обработчик пожары, как ожидается, и вторым всплывающее окно появляется. Но когда я закрываю второе всплывающее окно и возвращаюсь обратно (вызывая Dialog.dismiss() для всплывающего окна) до первого всплывающего окна, то обработчик onClick в первом списке перестает работать. Есть некоторые другие inetersting вещи:

  1. onTouch слушатель для списка просмотра элемента все еще работает (так называемый для action=ACTION_DOWN и action=ACTION_UP);
  2. Когда я установил для listview onItemClickListener, он всегда называется (первый раз, когда всплывающее окно открылось и когда мы возвращаемся обратно к нему);
  3. Когда я нажимаю много раз на элемент в виде списка, иногда onClick происходит, и после этого он называется столько раз, сколько я нажимал раньше.

У вас есть идеи, что может быть причиной проблемы?

ОБНОВЛЕНИЕ

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

@Override 
public View getView(int position, View view, ViewGroup parent) { 
    if (!constructedViewCache.containsKey(position)) { 
     constructedViewCache.put(position, new CustomListItem()); 
    } 

    return constructedViewCache.get(position); 
} 

Когда я изменил этот код на код ниже все работает:

@Override 
public View getView(int position, View view, ViewGroup parent) { 
    if (view == null) 
    { 
     view = LayoutInflater.from(context).inflate(R.layout.list_view_item, null); 
    } 

    view.setOnClickListener(v -> { 
     v -> System.out.println("item clicked"); 
    }); 

    return view; 
} 

Почему это не возможно создать вид с new CustomListItem()? Или, если возможно, как мне это сделать?

+0

Может ли я правильно понимаю, что OnClick не правильно работало, но если вы щелкая много раз, скажем, 20-30 он мог огонь и после этого код для onclick будет выполняться 20-30 раз? –

+0

Вы могли бы поделиться больше кода? –

+0

@vovaxo полный код очень сложный. какая часть кода может быть полезна для вас? – Natasha

ответ

0

Попробуйте вставить атрибут android:descendantFocusability="blocksDescendants" в объявление родительского макета вашего элемента списка, где размещается listItemButton.

Где атрибут android:descendantFocusability

Определяет связь между ViewGroup и его потомков, ища View, чтобы получить фокус.

И постоянная blocksDescendants означает, что:

ViewGroup блокирует его потомков от получения фокуса.

Второй вопрос

Можно создать вид с новым CustomListItem(). Смотрите пример ниже:

@Override 
public View getView(int i, View view, ViewGroup viewGroup) { 
    return new CustomListItem(context); 
} 

EDIT

я не видел свой полный код, он выглядит, что вы что-то не так. Вот рабочий пример, посмотрите на:

public class CustomAdapter extends BaseAdapter { 
private Context context; 
private HashMap<Integer, CustomListItem> constructedViewCache = new HashMap<>(); 

public CustomAdapter(Context context) { 
    this.context = context; 
} 

@Override 
public int getCount() { 
    return 20; 
} 

@Override 
public Object getItem(int i) { 
    return null; 
} 

@Override 
public long getItemId(int i) { 
    return 0; 
} 

@Override 
public View getView(int position, View view, ViewGroup viewGroup) { 
    if (!constructedViewCache.containsKey(position)) { 
     constructedViewCache.put(position, new CustomListItem(context, position)); 
    } 
    return constructedViewCache.get(position); 
} 
} 

И второй класс:

public class CustomListItem extends RelativeLayout { 
private static final String TAG = "CustomListItem"; 

public CustomListItem(Context context, int position) { 
    super(context); 

     View view = LayoutInflater.from(context).inflate(R.layout.item_view, this); 
    Button button = (Button) view.findViewById(R.id.button); 
    button.setOnClickListener(view1 -> { 
     Log.e(TAG, "CustomListItem: " + position); 
     FragmentManager fragmentManager = ((AppCompatActivity) context).getSupportFragmentManager(); 
     new CustomDialog().show(fragmentManager, "tag"); 
    }); 

} 
} 

EDIT 2

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

public class CustomDialog extends DialogFragment { 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.activity_main, container, false); 
    ListView listView = (ListView) view.findViewById(R.id.list); 
    listView.setAdapter(new CustomAdapter(getActivity())); 
    return view; 
} 
} 
+0

'android: descendantFocusability' не влияет на результат, но второе предложение с созданием' new CustomListItem() 'работает нормально и не« ломает »клики. Я все еще не понимаю причину проблемы: почему кеширование вызывает проблему с помощью кликов? – Natasha

+0

Я проверил ваш код. Я делаю то же самое. Вы пробовали это с диалогом? У меня есть первый диалог со списком и кнопкой, который открывает другое диалоговое окно, и когда мы вернемся из второго диалога, чтобы первые клики перестали работать. Первоначально они отлично работают (оба диалоговых окна полноэкранного режима - не уверены, важно ли это) – Natasha

+0

С диалогом работает отлично для меня. –

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