使用XML的Android片段列表视图

使用XML的Android片段列表视图,android,listview,Android,Listview,在尝试将listview实现到片段中后,我遇到了一个错误。请检查我的代码,除了使用listview lv=getListView();,我还在尝试为我的listview扩展xml布局。我知道这个方法有效,但我不想那样。请帮我更正代码 日志: 11-07 10:54:36.828: E/AndroidRuntime(2947): FATAL EXCEPTION: main 11-07 10:54:36.828: E/AndroidRuntime(2947): java.lang.NullPoint

在尝试将listview实现到片段中后,我遇到了一个错误。请检查我的代码,除了使用listview lv=getListView();,我还在尝试为我的listview扩展xml布局。我知道这个方法有效,但我不想那样。请帮我更正代码

日志:

11-07 10:54:36.828: E/AndroidRuntime(2947): FATAL EXCEPTION: main
11-07 10:54:36.828: E/AndroidRuntime(2947): java.lang.NullPointerException
11-07 10:54:36.828: E/AndroidRuntime(2947):     at testing.app.FreeFragment$loadListView.onPostExecute(FreeFragment.java:132)
11-07 10:54:36.828: E/AndroidRuntime(2947):     at testing.app.FreeFragment$loadListView.onPostExecute(FreeFragment.java:1)
11-07 10:54:36.828: E/AndroidRuntime(2947):     at android.os.AsyncTask.finish(AsyncTask.java:417)
11-07 10:54:36.828: E/AndroidRuntime(2947):     at android.os.AsyncTask.access$300(AsyncTask.java:127)
11-07 10:54:36.828: E/AndroidRuntime(2947):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
11-07 10:54:36.828: E/AndroidRuntime(2947):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-07 10:54:36.828: E/AndroidRuntime(2947):     at android.os.Looper.loop(Looper.java:130)
11-07 10:54:36.828: E/AndroidRuntime(2947):     at android.app.ActivityThread.main(ActivityThread.java:3691)
11-07 10:54:36.828: E/AndroidRuntime(2947):     at java.lang.reflect.Method.invokeNative(Native Method)
11-07 10:54:36.828: E/AndroidRuntime(2947):     at java.lang.reflect.Method.invoke(Method.java:507)
11-07 10:54:36.828: E/AndroidRuntime(2947):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907)
11-07 10:54:36.828: E/AndroidRuntime(2947):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665)
11-07 10:54:36.828: E/AndroidRuntime(2947):     at dalvik.system.NativeStart.main(Native Method)
mainactivity.java

public class MainActivity extends SherlockFragmentActivity {
    Tab tab;


    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);



        AppRater.app_launched(this);
        if (!isNetworkAvailable()) {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setMessage("Internet Connection Required")
                    .setCancelable(false)
                    .setPositiveButton("Exit",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,
                                        int id) {
                                    finish();
                                }

                            });
            AlertDialog alert = builder.create();
            alert.show();

        } else {

            ActionBar actionBar = getSupportActionBar();
            actionBar.setDisplayShowHomeEnabled(false);
            actionBar.setDisplayShowTitleEnabled(false);
            actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);




            tab = actionBar.newTab().setTabListener(new FreeFragment())
                    .setIcon(R.drawable.free);
            actionBar.addTab(tab);

            tab = actionBar.newTab().setTabListener(new BuyFragment())
                    .setIcon(R.drawable.buy);
            actionBar.addTab(tab);

            tab = actionBar.newTab().setTabListener(new ReaderFragment())
                    .setIcon(R.drawable.reader);
            actionBar.addTab(tab);
        }
    }

    private boolean isNetworkAvailable() {
        ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager
                .getActiveNetworkInfo();
        return activeNetworkInfo != null;
    }



}
freefragment.java

 public class FreeFragment extends Fragment implements
        ActionBar.TabListener {

    static final String URL = "https://myxml.xml";
    static final String KEY_SONG = "song";
    static final String KEY_ID = "id";
    static final String KEY_TITLE = "title";
    static final String KEY_CAT_ARTIST = "artistcat";
    static final String KEY_DURATION = "duration";
    static final String KEY_THUMB_URL = "thumb_url";
    static final String KEY_BIG_URL = "big_url";
    static final String KEY_CAT_URL = "cat_url";
    static final String KEY_DESC = "cat_desc";
    ArrayList<HashMap<String, String>> menuItems;
    ListAdapter adapter;
    private Fragment mFragment;

    ListView lv;

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

            View v = inflater.inflate(R.id.listview); //<--- what do i inflate here? 
            lv = (ListView) v.findViewById(R.id.list);

            if (!isNetworkAvailable()) {
                AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
                builder.setMessage("Internet Connection Required")
                        .setCancelable(false)
                        .setPositiveButton("Exit",
                                new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog,
                                            int id) {
                                        FileCache loader = new FileCache(null);
                                        loader.clear();  
                                        getActivity().finish();
                                    }

                                });
                AlertDialog alert = builder.create();
                alert.show();

            } else {

                new loadListView().execute();

            }


            return v;
    }



    private boolean isNetworkAvailable() {
        ConnectivityManager connectivityManager = (ConnectivityManager) getActivity()
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager
                .getActiveNetworkInfo();
        return activeNetworkInfo != null;
    }

    public class loadListView extends AsyncTask<Integer, String, String> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected String doInBackground(Integer... args) {
            // updating UI from Background Thread
            menuItems = new ArrayList<HashMap<String, String>>();

            XMLParser parser = new XMLParser();
            String xml = parser.getXmlFromUrl(URL); // getting XML
            Document doc = parser.getDomElement(xml); // getting DOM element

            NodeList nl = doc.getElementsByTagName(KEY_SONG);
            // looping through all item nodes <item>
            for (int i = 0; i < nl.getLength(); i++) {
                // creating new HashMap
                HashMap<String, String> map = new HashMap<String, String>();
                Element e = (Element) nl.item(i);
                // adding each child node to HashMap key => value
                map.put(KEY_ID, parser.getValue(e, KEY_ID));
                map.put(KEY_TITLE, parser.getValue(e, KEY_TITLE));
                map.put(KEY_CAT_ARTIST, parser.getValue(e, KEY_CAT_ARTIST));
                map.put(KEY_DURATION, parser.getValue(e, KEY_DURATION));
                map.put(KEY_THUMB_URL, parser.getValue(e, KEY_THUMB_URL));
                map.put(KEY_BIG_URL, parser.getValue(e, KEY_BIG_URL));
                map.put(KEY_CAT_URL, parser.getValue(e, KEY_CAT_URL));
                map.put(KEY_DESC, parser.getValue(e, KEY_DESC));
                // adding HashList to ArrayList
                menuItems.add(map);
            }
            return null;
        }

        @Override
        protected void onPostExecute(String args) {

            if (getActivity() != null) {
                adapter = new MainPageLazyAdapter(getActivity(), menuItems);
                lv = (ListView)getActivity().findViewById(R.id.list);                                 
                //setListAdapter(adapter);
                lv.setAdapter(adapter);


            }

        }
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        mFragment = new FreeFragment();
        ft.add(android.R.id.content, mFragment);
        ft.attach(mFragment);
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        ft.remove(mFragment);
    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {

    }
}
公共类FreeFragment扩展了片段实现
ActionBar.TabListener{
静态最终字符串URL=”https://myxml.xml";
静态最终字符串键\u SONG=“SONG”;
静态最终字符串键\u ID=“ID”;
静态最终字符串键\u TITLE=“TITLE”;
静态最终字符串键\u CAT\u ARTIST=“artistcat”;
静态最终字符串键\u DURATION=“DURATION”;
静态最终字符串键\u THUMB\u URL=“THUMB\u URL”;
静态最终字符串键\u BIG\u URL=“BIG\u URL”;
静态最终字符串键\u CAT\u URL=“CAT\u URL”;
静态最终字符串键_DESC=“cat_DESC”;
ArrayList菜单项;
列表适配器;
私人碎片;
ListView lv;
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
视图v=充气机。充气(R.id.listview);//值
put(KEY_ID,parser.getValue(e,KEY_ID));
put(KEY_TITLE,parser.getValue(e,KEY_TITLE));
put(KEY_CAT_ARTIST,parser.getValue(e,KEY_CAT_ARTIST));
put(KEY_DURATION,parser.getValue(e,KEY_DURATION));
put(KEY_THUMB_URL,parser.getValue(e,KEY_THUMB_URL));
put(KEY_BIG_URL,parser.getValue(e,KEY_BIG_URL));
put(KEY_CAT_URL,parser.getValue(e,KEY_CAT_URL));
put(KEY_DESC,parser.getValue(e,KEY_DESC));
//将哈希列表添加到ArrayList
menuItems.add(地图);
}
返回null;
}
@凌驾
受保护的void onPostExecute(字符串参数){
如果(getActivity()!=null){
adapter=newmainpagelazyadapter(getActivity(),menuItems);
lv=(ListView)getActivity().findViewById(R.id.list);
//setListAdapter(适配器);
低压设置适配器(适配器);
}
}
}
@凌驾
已选择的公共事务(选项卡,碎片事务ft){
MFFragment=新的FreeFragment();
ft.add(android.R.id.content,mFragment);
ft.attach(mFragment);
}
@凌驾
已选择公共空页(选项卡,碎片事务ft){
ft.移除(mFragment);
}
@凌驾
已重新选择公共无效页签(页签,碎片事务){
}
}
ListView.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

     <com.google.ads.AdView android:id="@+id/adView"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         android:layout_centerHorizontal="true"
                         ads:adUnitId="mycode"
                         ads:adSize="BANNER"
                         ads:loadAdOnCreate="true"
                         />


<ListView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/list"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_below="@+id/adView"
    android:cacheColorHint="#00000000" >

</ListView>
</RelativeLayout>

当然,ListView是空的

这:

            @Override
            protected void onPostExecute(String args) {

                if (getActivity() != null) {
                    adapter = new MainPageLazyAdapter(getActivity(), menuItems);
                    lv.setAdapter(adapter);

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


                }

            }
需要这样做:

            @Override
            protected void onPostExecute(String args) {

                if (getActivity() != null) {
                    adapter = new MainPageLazyAdapter(getActivity(), menuItems);
                    lv = (ListView)getActivity().findViewById(R.id.list);                                 

                    lv.setAdapter(adapter);


                }

            }
在初始化
列表视图
之前,不能在
列表视图
上设置适配器

更重要的是,您这样做完全是错误的:您使用的是一个
SherlockListFragment
,它本身扩展了
ListFragment
,您可以认为它类似于
ListActivity
——它为您设置
列表视图提供了一些便利。您只需在
postExecute
中调用
setListAdapter
。您不需要自己膨胀任何listview;这就是
列表片段的全部要点

编辑:

因为,正如您所指出的,您希望在片段中包含的不仅仅是一个列表视图,所以不要使用SherlockListFragment。相反,扩展一个普通的旧片段。然后在onCreateView中执行以下操作:

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

        View v = inflater.inflate(R.layout.listview);
        lv = v.findViewById(R.id.list);
        return v;
}

现在您有了一个对该ListView的引用作为字段。现在,在onPostExecute中,您可以执行
lv.setAdapter(adapter)

当然,ListView是空的

这:

            @Override
            protected void onPostExecute(String args) {

                if (getActivity() != null) {
                    adapter = new MainPageLazyAdapter(getActivity(), menuItems);
                    lv.setAdapter(adapter);

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


                }

            }
需要这样做:

            @Override
            protected void onPostExecute(String args) {

                if (getActivity() != null) {
                    adapter = new MainPageLazyAdapter(getActivity(), menuItems);
                    lv = (ListView)getActivity().findViewById(R.id.list);                                 

                    lv.setAdapter(adapter);


                }

            }
在初始化
列表视图
之前,不能在
列表视图
上设置适配器

更重要的是,您这样做完全是错误的:您使用的是一个
SherlockListFragment
,它本身扩展了
ListFragment
,您可以认为它类似于
ListActivity
——它为您设置
列表视图提供了一些便利。您只需在
postExecute
中调用
setListAdapter
。您不需要自己膨胀任何listview;这就是
列表片段的全部要点

编辑:

因为,正如您所指出的,您希望在片段中包含的不仅仅是一个列表视图,所以不要使用SherlockListFragment。相反,扩展一个普通的旧片段。然后在onCreateView中执行以下操作:

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

        View v = inflater.inflate(R.layout.listview);
        lv = v.findViewById(R.id.list);
        return v;
}

现在您有了一个对该ListView的引用作为字段。现在,在onPostExecute中,您可以执行
lv.setAdapter(adapter)

感谢LuxuryMode的回复。我正在膨胀我自己的listview,因为我需要在我的listview xml布局中加入广告。在完成您的编辑后,我的listview仍然为空。这是因为您的活动在当前视图层次结构中没有id为R.id.list的视图。向我们显示您的活动在那里仍然没有看到关于R.id.list的任何信息。LuxuryMode请参阅此代码视图v=充气器。充气(R.id.listview);我的listview xml没有该id。我必须做什么?请help@DroidBeginner很抱歉请参阅我的编辑。它应该是R.layout.listview或listview,具体取决于xml布局的大小写。感谢LuxuryMode的回复。我正在膨胀我自己的listview,因为我需要在我的listview xml布局中加入广告。在完成您的编辑后,我的listview仍然为空。这是因为您的活动在当前视图层次结构中没有id为R.id.list的视图。向我们显示您的活动在那里仍然没有看到关于R.id.list的任何信息。LuxuryMode请参阅此代码视图v=充气器。充气(R.id.listview);我的listview xml没有该id。我必须做什么?请帮忙