2013-05-10 39 views
1

我有一个ViewProvider类的片段内容,它为其中一个片段返回一个ListView。 ListView具有扩展BaseAdapter类的自定义适配器。当我尝试实现一个项目点击侦听器时,它不起作用。我有听众的代码:ListView与自定义适配器,在片段内不会触发onItemClick事件

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

根据我的知识你的参数应该是错的。为什么不通过实现onItemClickListener使用默认的onItemClick()方法?或者简单地使用lv.setOnItemClickListener(new OnItemClickListener(){}); – Maulik 2013-05-10 10:47:35

+0

我试过这种方式,它也没有工作。 – 2013-05-10 11:02:47

回答

6

上项目点击收听的ListView,如果您有任何focussable里面的物品自定义列表row.That是,如果您有任何按钮或progrees不火酒吧或任何控制,需要重点,onitemclick不会发射

+0

我在自定义列表行中有一些视图,并且使用ViewHolder模式来引用它们(设置它们的值),但是我没有在其中任何一个上实现点击监听器。我以前使用过这种方法,在其他应用程序中使用onItemClickListener,并且它工作正常。现在唯一的区别是片段。 – 2013-05-10 10:59:51

+0

事实上,这帮助,让我思考的意见和他们的位置,我意识到我有TextViews textIsSelectable设置为true,从而防止点击事件的发射,因为该项目预计文本选择操作...谢谢。 – 2013-05-10 11:39:35

+0

我尝试在ListView的OnItemclickListner并且还把按钮,所以它不工作的答案,它解决谢谢男人+1投票。我花了三天的时间。 – 2015-12-21 10:38:22

1

我想建议你,活动和片段几乎相同,但差异是我们使用“this”或“ActivityName.this”我们必须取代它通过getActivity()并声明va通过使用视图膨胀我们的类布局:

请确保您使用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); 
} 

尝试通过实现onItemClickListener默认使用onItemClick侦听器。

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

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

希望它会帮助你。

相关问题