简体   繁体   English

具有自定义适配器的ListView,在Fragment内不会触发onItemClick事件

[英]ListView with custom adapter, inside a Fragment doesn't fire onItemClick event

I have a ViewProvider class for the Fragment content, which returns a ListView for one of the fragments. 我有一个Fragment内容的ViewProvider类,该类返回其中一个片段的Lis​​tView。 The ListView has a custom adapter extending the BaseAdapter class. ListView具有扩展BaseAdapter类的自定义适配器。 When I try implement an item click listener, it just doesn't work. 当我尝试实现项目单击侦听器时,它根本不起作用。 I have this code for the listener: 我为侦听器提供了以下代码:

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...");
        }
    }
});

...not even the exceptions fires. ...甚至没有例外发生。 In the same ViewProvider class, I've added another list with a SimpleAdapter, and it works just fine. 在同一个ViewProvider类中,我添加了另一个带有SimpleAdapter的列表,并且效果很好。 I initialize the list the same: 我初始化列表相同:

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

and the other one: 另一个:

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 );

What am I missing, where should I look? 我想念的是什么?

Here is my EventAdapter: 这是我的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;
}

} }

如果自定义列表行中有可聚焦的项目,则项目单击侦听器上的ListView不会触发。也就是说,如果您有任何按钮或进度条或任何获得焦点的控件,onitemclick将不会触发

I would like to suggest you that Activity and Fragment are almost same but the difference is where we use "this" or "ActivityName.this" we have to replace it by getActivity() and declare variables by using view which inflates our class layout: 我想建议您,Activity和Fragment几乎相同,但是不同之处在于我们使用“ this”或“ ActivityName.this”的地方,我们必须将其替换为getActivity(),并使用使类布局夸大的视图声明变量:

Make sure you are using ListView find view by id like this. 确保您正在使用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);
}

Try to use by default onItemClick listener by implementing onItemClickListener. 尝试通过实现onItemClickListener来默认使用onItemClick侦听器。

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

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

Hope it will help you. 希望对您有帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM