简体   繁体   English

片段的Android ListView LazyAdapter

[英]Android ListView LazyAdapter for Fragment

I extends my App for Tablet-Design and use Fragments. 我扩展了适用于平板电脑设计的应用程序,并使用了片段。

The MainActivity: MainActivity:

    public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         FragmentTransaction transaction = getFragmentManager()
         .beginTransaction();
         transaction.add(R.id.fragmentcontainer1, new list());
         transaction.commit();
    }
}

The List Fragment with XML Loader and LazyAdapter: 使用XML Loader和LazyAdapter的列表片段:

public class lst extends Fragment {

    String URL = "URL HERE";
    static final String KEY_COUPON = "coupon"; // parent node
    static final String KEY_ID = "id";
    private boolean onCreateRunned = false;
    ArrayList<HashMap<String, String>> list;

    ListView list;
    LazyAdapter adapter;

    @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container,
              Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.list,
                container, false); 



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

        XMLParser parser = new XMLParser();
        String xml = parser.getXmlFromUrl(URL);
        Document doc = parser.getDomElement(xml);

        NodeList nl = doc.getElementsByTagName(KEY_COUPON);
        for (int i = 0; i < nl.getLength(); i++) {
            HashMap<String, String> map = new HashMap<String, String>();
            Element e = (Element) nl.item(i);
            map.put(KEY_ID, parser.getValue(e, KEY_ID));
            list.add(map);
        }

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

        adapter= new LazyAdapter(getActivity(), list);        
        list.setAdapter(adapter);

        return view;


    }   

}

and the LazyAdapter 和LazyAdapter

    public class LazyAdapter extends BaseAdapter {
    private Activity activity;
    private ArrayList<HashMap<String, String>> data;
    private static LayoutInflater inflater=null;
    public ImageLoader imageLoader; 


    public LazyAdapter(Context appContext, ArrayList<HashMap<String, String>> d) {
        activity = (Activity) appContext;
        data=d;
        inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        imageLoader=new ImageLoader(activity);
    }

    public int getCount() {
        return data.size();
    }

    public Object getItem(int position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        View vi=convertView;
        if(convertView==null)


            vi = inflater.inflate(R.layout.list_row, null);

       // do something here

        return vi;
    }
}

Adn the error is: Adn的错误是:

01-29 16:42:14.775: E/AndroidRuntime(2057): FATAL EXCEPTION: main
01-29 16:42:14.775: E/AndroidRuntime(2057): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.newcouponstablet/com.example.newcouponstablet.MainActivity}: android.os.NetworkOnMainThreadException
01-29 16:42:14.775: E/AndroidRuntime(2057):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
01-29 16:42:14.775: E/AndroidRuntime(2057):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
01-29 16:42:14.775: E/AndroidRuntime(2057):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
01-29 16:42:14.775: E/AndroidRuntime(2057):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
01-29 16:42:14.775: E/AndroidRuntime(2057):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-29 16:42:14.775: E/AndroidRuntime(2057):     at android.os.Looper.loop(Looper.java:137)
01-29 16:42:14.775: E/AndroidRuntime(2057):     at android.app.ActivityThread.main(ActivityThread.java:5039)
01-29 16:42:14.775: E/AndroidRuntime(2057):     at java.lang.reflect.Method.invokeNative(Native Method)
01-29 16:42:14.775: E/AndroidRuntime(2057):     at java.lang.reflect.Method.invoke(Method.java:511)
01-29 16:42:14.775: E/AndroidRuntime(2057):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-29 16:42:14.775: E/AndroidRuntime(2057):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-29 16:42:14.775: E/AndroidRuntime(2057):     at dalvik.system.NativeStart.main(Native Method)
01-29 16:42:14.775: E/AndroidRuntime(2057): Caused by: android.os.NetworkOnMainThreadException
01-29 16:42:14.775: E/AndroidRuntime(2057):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
01-29 16:42:14.775: E/AndroidRuntime(2057):     at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
01-29 16:42:14.775: E/AndroidRuntime(2057):     at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
01-29 16:42:14.775: E/AndroidRuntime(2057):     at libcore.io.IoBridge.connect(IoBridge.java:112)
01-29 16:42:14.775: E/AndroidRuntime(2057):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
01-29 16:42:14.775: E/AndroidRuntime(2057):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
01-29 16:42:14.775: E/AndroidRuntime(2057):     at java.net.Socket.connect(Socket.java:842)
01-29 16:42:14.775: E/AndroidRuntime(2057):     at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
01-29 16:42:14.775: E/AndroidRuntime(2057):     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)
01-29 16:42:14.775: E/AndroidRuntime(2057):     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
01-29 16:42:14.775: E/AndroidRuntime(2057):     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
01-29 16:42:14.775: E/AndroidRuntime(2057):     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
01-29 16:42:14.775: E/AndroidRuntime(2057):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
01-29 16:42:14.775: E/AndroidRuntime(2057):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
01-29 16:42:14.775: E/AndroidRuntime(2057):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
01-29 16:42:14.775: E/AndroidRuntime(2057):     at com.example.newcouponstablet.XMLParser.getXmlFromUrl(XMLParser.java:45)
01-29 16:42:14.775: E/AndroidRuntime(2057):     at com.example.newcouponstablet.list.onCreateView(list.java:46)
01-29 16:42:14.775: E/AndroidRuntime(2057):     at android.app.Fragment.performCreateView(Fragment.java:1695)
01-29 16:42:14.775: E/AndroidRuntime(2057):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:885)
01-29 16:42:14.775: E/AndroidRuntime(2057):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1057)
01-29 16:42:14.775: E/AndroidRuntime(2057):     at android.app.BackStackRecord.run(BackStackRecord.java:682)
01-29 16:42:14.775: E/AndroidRuntime(2057):     at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1435)
01-29 16:42:14.775: E/AndroidRuntime(2057):     at android.app.Activity.performStart(Activity.java:5113)
01-29 16:42:14.775: E/AndroidRuntime(2057):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2153)

I hope anybody can help me to understand it. 我希望任何人都能帮助我理解它。

Caused by: android.os.NetworkOnMainThreadException 造成原因:android.os.NetworkOnMainThreadException

=> This occurs whennever you make/implement long running tasks on main thread itself =>每当您不在主线程本身上执行/执行长时间运行的任务时,就会发生这种情况

To avoid this, either you can implement threading (or AsyncTask ) or include below line before making long running tasks inside onCreate() method: 为了避免这种情况,您可以实现线程化(或AsyncTask ),或者在onCreate()方法内执行长时间运行的任务之前在下面添加行:

StrictMode.ThreadPolicy policy = new StrictMode.
ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy); 
public class lst extends Fragment {

    String URL = "URL HERE";
    static final String KEY_COUPON = "coupon"; // parent node
    static final String KEY_ID = "id";
    private boolean onCreateRunned = false;
    ArrayList<HashMap<String, String>> list;

    ListView list;
    LazyAdapter adapter;

    @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container,
              Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.list,
                container, false); 



        list = new ArrayList<HashMap<String, String>>();
        new Thread(new Runnable(){
        public void run() {

        XMLParser parser = new XMLParser();
        String xml = parser.getXmlFromUrl(URL);
        Document doc = parser.getDomElement(xml);

        NodeList nl = doc.getElementsByTagName(KEY_COUPON);
        for (int i = 0; i < nl.getLength(); i++) {
            HashMap<String, String> map = new HashMap<String, String>();
            Element e = (Element) nl.item(i);
            map.put(KEY_ID, parser.getValue(e, KEY_ID));
            list.add(map);
        }

        //Maybe this must activity.runOnUiThread(...     
        list=(ListView) view.findViewById(R.id.list);

        adapter= new LazyAdapter(getActivity(), list);        
        list.setAdapter(adapter);

        }}).start()


        return view;


    }   

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM