2013-11-25 1 views
0

Я работаю над приложением, в котором элемент списка сложный, TextView и два ImageButtons. Я посмотрел вокруг, чтобы найти решение, и попробовал все, что видел, и ничего.listview item with button не отвечает на onListItemClick

Этот список является частью ListFragment, у меня есть Override onListItemClick.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#FFF" > 

    <TextView 
     android:id="@+id/medcine_info_txt" 
     android:layout_width="fill_parent" 
     android:layout_height="200dp" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:clickable="false" 
     android:focusable="false" 
     android:focusableInTouchMode="false" 
     android:padding="3dp" 
     android:textColor="@color/black" /> 

    <ImageButton 
     android:id="@+id/item_edit" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBottom="@+id/medcine_info_txt" 
     android:layout_alignParentLeft="true" 
     android:contentDescription="@string/item_edit" 
     android:focusable="false" 
     android:focusableInTouchMode="false" 
     android:src="@android:drawable/ic_menu_edit" /> 

    <ImageButton 
     android:id="@+id/item_history" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBottom="@+id/medcine_info_txt" 
     android:layout_centerHorizontal="true" 
     android:contentDescription="@string/item_history" 
     android:focusable="false" 
     android:focusableInTouchMode="false" 
     android:src="@android:drawable/btn_star" /> 

</RelativeLayout> 

Это мой адаптер GetView, где я на обрабатывать кнопки мыши, и он реализует OnClickListener

public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflator = (LayoutInflater) getContext() 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View listItem = inflator.inflate(R.layout.medcince_list_item, null); 

    ImageButton mEdit = (ImageButton)listItem.findViewById(R.id.item_edit); 
    mEdit.setOnClickListener(this); 
    mEdit.setTag(getItem(position)); 

    ImageButton mHistory = (ImageButton)listItem.findViewById(R.id.item_history); 
    mHistory.setOnClickListener(this); 
    mHistory.setTag(getItem(position)); 

    return listItem; 
} 

Любые мысли о том, почему onListItemClick не обрабатывает щелчок?

ответ

0

вы можете создать объект View.OnClickListner, который может слушать ваш imagebutton нажмите в getView. onListItemClick обычно используется для обработки события щелчка строки, а не элементов в строках.

public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflator = (LayoutInflater) getContext() 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View listItem = inflator.inflate(R.layout.medcince_list_item, null); 

    ImageButton mEdit = (ImageButton)listItem.findViewById(R.id.item_edit); 
    mEdit.setOnClickListener(new View.OnClickListener(){ 

    @Override 
    public void onClick(View v) { 
     // HERE YOU CAN HANDLE BUTTON CLICK. POSITION YOU CAN HAVE FROM getView already. 
    } 

    }); 
    mEdit.setTag(getItem(position)); 

    ImageButton mHistory = (ImageButton)listItem.findViewById(R.id.item_history); 
    mHistory.setOnClickListener(new View.OnClickListener(){ 

    @Override 
    public void onClick(View v) { 
     // HERE YOU CAN HANDLE BUTTON CLICK. POSITION YOU CAN HAVE FROM getView already. 
    } 

    }); 
    mHistory.setTag(getItem(position)); 

    return listItem; 
} 
0

Сделать ListFragment реализуют интерфейс View.OnClickListener и реализовать код, который вы хотите назвать, когда кнопка будет нажата в методе OnClick(View view), который @Override

2

Я думаю, что ваш ImageButton украл событие onItemClickLister. Добавить этот атрибут в макете

андроид: descendantFocusability = "blocksDescendants"

<TextView 
    android:id="@+id/medcine_info_txt" 
    android:layout_width="fill_parent" 
    android:layout_height="200dp" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentTop="true" 
    android:clickable="false" 
    android:focusable="false" 
    android:focusableInTouchMode="false" 
    android:padding="3dp" 
    android:textColor="@color/black" /> 

<ImageButton 
    android:id="@+id/item_edit" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    ....... 

Благодарности

+1

аналогичный лучший ответ [здесь] (http://stackoverflow.com/a/17502381/1264893). Вам нужно добавить android: descendantFocusability = "blocksDescendants" в макете и андроиде: focusable = "false" и android: focusableInTouchMode = "false" на imagebutton –

1

Это общий вопрос для ListView. Я читаю исходный код об этом.
Вопрос: почему onListItemClick не назовешь?
Ответ:

  • AbsListView класса переопределяют onTouchEvent метод.
  • Снайперский код от onTouchEvent способ.
    
    if (inList && !child.hasFocusable()) { 
            if (mPerformClick == null) { 
             mPerformClick = new PerformClick(); 
            } 
    ..... 
    } 
    

    PerformClick будет вызывать, если ребенок. hasFocusable() return false, каким ребенком вы являетесь элементом ViewView;
  • Снайперский код от hasFocusable метод.

@Override 
    public boolean hasFocusable() { 
     if ((mViewFlags & VISIBILITY_MASK) != VISIBLE) {return false; } 
     if (isFocusable()) {return true;} 
     final int descendantFocusability = getDescendantFocusability(); 
     if (descendantFocusability != FOCUS_BLOCK_DESCENDANTS) { 
      final int count = mChildrenCount; 
      final View[] children = mChildren; 
      for (int i = 0; i


Так решение:
Решение A, установить ListView элемент descendantFocusability свойство, пусть его getDescendantFocusability() не равна FOCUS_BLOCK_DESCENDANTS.
Решение B, элемент ListView, все дочерние представления не имеютFocusable (hasFocusable()
return false).

+0

похоже, что он работает. – user2557632

+0

Отличный анализ. Но ... Для решения A вы имеете в виду атрибут 'descendantFocusability', который должен быть установлен в 'blocksDescendants'?Ваша строка - «пусть его getDescendantFocusability() не равно FOCUS_BLOCK_DESCENDANTS» подразумевает полную противоположность. Во всяком случае, это не работает для меня. – faizal

+0

@faizal все, что вы установили, это makeFocusable() return false; вы можете передать FOCUS_BEFORE_DESCENDANTS или FOCUS_AFTER_DESCENDANTS в метод setDescendantFocusability. – boiledwater

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