ListFragment onItemClickListener无法正常工作

时间:2012-12-29 09:22:09

标签: android android-listfragment

我正在使用标签式布局(使用滑动)。 这里我有3个选项卡,由SectionsPagerAdapter控制。每个选项卡都是一个ListFragment。

现在,我希望在单击列表中的某个项目时触发事件。我希望每个标签都有一个监听器。

这是现在的代码(哪个不起作用,事件没有被触发)。

public class NyhederFragment extends ListFragment {
     public static final String ARG_SECTION_NUMBER = "section_number";
     private static final String TAG="NyhederFragment";
     private List<Item> newsItems;
     private ArrayList newsHeadlines;
     private ArrayAdapter adapter;
     private BroadcastReceiver updateReciever;

public NyhederFragment() {
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    ListView newsList = new ListView(getActivity());
    newsList.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
    newsList.setId(R.id.list);
    DatabaseHelper dbConn = new DatabaseHelper(getActivity());

    newsItems = dbConn.getAllItemsFromNews();
    newsHeadlines = new ArrayList();
    for(Item i : newsItems){
        newsHeadlines.add(i.getTitle());
    }

    adapter = new ArrayAdapter(getActivity(), android.R.layout.simple_list_item_1, newsHeadlines);

    setListAdapter(adapter);

    newsList.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                  int position, long id) {
            Log.i("debug", "single click");
        }
    });

    dbConn.close();

    getActivity().registerReceiver(updateReciever, new IntentFilter("ArticlesUpdated"));
    return newsList;
}
}

这是什么,我做错了?

提前多多感谢!

4 个答案:

答案 0 :(得分:35)

如果您使用的是ListFragment,那么您只需使用其覆盖方法onListItemClick()

即可
@Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        // TODO Auto-generated method stub
        super.onListItemClick(l, v, position, id);
    }

答案 1 :(得分:15)

这是由于自定义列表项。默认焦点是自定义列表项(按钮/文本视图)。它导致了这个问题。

请在list元素的根布局中添加android:descendantFocusability="blocksDescendants"。 希望这会对某人有所帮助。

答案 2 :(得分:0)

setListAdapter(adapter);更改为newsList.setAdapter(adapter);

答案 3 :(得分:0)

如果您想创建或重复使用或现有的实现AdapterView.OnItemClickListener的处理程序,而不是在onListItemClick()中实现ListFragment,您可以通过获取对ListView的引用来实现ListFragment的{​​{1}}并设置其听众。在ListFragment.onResume()你能做到:

@Override
public void onResume() {
    super.onResume();
    ListView listView = getListView();
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Log.d("TAG", "Stop touching me");
        }
    });
}

在我的情况下,我可以使用ActivityListViewListActivityListFragment的同一个侦听器,例如

listView.setOnItemClickListener(new MyListViewOnClickListener(getActivity()));