ListView onItemClick未调用

时间:2015-05-19 23:17:35

标签: android listview android-fragments android-listview android-4.0-ice-cream-sandwich

我已经看到了所有相关的问题,并尝试了他们的答案。我在一个片段中有一个ListView,它的onItemClick方法在一个活动内部被调用,但在另一个活动中没有被调用。其他一切都是一样的。我试过了:

  • 明确更改android:clickable
  • 明确更改android:focusableandroid:focusableInTouchMode
  • 致电listView.setItemsCanFocus
  • 在片段和活动根目录上添加android:descendantFocusability="blocksDescendants"属性。

不过,它还没有用。它是具有相同适配器的相同片段,它没有关于在哪个活动中的条件。但是,在一个活动中它完美地运行,而在另一个活动中,onItemClick不会被调用。我在ICS。为什么会这样?

更新

以下是我的片段中的相关代码:

dataSource = (ArrayList<Map<String, Object>>) task.getResult();
    
FeedAdapter adapter = new FeedAdapter(getActivity(), dataSource, getUser());
    
ListView list = (ListView) rootView.findViewById(R.id.listView);
    
list.setItemsCanFocus(true);
   //just trying these 
list.setOnItemClickListener(self);
    
list.setAdapter(adapter);
    
adapter.notifyDataSetChanged();
    
if (dataSource.size() == 0) {
    
    noPostsLabel.setVisibility(View.VISIBLE);
    
}

在我的适配器中:

public View getView(int position, View convertView, ViewGroup parent) {
    View view;
    final Map<String, Object> post = objects.get(position);
    LayoutInflater inflater = LayoutInflater.from(getContext());
    if (convertView == null || convertView.getId() == R.id.headerRoot) {
        view = inflater.inflate(R.layout.list_item_post_layout, parent, false);
    } else {
        view = convertView;
    }
    view.setClickable(false); //just trying these two now, they weren't here originally
    view.setFocusable(false);
    //populate
    view.setTag(post);

    [...] //populate the cell. very long code, redacted.

    return view;

}

更新2:

我也意识到一些单元格在我的“工作”活动中也是不可选的,当它们在单元格中有一个可见的Horizo​​ntalScrollView时(我有文件附加功能,它只有在有文件时才可见。否则,它在GONE能见度状态)。我不知道为什么会造成这样的麻烦。

更新3:

我还发现单元格内部的视图是响应式的。它只是单元格视图本身没有输入。

更新4:

我最终将抽头处理程序逻辑移动到单元格布局本身,而不是依赖于列表视图的处理程序。我知道这不是一个好习惯,但我必须在截止日期前完成。此外,现在它的工作非常顺利。我没有关闭/回答问题,因为技术问题仍然存在,我还没有找到真正的解决方案。我刚刚使用了一种解决方法来满足我的项目截止日期。

2 个答案:

答案 0 :(得分:1)

我不确定您的问题,但我没有看到要调试的完整代码。 我将提交一个通常应该在片段中工作的示例代码。

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
   ListView list = (ListView) view.findViewById(R.id.listView);

   list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
      @Override
      public void onItemClick(AdapterView<?> parent, View view, int positi   on, long id) {
          Log.d(TAG, "onItemClick");
     }
   });

注意:

  • 我不使用root或任何其他缓存对象。我使用view参数调用findViewById()。
  • 我也不了解自己。相反,我实例化了一个新视图或AdapterView。

答案 1 :(得分:0)

您是否尝试过为片段设置回调?这就是Android推荐的方式。您可以查看 - https://developer.android.com/training/basics/fragments/communicating.html#Deliver