片段内的ListView上的OnItemClickListener无法正常工作

时间:2013-02-15 17:17:28

标签: android listview fragment onclicklistener

编辑:已解决。如果在项目的XML中有任何可聚焦的东西,它将打破列表的触摸,换句话说,android:focusable = false对所有复选框,开关或类似于ur列表的任何内容。并完成=)

好的,这是我的问题。

我写了一个使用标签和片段的应用程序,这一切都按照我想要的方式进行,除了当我尝试在listView上捕获onItemClick时,它甚至没有将行标记为已触摸/按下/已选择。

我一直在阅读一下,很多人也有同样的问题,但我没有找到任何帮助我的回复。

我不想实现ListFragment,事实上我甚至不知道我应该怎么做/为什么,因为我的所有代码都已经工作了,我不知道实现一个会给我更多的工作要做,所以,这里是:

是否可以在片段内部实现listView上单击的侦听器?如果是的话,怎么样?

PD:minSDK = 14,tatgetSDK = 15

7 个答案:

答案 0 :(得分:9)

刚刚放

android:focusable="false"
android:clickable="false"

布局。 适用于所有文本视图,按钮等。

答案 1 :(得分:5)

这可能会有所帮助 raghunanadan在下面的链接回答解决了我的问题

listview OnItemClick listner not work in fragment

将其添加到布局

android:descendantFocusability="blocksDescendants"

答案 2 :(得分:4)

这是一个代码片段,它可以做你想要的。

ListView lv;

//code to get the listView instance using findViewByID etc

lv.setOnItemClickListener(new OnItemClickListener()
{
    @Override public void onItemClick(AdapterView<?> arg0, View arg1,int position, long arg3)
    { 
        Toast.makeText(EnclosingActivity.this, "Stop Clicking me", Toast.LENGTH_SHORT).show();
    }
});

人们通常会这样做,看看你是否覆盖了这个:

所有点击和回调(例如:菜单/操作栏回调)都会发送到片段绑定的活动,因此它们必须位于活动类中,而不是片段类。

答案 3 :(得分:2)

如果你从片段中扩展ListFragment,知道在你的活动创建之前不会调用mListView.setOnItemClickListener,那么两个很棒的解决方案是这样的,正如@ dheeraj-bhaskar暗示的那样。此解决方案确保在创建活动时设置

@Override
    public void onActivityCreated(Bundle savedInstanceState)
    {
        super.onActivityCreated(savedInstanceState);
        mListView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long rowId) {
                // Do the onItemClick action

                Log.d("ROWSELECT", "" + rowId);
            }
        });
    }

在查看ListFragment的源代码时,我遇到了这个

    public class ListFragment extends Fragment {
        ...........................................
     ................................................

        final private AdapterView.OnItemClickListener mOnClickListener
                = new AdapterView.OnItemClickListener() 
{
            public void onItemClick(AdapterView<?> parent, View v, int position, long id) 
{
                onListItemClick((ListView)parent, v, position, id);
            }
        };
       .................................................................
    ........................................................................

    public void onListItemClick(ListView l, View v, int position, long id) 
{
        }
}

附加onItemClickListener个对象并调用onListItemClick() 因此,以完全相同的方式工作的其他类似解决方案是覆盖onListItemClick()

 @Override
        public void onListItemClick(ListView l, View v, int position, long rowId) {
            super.onListItemClick(l, v, position, id);
           // Do the onItemClick action

                    Log.d("ROWSELECT", "" + rowId);
        } 

答案 4 :(得分:1)

如果您想将数据从片段传递到Listview上的任何活动,请单击,然后您可以修改您的代码,如...

class HistoryFragment extends Fragment {  ListView historyListView;
public HistoryFragment() {
    // Required empty public constructor
}

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

    View v= inflater.inflate(R.layout.fragment_history, container, false);
    historyListView= (ListView) v.findViewById(R.id.historyDataListView);

    sendRequest();  //it is my meathod to load the listview and set the adapter
    return  v;
}

public void onStart() {
    super.onStart();
    historyListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

            Intent intent=new Intent(getActivity(), DisplayDetails.class);

            intent.putExtra("text", historyListView.getItemAtPosition((int) l).toString());
            startActivity(intent);
          //  Toast.makeText(getActivity(),"Hello.. "+historyListView.getItemAtPosition((int) l).toString(),Toast.LENGTH_LONG).show();
        }
    });
}}

答案 5 :(得分:0)

以下是工作流程的概述,创建您的ListView及其对应的Adapter(用于将基础数据映射到ListView中的项目),将适配器设置为ListView,然后添加OnItemClickListener

更多详情和示例代码可在以下网址找到:http://developer.android.com/guide/topics/ui/declaring-layout.html#AdapterViews

答案 6 :(得分:-1)

按钮会影响监听器,请尝试避免使用按钮并重新编译, 它应该工作