【问题标题】:ListView with custom adapter, inside a Fragment doesn't fire onItemClick event带有自定义适配器的 ListView,在 Fragment 内不会触发 onItemClick 事件
【发布时间】:2013-05-10 09:39:37
【问题描述】:

我有一个片段内容的 ViewProvider 类,它返回一个片段的 ListView。 ListView 有一个扩展 BaseAdapter 类的自定义适配器。当我尝试实现一个项目点击监听器时,它只是不起作用。我有这个监听器的代码:

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

}

【问题讨论】:

  • 据我所知,您的参数应该是错误的。为什么不通过实现 onItemClickListener 来使用默认的 onItemClick() 方法?或者干脆使用 lv.setOnItemClickListener(new OnItemClickListener() { });
  • 这个方法我试过了,也没用。

标签: android android-listview fragment onitemclicklistener


【解决方案1】:

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

【讨论】:

  • 我在自定义列表行中有一些视图,我使用 ViewHolder 模式来引用它们(设置它们的值),但我没有在其中任何一个上实现点击监听器。我之前在其他应用程序中使用过这种方法,以及 onItemClickListener ,并且它有效。现在,唯一的区别是 Fragment。
  • 实际上这很有帮助,让我考虑了视图及其位置,我意识到我的 TextViews 的 textIsSelectable 设置为 true,这阻止了点击事件的触发,因为该项目需要一个文本选择动作...谢谢。
  • 我在 Listview 上尝试了 OnItemclickListner 并且还放置了按钮,所以它不能通过你的回答解决它感谢 man +1 投票。我为此花了三天时间。
【解决方案2】:

我想建议你 Activity 和 Fragment 几乎相同,但不同之处在于我们使用“this”或“ActivityName.this”的地方我们必须用 getActivity() 替换它并使用视图声明变量,这会膨胀我们的类布局:

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

希望对你有所帮助。

【讨论】:

    猜你喜欢
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多