14

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

好的,这是我的问题。

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

我一直在阅读一些内容,很多人都有同样的问题,但我没有找到任何对我有帮助的回复。

我不想实现 ListFragment,事实上我什至不知道我应该如何/为什么应该,而且由于我所有的代码都已经在工作,我不知道实现一个是否会给我更多的工作要做,所以,这里是:

是否可以在片段内为单击 listView 实现侦听器?如果是,如何?

PD:minSDK=14,tatgetSDK=15

4

7 回答 7

9

就放

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

在布局中。对于所有文本视图、按钮等。

于 2013-12-09T06:11:01.533 回答
5

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

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

人们通常会为此而旅行,看看你是否得到了这个覆盖:

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

于 2013-02-15T18:15:53.103 回答
5

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

listview OnItemClick 列表器在片段中不起作用

将此添加到布局中

android:descendantFocusability="blocksDescendants"

于 2015-10-09T07:06:09.513 回答
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);
        } 
于 2015-06-10T07:31:12.057 回答
0

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

更多细节和示例代码可以在以下位置找到:http: //developer.android.com/guide/topics/ui/declaring-layout.html#AdapterViews

于 2013-02-15T17:37:28.363 回答
0

如果您想将数据从片段传递到 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();
        }
    });
}}
于 2017-02-08T03:35:44.163 回答
-1

按钮会影响监听器,尽量避免使用按钮并重新编译,它应该可以工作

于 2019-01-06T11:30:20.443 回答