2014-01-09 2 views
1

ВопросКак я могу обработать onListItemClick (...) на основе того, какой вид внутри строки был нажат?

У меня есть ListView внутри DialogFragment, и я хочу, чтобы огнь некоторых обратных вызовов только тогда, когда некоторые конкретные элементы внутри строк обжигают. Как я могу это сделать?

В принципе, я хочу сделать что-то вроде этого

public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    final int viewId = view.getId(); 
    if ((viewId == R.id.textView1) || (viewId == R.id.textView2)) { 
     // do something... 
    } 

который я не могу. Прочтите, если вы не знаете, почему.

То, что я пытался

Я попытался посмотреть в документации, но OnItemClickListener обратного вызова не предлагает в качестве параметра точно щелкнул вид (вид вы можете увидеть в подписи вся строка) ,

Кроме того, я попытался установить простой обратный вызов onClick на одном представлении в адаптере, но это переопределяет listSelector и другое поведение, которое должен иметь список. Читая в документации, я обнаружил, что явно написано, что мы должны установить обратные вызовы с помощью метода onListItemClick (...) (не через onClick (...)), поэтому я ищу способ сделать это, используя этот метод , чтобы не переопределять поведение по умолчанию в списке по умолчанию.

Я пытался сделать это, работая над xml. К моему удивлению, я обнаружил, что если я установил свойство android:clickable в true, обратный вызов onListItemClick не будет срабатывать (я думал, что это наоборот), , поэтому частичным решением было бы установить android:clickable=true каждый вид в строке отдельно из того, что я хочу запустить обратный вызов, но это не решение, потому что если пользователь нажимает, где есть пробел или пробел, обратный вызов срабатывает. Кроме того, я обнаружил, что если я установил родительский элемент представления строки в android:clickable=true, а дочерние представления, которые я хочу обработать с обратным вызовом, до android:clickable=false, это не сработает, потому что, по-видимому, свойство не перезаписывается.

EDIT Извините за действительно плохой титул, который у меня был до этого, я даже не заметил, что я задал вопрос.

ответ

0

новый ответ, надеюсь, теперь я понял :)

В ваших адаптерах GetView, прикрепить OnClickListener к любому мнению в макете вы хотите стрелять. (Более псевдокод)

public class Adapter extends ArrayAdapter<XYZ> { 

    private int resource; 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if(convertView==null) convertView = ((LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(this.resource, parent, false); 

     ((Button)convertView.findViewById(R.id.YOUR_BUTTON_IN_LAYOUT)).setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       DOSTUFF(); 
      } 
     }); 

     return convertView ; 
    } 


} 

старый Ответ: позиция указывает, где вы находитесь в списке (псевдокод).

listView.setOnItemClickListener(new OnItemClickListener() { 

    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, final int position,long arg3) { 

     YOUR_ITEM_BACKED_BY_ADAPTER item = listView.getItemAtPosition(position); 

     if(item==THE_FIRST_ITEM_IN_LIST) doSomething(); 
     else if(item == THE_LAST_ITEM_IN_LIST) doSomethingElse();    
    } 

}); 
+0

, вы можете прочитать мое редактирование, так как, возможно, предыдущее название привело вас к себе из пути, выяснив, что щелчок на странице был вызван не моя проблема. Мне нужно выяснить, какой вид внутри элемента listItem был нажат. – doplumi

+0

Обновлен мой ответ. – ElDuderino

+0

прочитайте комментарий, который я сделал по вопросу о dafi – doplumi

0

Вы можете установить слушателей для других точек зрения внутри GetView адаптера

public class MyAdapter extends ArrayAdapter<MyItem> implements View.OnClickListener { 
    public View getView(int position, View convertView, ViewGroup parent) { 

     // setup the converView inflating it, for simplicity I've removed that code 

     MyItem item = getItem(position); 
     text1 = (TextView)convertView.findViewById(R.id.text1); 
     text2 = (TextView)convertView.findViewById(R.id.text2); 
     text1.setOnClickListener(this); 
     // pass the item to use when clicked 
     text1.setTag(item); 

     text2.setOnClickListener(this); 
     text2.setTag(item); 
    } 


    public void onClick(View v) { 
     MyItem item = v.getTag(); 

     switch (v.getId()) { 
      case R.id.text1: 
       download(item); 
       break; 
      case R.id.text2: 
       upload(item); 
       break; 
     } 
    } 
} 

Вместо жесткого кодирования действия (например download) внутри адаптера вы можете перейти к нему интерфейс и, например, вызывающей активности может реализуйте этот интерфейс

+0

Это второй абзац «что я пытался». Извините, если это не ясно. Я попытаюсь объяснить, почему это не решение. Если я это сделаю, элемент списка не будет в выбранном состоянии, когда я нажму на него, например. вся строка списка не будет выделена, потому что вы используете простую функцию onClick, в то время как вы ожидаете использовать OnListItemClick. Эта последняя функция, помимо выполнения указанного вами обратного вызова, позаботится о проверке того, что listItem ведет себя так, а не как простой вид. Я ценю, что вы не спешите отвечать, так что спасибо :) – doplumi

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