【问题标题】:Simple Listview in fragment using SimpleAdapter片段中使用 SimpleAdapter 的简单 Listview
【发布时间】:2014-10-31 05:57:51
【问题描述】:

这是我的片段扩展 ListFragment 的代码,下面是它显示的错误。几乎相同的代码在活动中工作正常,除了在活动中我通过

获取列表视图
ListView lv = getListView();

在片段中通过

lv= (ListView)rootView.findViewById(R.id.list);

它在 java:109 lv.setOnItemClickListener(new AdapterView.OnItemClickListener() 行显示空指针异常 如果我删除 setOnItemClickListener 它会在 lv.setAdapter(adapter); 上显示空指针异常 SoundCloudFragment.java

 public class SoundCloudFragment extends ListFragment {
        private ProgressDialog pDialog;
        private FragmentActivity myContext;
        ListView lv;
        @Override
        public void onAttach(Activity activity) {

            if (activity instanceof FragmentActivity) {
                myContext = (FragmentActivity) activity;


            }

            super.onAttach(activity);
        }





        // contacts JSONArray
        JSONArray contacts = null;

        // Hashmap for ListView
        ArrayList<HashMap<String, String>> contactList;


        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            // mVisulizerView = (VisualizerView)findViewById(R.id.visualizerView);

            View rootView = inflater.inflate(R.layout.soundcloud, container, false);
            lv= (ListView)rootView.findViewById(R.id.list);
            // Get ListView object from xml


     //   lv = getListView();

          lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {

                @Override
                public void onItemClick(AdapterView<?> parent, View view,
                                        int position, long id)
                {
                    // getting values from selected ListItem
                    String name = ((TextView) view.findViewById(R.id.name)).getText().toString();
                    String cost = ((TextView) view.findViewById(R.id.email)).getText().toString();
                    String description = ((TextView) view.findViewById(R.id.mobile)).getText().toString();

                    // Starting single contact activity
                    Intent in = new Intent(myContext,
                            SingleContactActivity.class);
                    in.putExtra("name", TAG_TITLE);
                    in.putExtra("id", cost);

                    startActivity(in);

                }
            });

            // Calling async task to get json
            new GetContacts().execute();
            return rootView;
        }
        private class GetContacts extends AsyncTask<Void, Void, Void>  {

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                // Showing progress dialog
                pDialog = new ProgressDialog(myContext);
                pDialog.setMessage("Please wait...");
                pDialog.setCancelable(false);
                pDialog.show();

            }

            @Override
            protected Void doInBackground(Void... arg0) {
                // Creating service handler class instance
                ServiceHandler sh = new ServiceHandler();

                // Making a request to url and getting response
                String jsonStr = sh.makeServiceCall(url, ServiceHandler.GET);

                Log.d("Response: ", "> " + jsonStr);

                if (jsonStr != null) {
                    try {
                        JSONArray json = new JSONArray(jsonStr);

                        // looping through All Contacts
                        for (int i = 0; i < json.length(); i++) {
                            JSONObject jsonObj = json.getJSONObject(i);
                            //JSONObject c = contacts.getJSONObject(i);

                            String title = jsonObj.getString(TAG_TITLE);
                            String id = jsonObj.getString(TAG_ID);
                            String kind = jsonObj.getString(TAG_KIND);
                            String duration =jsonObj.getString(TAG_DURATION);
                        /*  String gender = c.getString(TAG_GENDER);

                            // Phone node is JSON Object
                            JSONObject phone = c.getJSONObject(TAG_PHONE);
                            String mobile = phone.getString(TAG_PHONE_MOBILE);
                            String home = phone.getString(TAG_PHONE_HOME);
                            String office = phone.getString(TAG_PHONE_OFFICE);*/

                            // tmp hashmap for single contact
                            HashMap<String, String> contact = new HashMap<String, String>();

                            // adding each child node to HashMap key => value
                            contact.put(TAG_TITLE, title);
                            contact.put(TAG_ID, id);
                            contact.put(TAG_KIND, kind);
                            contact.put(TAG_DURATION, duration);


                            // adding contact to contact list
                            contactList.add(contact);
                        }
                    } catch (JSONException e)
                    {
                        e.printStackTrace();
                    }
                } else {
                    Log.e("ServiceHandler", "Couldn't get any data from the url");
                }

                return null;
            }

            @Override
            protected void onPostExecute(Void result) {
                super.onPostExecute(result);
                // Dismiss the progress dialog
                if (pDialog.isShowing())
                    pDialog.dismiss();
                /**
                 * Updating parsed JSON data into ListView
                 * */
                ListAdapter adapter = new SimpleAdapter(
                        myContext, contactList,
                        R.layout.soundcloud_item, new String[] { TAG_TITLE, TAG_ID,
                        TAG_KIND }, new int[] { R.id.name,
                        R.id.email, R.id.mobile });

              lv.setAdapter(adapter);

            }

        }


    }

错误-

 FATAL EXCEPTION: main
        java.lang.NullPointerException
                at com.peoplecloud.guggu.ui.fragment.SoundCloudFragment.onCreateView(SoundCloudFragment.java:109)
                at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:829)
                at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1035)
                at android.app.BackStackRecord.run(BackStackRecord.java:635)
                at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1397)
                at android.app.FragmentManagerImpl$1.run(FragmentManager.java:426)
                at android.os.Handler.handleCallback(Handler.java:615)
                at android.os.Handler.dispatchMessage(Handler.java:92)
                at android.os.Looper.loop(Looper.java:153)
                at android.app.ActivityThread.main(ActivityThread.java:5086)
                at java.lang.reflect.Method.invokeNative(Native Method)
                at java.lang.reflect.Method.invoke(Method.java:511)
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:821)
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
                at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 你确定你的适配器不为空
  • @PramodYadav 我正在通过 'ListAdapter adapter = new SimpleAdapter( myContext, contactList, R.layout.soundcloud_item, new String[] { TAG_TITLE, TAG_ID, TAG_KIND }, new int 在 postexecute 中为适配器赋值[] { R.id.name, R.id.email, R.id.mobile });'.
  • @PramodYadav 在活动中,我通过 'ListAdapter adapter = new SimpleAdapter( SoundcloudActivity.this, contactList, R.layout.soundcloud_item, new String[] { TAG_TITLE, TAG_ID, TAG_KIND }, new int [] { R.id.name, R.id.email, R.id.mobile });'效果很好..
  • 你能发布 soundcloud xml 吗?或者你是否在这个xml中定义了ListView,如果没有,那么你必须尝试相同的FragmentActivity,如:lv = getListView();
  • 试试这个 lv= (ListView)rootView.findViewById(android.R.id.list);

标签: android listview android-fragments android-listfragment


【解决方案1】:

试试这个方法,希望能帮助你解决问题。

有两种方法可以给 ListView id。

1.android 预定义的id like:

XML

<ListView
   android:id="@android:id/list"

活动

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

片段

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

2.自定义 id 像:

XML

<ListView
   android:id="@+id/list"

活动

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

片段

lv= (ListView)rootView.findViewById(R.id.list); 

【讨论】:

    【解决方案2】:

    尝试使用此代码获取您的 ListView:

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

    当您使用ListFragment 作为基类时。此外,如果您将列表正确地放入您的 xml 文件中,您可能需要使用 android.R.id.list 来获取您的列表。

    【讨论】:

    • getListView() 在片段中不起作用..无法解析方法
    【解决方案3】:

    试试这个。

    ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.soundcloud, container, false);
    

    还有你的 onItemClick

    // 启动单个联系人活动

    Intent in = new Intent(getActivity().getApplicationContext(),
                       SingleContactActivity.class);
              in.putExtra("name", TAG_TITLE);
              in.putExtra("id", cost);
              startActivity(in);
    

    【讨论】:

    • @MS Gadag -- 关于您建议的编辑,this 是一个非常糟糕的编辑。代码标记仅用于代码,不用于强调。像“服务器”、“IP”和“域”这样的词是不是代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 2018-02-08
    相关资源
    最近更新 更多