如何实现将活动扩展为片段的类?

时间:2015-10-28 03:44:53

标签: java android android-fragments android-activity

好的,今天我一整天都在打破这个问题,我想知道是否有人可以帮助我。我有一个项目,我有一个简单的活动,将一个json提要加载到ListView,这很好。现在,我创建了一个新项目,我将不同的片段作为屏幕。我想把这个ListView放在其中一个片段中,但是更简单的项目中的类扩展了Activity,片段扩展了,好吧,Fragment。我已经看到getActivity()回答了其他问题,但我甚至不确定如何将它实现到我自己的代码中。

这是我新项目片段的代码:

package com.example.myapplication;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class HomeFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.home_fragment, container, false);
    }
}

这是我旧项目的代码:

package com.example.application;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;

import com.android.volley.Cache;
import com.android.volley.Cache.Entry;
import com.android.volley.Request.Method;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.VolleyLog;
import com.android.volley.toolbox.JsonObjectRequest;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

import adapter.FeedListAdapter;
import app.AppController;
import data.FeedItem;

public class MainActivity extends Activity {

    private static final String TAG = MainActivity.class.getSimpleName();
    private ListView listView;
    private FeedListAdapter listAdapter;
    private List<FeedItem> feedItems;
    private String URL_FEED = "http://example.com/feed.json";

    @SuppressLint("NewApi")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

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

        feedItems = new ArrayList<>();

        listAdapter = new FeedListAdapter(this, feedItems);
        listView.setAdapter(listAdapter);

        Cache cache = AppController.getInstance().getRequestQueue().getCache();
        Entry entry = cache.get(URL_FEED);
        if (entry != null) {
            try {
                String data = new String(entry.data, "UTF-8");
                try {
                    parseJsonFeed(new JSONObject(data));
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        } else {
            JsonObjectRequest jsonReq = new JsonObjectRequest(Method.GET, URL_FEED, null, new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    VolleyLog.d(TAG, "Response: " + response.toString());
                    if (response != null) {
                        parseJsonFeed(response);
                    }
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    VolleyLog.d(TAG, "Error: " + error.getMessage());
                }
            });
            AppController.getInstance().addToRequestQueue(jsonReq);
        }
    }

    private void parseJsonFeed(JSONObject response) {
        try {
            JSONArray feedArray = response.getJSONArray("feed");

            for (int i = 0; i < feedArray.length(); i++) {
                JSONObject feedObj = (JSONObject) feedArray.get(i);

                FeedItem item = new FeedItem();
                item.setId(feedObj.getInt("id"));
                item.setName(feedObj.getString("name"));

                String image = feedObj.isNull("image") ? null : feedObj.getString("image");
                item.setImage(image);
                item.setStatus(feedObj.getString("status"));
                item.setProfilePic(feedObj.getString("profilePic"));
                item.setTimeStamp(feedObj.getString("timeStamp"));

                String feedUrl = feedObj.isNull("url") ? null : feedObj.getString("url");
                item.setUrl(feedUrl);

                feedItems.add(item);
            }

            listAdapter.notifyDataSetChanged();
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

}

如果有人可以帮助我,我将永远感激不尽!谢谢!任何和所有的帮助表示赞赏!!

------------------------------------ EDIT ---------- --------------------------------

好的,所以我注意到我原来的问题有点令人困惑。我会在这里澄清一下。 项目1有一个main_activity.xml文件,除了ListView之外什么都不包含。它还有MainActivity.java文件和其他帮助程序类,但MainActivity.java文件是此处的主要焦点。它包含使用json文件的内容填充ListView的代码。该文件的代码位于上面的第二个代码框中。现在,我有Project 2,这个项目有一个main_activity.xml文件,该文件包含一个线性布局,当我点击一个按钮时,该布局会填充五个不同的片段之一。现在,有一个home_fragment.xml文件,该文件是该片段的HomeFragment.java文件。我希望home_fragment.xml文件保存ListView,我想将第二个代码框中的代码添加到此文件中,但HomeFragment.java文件的内容是第一个代码框。我知道我无法扩展Fragment和Activity,所以如何将代码框2中的代码添加到我的HomeFragment.java文件中。

1 个答案:

答案 0 :(得分:0)

根据我的理解,你的home_fragment.xml应该是这样的

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >


    <ListView
    android:id="@+id/list"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    </ListView>

</RelativeLayout>

你的主要HomeFragment应该是这样的

public class HomeFragment extends Fragment {

private static final String TAG = HomeFragment.class.getSimpleName();
private ListView listView;
private FeedListAdapter listAdapter;
private List<FeedItem> feedItems;
private String URL_FEED = "http://example.com/feed.json";

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

    feedItems = new ArrayList<>();

    listAdapter = new FeedListAdapter(getActivity(), feedItems);
    listView.setAdapter(listAdapter);

    Cache cache = AppController.getInstance().getRequestQueue().getCache();
    Entry entry = cache.get(URL_FEED);
    if (entry != null) {
        try {
            String data = new String(entry.data, "UTF-8");
            try {
                parseJsonFeed(new JSONObject(data));
            } catch (JSONException e) {
                e.printStackTrace();
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    } else {
        JsonObjectRequest jsonReq = new JsonObjectRequest(Method.GET, URL_FEED, (String)null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                VolleyLog.d(TAG, "Response: " + response.toString());
                if (response != null) {
                    parseJsonFeed(response);
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                VolleyLog.d(TAG, "Error: " + error.getMessage());
            }
        });
        AppController.getInstance().addToRequestQueue(jsonReq);
    }
    return view;
}

private void parseJsonFeed(JSONObject response) {
    try {
        JSONArray feedArray = response.getJSONArray("feed");

        for (int i = 0; i < feedArray.length(); i++) {
            JSONObject feedObj = (JSONObject) feedArray.get(i);

            FeedItem item = new FeedItem();
            item.setId(feedObj.getInt("id"));
            item.setName(feedObj.getString("name"));

            String image = feedObj.isNull("image") ? null : feedObj.getString("image");
            item.setImage(image);
            item.setStatus(feedObj.getString("status"));
            item.setProfilePic(feedObj.getString("profilePic"));
            item.setTimeStamp(feedObj.getString("timeStamp"));

            String feedUrl = feedObj.isNull("url") ? null : feedObj.getString("url");
            item.setUrl(feedUrl);

            feedItems.add(item);
        }

        listAdapter.notifyDataSetChanged();
    } catch (JSONException e) {
        e.printStackTrace();
    }
}
}

我希望它可以帮助你...

相关问题