有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何通过解决错误“活动无法转换为片段”将片段传递给类构造函数?

我有导航抽屉->;如果我单击导航抽屉中的项目,它会打开一个单独的片段,其中有两个选项卡,分别名为“列表”和“照片”

我的目标是,当我单击第一个选项卡(即“列表选项卡”)时,我试图调用“Listclassfragment类”,它必须显示listview。当我单击或滑动第二个选项卡(即照片选项卡)时,将调用“photosfragment”类,它必须在网格中显示照片。我正在使用这个PageRada

当我尝试处理ListClassFragment时,我得到了错误

Error : incompatible types: Activity cannot be converted to ListClassFragment

ListClassFragment类:

public class ListClassFragment extends Fragment {
private ListView listview;
private ArrayList<ListView_Model> books;
private ArrayAdapter<ListView_Model> adapter;

private final static String TAG = ListClassFragment.class.getSimpleName();

private final static String url = "http://myfee.org/apps/customer?id=1";


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

}


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

    // Inflate the layout for this fragment
    View view =  inflater.inflate(R.layout.activity_listview, container, false);

    listview = (ListView) view.findViewById(R.id.listview);
    setListViewAdapter();
    getDataFromInternet();
    return view;

}

private void getDataFromInternet() {
    new GetJsonFromUrlTask(getActivity(), url).execute();

}

private void setListViewAdapter() {
    books = new ArrayList<ListView_Model>();
    adapter = new CustomListViewAdapter(getActivity(), R.layout.item_listview, books);
    listview.setAdapter(adapter);
}

//parse response data after asynctask finished
public void parseJsonResponse(String result) {
    Log.i(TAG, result);
    try {
        JSONObject json = new JSONObject(result);

        JSONArray jArray = new JSONArray(json.getString("customer"));

        for (int i = 0; i < jArray.length(); i++) {

            JSONObject jObject = jArray.getJSONObject(i);

            ListView_Model book = new ListView_Model();
            book.setName(jObject.getString("name"));
            book.setAuthorName(jObject.getString("email"));
            book.setPhoneNo(jObject.getString("phone_no"));


            /*Pay Button here*/
            book.setImageUrl1(R.drawable.custom_button);

            books.add(book);
        }

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

GetJsonFromUrlTask类:

public class GetJsonFromUrlTask extends AsyncTask<Void, Void, String> {

private Activity activity;
private String url;
private ProgressDialog dialog;
private final static String TAG = GetJsonFromUrlTask.class.getSimpleName();

public GetJsonFromUrlTask(Activity activity, String url) {
    super();
    this.activity = activity;
    this.url = url;
}

@Override
protected void onPreExecute() {
    super.onPreExecute();
    // Create a progress dialog
    dialog = new ProgressDialog(activity);
    // Set progress dialog title
    dialog.setTitle("Loading Datas....");
    // Set progress dialog message
    dialog.setMessage("Please wait!!");
    dialog.setIndeterminate(false);
    // Show progress dialog
    dialog.show();
}

@Override
protected String doInBackground(Void... params) {

    // call load JSON from url method
    return loadJSON(this.url).toString();
}

@Override
protected void onPostExecute(String result) {
    ((ListClassFragment) activity).parseJsonResponse(result);
    dialog.dismiss();
    Log.i(TAG, result);
}

public JSONObject loadJSON(String url) {
    // Creating JSON Parser instance
    JSONGetter jParser = new JSONGetter();

    // getting JSON string from URL
    JSONObject json = jParser.getJSONFromUrl(url);

    return json;
}

private class JSONGetter {

    private InputStream is = null;
    private JSONObject jObj = null;
    private String json = "";

    // constructor
    public JSONGetter() {

    }

    public JSONObject getJSONFromUrl(String url) {

        // Making HTTP request
        try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);

            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"),
                    8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }

        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        // return JSON String
        return jObj;

    }
}}

共 (2) 个答案

  1. # 1 楼答案

    最好使用回调(接口)来实现。下面是一个例子

    public class GetJsonFromUrlTask extends AsyncTask<Void, Void, String> {
        private String url;
        private NetworkCallback callback;
    
        public GetJsonFromUrlTask(String url, NetworkCallback callback) {
            this.callback = callback;
            this.url = url;
        }
    
        @Override
        protected String doInBackground(Void... params) {
            // Do your stuffs
            return null;
        }
    
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            // OnSuccess
            if (callback != null) {
                callback.onNetworkSuccess(s);
            }
    
            // On error
            if (callback != null) {
                callback.onNetworkException(exception);
            }
        }
    
        public interface NetworkCallback {
            void onNetworkSuccess(String response);
    
            void onNetworkException(Exception e);
        }
    }
    

    调用可以如下所示,也可以通过NetworkCallback直接implements调用片段

     private void getDataFromInternet() {
        new GetJsonFromUrlTask(url, new NetworkCallback() {
    
            @Override
            public void onNetworkSuccess(String response) {
    
            }
    
            @Override
            public void onNetworkException(Exception e) {
    
            }
        }).execute();
    
    }
    

    根据需要修改界面

  2. # 2 楼答案

    尝试将片段传递给类构造函数。像这样更改代码

    private ListClassFragment listFragment;
    private String url;
    private ProgressDialog dialog;
    private final static String TAG = GetJsonFromUrlTask.class.getSimpleName();
    
    public GetJsonFromUrlTask(ListClassFragment listFragment, String url) {
        super();
        this.listFragment = listFragment;
        this.url = url;
    }
    @Override
    protected void onPostExecute(String result) {
        listFragment.parseJsonResponse(result);
        dialog.dismiss();
        Log.i(TAG, result);
    }
    

    在ListClassFragment类中:

    private void getDataFromInternet() {
        new GetJsonFromUrlTask(this, url).execute();
    }