2013-05-10 2 views
1

У меня есть класс ViewProvider для содержимого фрагмента, который возвращает ListView для одного из фрагментов. В ListView есть пользовательский адаптер, расширяющий класс BaseAdapter. Когда я пытаюсь реализовать элемент clicker, он просто не работает. У меня есть этот код для слушателя:ListView с пользовательским адаптером внутри Fragment не срабатывает onItemClick event

lv.setOnItemClickListener(new ListView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> a, View vi, int pos, 
       long id) { 
     try { 
      Object o = lv.getItemAtPosition(pos); 
      Event obj_itemDetails = (Event) o; 
      Toast.makeText(context, "You have chosen : " + " " + obj_itemDetails.getName(), Toast.LENGTH_LONG).show(); 
      Log.d("xxx", "output: "+obj_itemDetails.getName()); 
     } catch(Exception e) { 
      Log.d(Log.TAG, "Something is wrong..."); 
     } 
    } 
}); 

... даже за исключением пожаров. В том же классе ViewProvider я добавил еще один список с SimpleAdapter, и он работает отлично. Я инициализировать список тот же:

EventAdapter sta = new EventAdapter(context, events); 
final ListView lv = new ListView(context); 
lv.setTextFilterEnabled(true); 
lv.setAdapter(sta); 

, а другой:

final ListView v = new ListView(context); 
String[] from = new String[] { "str" }; 
int[] to = new int[] { android.R.id.text1 }; 
List<Map<String, String>> items = new ArrayList<Map<String, String>>(); 
for (int i = 0; i < 20; i++)...//set the items here 
SimpleAdapter adapter = new SimpleAdapter(context, items, 
     android.R.layout.simple_list_item_1, from, to); 
v.setAdapter(adapter); 

Что я упускаю, где я должен смотреть?

Вот мой EventAdapter:

public class EventAdapter extends BaseAdapter { 

private LayoutInflater mInflater; 

private List<Event> items = new ArrayList<Event>(); 

Context ctx; 

public EventAdapter(Context context, List<Event> items) { 
    mInflater = LayoutInflater.from(context); 
    this.items = items; 
    this.ctx = context; 
} 

public int getCount() { 
    return items.size(); 
} 

public Event getItem(int position) { 
    return items.get(position); 
} 

public long getItemId(int position) { 
    return position; 
} 

public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    final Event s = items.get(position); 
    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.list_item, null); 
     holder = new ViewHolder(); 
     holder.name = (TextView) convertView.findViewById(R.id.eventTitle); 
     holder.timestamp = (TextView) convertView.findViewById(R.id.eventTime); 
     holder.location = (TextView) convertView.findViewById(R.id.eventLocation); 
     holder.pic = (ImageView) convertView.findViewById(R.id.eventLogo); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 
    holder.name.setText(s.getName()); 
    holder.timestamp.setText(s.getTimestamp()); 
    holder.location.setText(s.getLocation()); 
    if (s.getImage() != null) { 
     holder.pic.setImageBitmap(s.getImage()); 
    } else { 
     // MY DEFAULT IMAGE 
     holder.pic.setImageResource(R.drawable.ic_launcher); 
    } 
    return convertView; 
} 

static class ViewHolder { 
    TextView name; 
    TextView timestamp; 
    TextView location; 
    ImageView pic; 
} 

}

+0

согласно моим знаниям, ваш параметр должен быть неправильным. и почему вы не используете метод onItemClick() по умолчанию, реализуя onItemClickListener? или просто используйте lv.setOnItemClickListener (новый OnItemClickListener() {}); – Maulik

+0

Я пробовал этот путь, он тоже не работал. –

ответ

6

ListView на нажмом слушателе не срабатывает, если у вас есть какие-либо Фокусируемые элементы внутри пользовательского список row.That если у вас есть какая-либо кнопка или progrees бар или любой элемент управления, который фокусируется, onitemclick не срабатывает

+0

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

+0

На самом деле это помогло мне задуматься над представлениями и их позиционированием, и я понял, что у меня есть TextViews с набором textIsSelectable равным true, что предотвратило запуск события click, потому что элемент ожидал действия по выбору текста ... Спасибо , –

+0

Я пробовал OnItemclickListner в Listview, а также кнопку put, чтобы он не работал вашим ответом, который он решает, спасибо человеку +1 за это. Я потратил три дня на это. – 2015-12-21 10:38:22

1

Я хотел бы предложить вам, что Activity и Fragment почти такие же, но разница в том, где мы используем «this» или «ActivityName.this», мы должны его заменить by getActivity() и объявить va riables, используя представление, которое раздувает наш класс макета:

Убедитесь, что вы используете ListView для поиска по id, как это.

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     super.onCreateView(inflater, container, savedInstanceState); 
    // Inflate the layout for this fragment 
    View v = inflater.inflate(R.layout.yourlayoutfile, container, 
        false); 

    listView = (ListView) v 
        .findViewById(R.id.your_listview_id); 

    listView.setOnItemClickListener(YourFragmentClassName.this); 
} 

Попробуйте использовать по умолчанию onItemClick слушателя путем внедрения onItemClickListener.

@Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
     // TODO Auto-generated method stub 

     Log.d("OnItemClicked>>", "called"); 
} 

Надеюсь, это поможет вам.

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

  • Нет связанных вопросов^_^