【问题标题】:Android - ListFragment OnClickListener is not workingAndroid - ListFragment OnClickListener 不起作用
【发布时间】:2013-08-02 04:05:24
【问题描述】:

我的 android 应用程序中有一个 ListFragment,我已经让它工作了,但是 OnClick 监听器没有工作,我试着做它,以便当列表上的任何项目被选择时,一个 Toast 出现并且它没有发生,没有错误,所以我没有 LogCat 可以发布

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // TODO Auto-generated method stub

    View v = inflater.inflate(R.layout.main, container, false);

    ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>();


//...

    ListAdapter adapter = new SimpleAdapter(getActivity(), menuItems,
            R.layout.list_item,
            new String[] { KEY_NAME, KEY_DESC, KEY_COST }, new int[] {
                    R.id.name, R.id.desciption, R.id.cost });

    setListAdapter(adapter);

    ListView lv = (ListView)v.findViewById(android.R.id.list);

    lv.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            // getting values from selected ListItem

            Toast.makeText(getActivity().getApplicationContext(), "Not Configured",
                    Toast.LENGTH_SHORT).show();

        }
    });

    return v;
}

谢谢

【问题讨论】:

  • 尝试删除.getApplicationContext() for toast。
  • @S.D.没有解决问题
  • 可能是 listView 的子项设置了clickable 属性或有自己的 onClickListeners?

标签: android listview android-fragments onclicklistener android-listfragment


【解决方案1】:

如果您的类扩展了 ListFragment,那么您需要做的只是覆盖其 onListItemClick 方法。

@Override
public void onListItemClick(ListView l, View v, int pos, long id) {
  super.onListItemClick(l, v, pos, id);
  Toast.makeText(getActivity(), "Item " + pos + " was clicked", Toast.LENGTH_SHORT).show();
}

【讨论】:

    【解决方案2】:

    ListFragment 子类已经有了它的 overriden onListItemClick 方法。

    文档说

    This method will be called when an item in the list is selected. Subclasses should override
    

    因此无需为您的列表视图声明另一个列表器。

    【讨论】:

      【解决方案3】:

      删除.getApplicationContext() 应该可以。我制作的应用程序中有一些类似于您的代码。它也来自片段内部,尽管没有问题。 db.remove 可能与您的代码无关,因为此代码是为具有数据库的应用程序编写的。也可以尝试将new OnItemClickListener 更改为new AdapterView.OnItemClickListener

          listItem.setOnItemClickListener(new AdapterView.OnItemClickListener() {
              @Override
              public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                  db.remove( (int) l);
                  Toast.makeText(getActivity(), "Item Deleted", Toast.LENGTH_LONG).show();
              }
          });
      

      如果这不起作用,也许可以尝试创建一个 Context 实例变量,例如:

      private Context ctx = getActivity();
      

      private final Context ctx = getActivity();
      

      不过,我以前从未使用过 ListFragments,所以我不确定我写的任何东西是否会起作用。

      【讨论】:

        【解决方案4】:

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

        到你行中的所有项目

        【讨论】:

          【解决方案5】:

          确保你

          1. 适配器内不应有 onclicklistener

          2.在你的 XML 布局中

          R.layout.main

          Listview 应该像这样初始化

           <ListView
              android:onClick="@id/list"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:layout_below="@+id/textHeader"
              android:layout_margin="5dp"
              android:divider="@color/DeepPink"
              android:dividerHeight="1sp"
              android:gravity="center"
              android:horizontalSpacing="1dp"
              android:visibility="visible" >
          

          这里 id android:onClick="@id/list" 重要

          1. 如果你用 ListFragment 而不是 Fragment 扩展你的片段,ListView 应该像 ListView lv = getListView 一样初始化

          【讨论】:

            猜你喜欢
            • 2018-10-21
            • 2021-03-17
            • 2015-10-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-06-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多