Android 更改每个片段的QueryUtils中的值
如何从片段内部更改QueryUtils文件中存在的json对象的索引值 这部分就在这里:Android 更改每个片段的QueryUtils中的值,android,json,android-fragments,android-adapter,Android,Json,Android Fragments,Android Adapter,如何从片段内部更改QueryUtils文件中存在的json对象的索引值 这部分就在这里:jsonobjectcurrentday=dayArray.getJSONObject(0) 我希望每个片段的索引值都改变,但我无法对其进行概括。我试图创建一个构造函数,但失败了 与现在一样,应用程序正在“工作”,所有片段都显示了周一的日程安排(JSONObject索引0) QueryUtils.java import android.text.TextUtils; import android.util.L
jsonobjectcurrentday=dayArray.getJSONObject(0)代码>
我希望每个片段的索引值都改变,但我无法对其进行概括。我试图创建一个构造函数,但失败了
与现在一样,应用程序正在“工作”,所有片段都显示了周一的日程安排(JSONObject索引0)
QueryUtils.java
import android.text.TextUtils;
import android.util.Log;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
public final class QueryUtils {
private static final String LOG_TAG = QueryUtils.class.getSimpleName();
//makeHttpRequest constants
private static final int READ_TIMEOUT = 10000 /* milliseconds */;
private static final int CONNECT_TIMEOUT = 15000 /* milliseconds */;
private static final int RESPONSE_CODE = 200 /*everything is OK*/;
public QueryUtils() {
}
public static List<Day> fetchDayData(String requestUrl) {
URL url = createUrl(requestUrl);
String jsonResponse = null;
try {
jsonResponse = makeHttpRequest(url);
} catch (IOException e) {
Log.e(LOG_TAG, "Problem making the HTTP request.", e);
}
List<Day> days = extractFeatureFromJson(jsonResponse);
return days;
}
private static URL createUrl(String stringUrl) {
URL url = null;
try {
url = new URL(stringUrl);
} catch (MalformedURLException e) {
Log.e(LOG_TAG, "Problem building the URL ", e);
}
return url;
}
private static String makeHttpRequest(URL url) throws IOException {
String jsonResponse = "";
if (url == null) {
return jsonResponse;
}
HttpURLConnection urlConnection = null;
InputStream inputStream = null;
try {
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setReadTimeout(READ_TIMEOUT);
urlConnection.setConnectTimeout(CONNECT_TIMEOUT);
urlConnection.setRequestMethod("GET");
urlConnection.connect();
if (urlConnection.getResponseCode() == RESPONSE_CODE) {
inputStream = urlConnection.getInputStream();
jsonResponse = readFromStream(inputStream);
} else {
Log.e(LOG_TAG, "Error response code: " + urlConnection.getResponseCode());
}
} catch (IOException e) {
Log.e(LOG_TAG, "Problem retrieving Berceni JSON results.", e);
} finally {
if (urlConnection != null) {
urlConnection.disconnect();
}
if (inputStream != null) {
inputStream.close();
}
}
return jsonResponse;
}
private static String readFromStream(InputStream inputStream) throws IOException {
StringBuilder output = new StringBuilder();
if (inputStream != null) {
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, Charset.forName("UTF-8"));
BufferedReader reader = new BufferedReader(inputStreamReader);
String line = reader.readLine();
while (line != null) {
output.append(line);
line = reader.readLine();
}
}
return output.toString();
}
private static List<Day> extractFeatureFromJson(String dayJSON) {
if (TextUtils.isEmpty(dayJSON)) {
return null;
}
List<Day> days = new ArrayList<>();
//Try to parse
try {
JSONObject baseJsonResponse = new JSONObject(dayJSON);
JSONArray dayArray = baseJsonResponse.getJSONObject("schedule").getJSONArray("day");
JSONObject currentDay = dayArray.getJSONObject(0);
JSONArray getClasses = currentDay.getJSONArray("classes");
for (int j = 0; j < getClasses.length(); j++) {
JSONObject currentClass = getClasses.getJSONObject(j);
String retrieveCourseTitle = currentClass.getString("class");
String retrieveCourseTime = currentClass.getString("time");
String retrieveCourseTrainer = currentClass.getString("trainer");
String retrieveCourseCancelState = currentClass.getString("canceled");
Day day = new Day(retrieveCourseTitle, retrieveCourseTime, retrieveCourseTrainer, retrieveCourseCancelState);
days.add(day);
}
} catch (JSONException e) {
// If an error is thrown when executing any of the above statements in the "try" block,
// catch the exception here, so the app doesn't crash. Print a log message
// with the message from the exception.
Log.e("QueryUtils", "Problem parsing JSON results", e);
}
return days;
}
}
import android.content.Context;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
public class FragmentAdapter extends FragmentPagerAdapter {
private Context mContext;
public FragmentAdapter(Context context, FragmentManager fm) {
super(fm);
mContext = context;
}
@Override
public Fragment getItem(int position) {
if (position == 0) {
return new MondayFragment();
} else if (position == 1) {
return new ThursdayFragment();
} else if (position == 2) {
return new WednesdayFragment();
} else if (position == 3) {
return new ThursdayFragment();
} else if (position == 4) {
return new FridayFragment();
} else if (position == 5) {
return new SaturdayFragment();
} else {
return new SundayFragment();
}
}
/**
* Return the total number of pages.
*/
@Override
public int getCount() {
return 7;
}
@Override
public CharSequence getPageTitle(int position) {
if (position == 0) {
return mContext.getString(R.string.monday);
} else if (position == 1) {
return mContext.getString(R.string.tuesday);
} else if (position == 2) {
return mContext.getString(R.string.wednesday);
} else if (position == 3) {
return mContext.getString(R.string.thursday);
} else if (position == 4) {
return mContext.getString(R.string.friday);
} else if (position == 5) {
return mContext.getString(R.string.saturday);
} else {
return mContext.getString(R.string.sunday);
}
}
}
JSON示例响应
{
"schedule":{
"day":[
{
"id":"Monday",
"classes":[
{
"class" : "Class",
"time" : "00:00",
"trainer" : "Teacher",
"canceled" : ""
},
{
"class" : "Class",
"time" : "00:00",
"trainer" : "Teacher",
"canceled" : ""
}
]
},
{
"id":"Tuesday",
"classes":[
{
"class" : "Class",
"time" : "00:00",
"trainer" : "Teacher",
"canceled" : ""
},
{
"class" : "Class",
"time" : "00:00",
"trainer" : "Teacher",
"canceled" : ""
}
]
},
{
"id":"Wednesday",
"classes":[
{
"class" : "Class",
"time" : "00:00",
"trainer" : "Teacher",
"canceled" : ""
},
{
"class" : "Class",
"time" : "00:00",
"trainer" : "Teacher",
"canceled" : ""
}
]
},
{
"id":"Thursday",
"classes":[
{
"class" : "Class",
"time" : "00:00",
"trainer" : "Teacher",
"canceled" : ""
},
{
"class" : "Class",
"time" : "00:00",
"trainer" : "Teacher",
"canceled" : ""
}
]
},
{
"id":"Friday",
"classes":[
{
"class" : "Class",
"time" : "00:00",
"trainer" : "Teacher",
"canceled" : ""
},
{
"class" : "Class",
"time" : "00:00",
"trainer" : "Teacher",
"canceled" : ""
}
]
},
{
"id":"Saturday",
"classes":[
{
"class" : "Class",
"time" : "00:00",
"trainer" : "Teacher",
"canceled" : ""
},
{
"class" : "Class",
"time" : "00:00",
"trainer" : "Teacher",
"canceled" : ""
}
]
},
{
"id":"Sunday",
"classes":[]
}
]
}
}
我不确定这一点,因为我从未使用过FragmentPagerAdapter
,但我认为它在概念上可以作为任何适配器使用
我在代码中注意到的是,在代码中(参见注释)
看看您的POJO,这并不完全等同于您的JSON
一天应宣布为:
class Day {
String id;
List<ClassDetail> classes;
}
class ClassDetail {
//all the details
}
编辑:
IMHO,您必须在活动中调用dayloader,并将地图结果注入FragmentPagerAdapter:
public FragmentAdapter(Context context, FragmentManager fm, Map<String, List<ClassDetail> schedule) {
super(fm);
mContext = context;
mSchedule = schedule;
}
@Override
public Fragment getItem(int position) {
if (position == 0) {
return MondayFragment.newInstance(mSchedule.get("Monday"));
//...
//same for all conditions
//...
} else {
return SundayFragment.newInstance(mSchedule.get("Sunday"));
}
}
public FragmentAdapter(上下文上下文、FragmentManager fm、Map虽然@crgarridos的答案会起作用,但我一直在想一种更快捷、更简单的方法,以最少的代码修改来实现我的目标,因此:
最后,我修改了JSON API,并为id键创建了查询url,这样我就可以进行如下查询:
URL?id=monday
接下来,我只需要添加一个URI生成器和appendQueryParameter(key,value)
对于我的每个片段。显示从api获取的JSON@ρ∑ρK嗨,我已经用api的JSON示例响应更新了这个问题。需要迭代dayArray
JSONArray来显示所有的天,而不是使用0
@ρρ᜵K,是的,我第一次这样做了,但是如何将每次迭代传递给我的7个片段之一?我最初编写了一个for循环,并对所有片段进行了迭代,但不知道如何将它们传递到相应的片段使用带有ListHashMap>
的HashMap现在使用day id作为键,days
作为值,并根据day从HashMap中获取它并将其传递给相应的片段谢谢您的支持回答。这里的问题是,这将在每个片段中添加整个JSON响应。我想要的是在MondayFragment中包含索引为0(星期一)的JSONObject,以及索引为1(星期二)的JSONObject在周二的片段等等。你说的话让我觉得我当时想对了。在你的for循环中,你添加了所有的类,但是你在第0天工作。如果我说你需要在第0天、第1天、第2天等等做这些,我说对了吗?你的代码需要第0天,并在同一天添加到天,但使用不同的类。每个片段ment显示一天,对吗?我的方式不正确,但可能我理解了一些东西。只要告诉我我是否与你的想法相同:每天一个片段,每天不同的课程是的,我需要在第0天到第6天使用它,但是循环和显示它们不是问题,每天发送到它对应的片段是。你知道怎么做吗这是吗?Benjamin说得对。你能分享代码中为适配器设置数据并将它们链接到寻呼机的部分吗?我仍然不确定整个过程是如何进行的goesHello@crgarridos,我将深入研究它,看看是否可以无误地进行所有必要的更改。我故意选择手动解析json和m接受http请求,因为我正处于学习阶段,希望了解它是如何工作的,而不是仅仅依赖于库。我以前从未使用过HashMap,实际上不知道如何处理mymap.get(“周一”)因为我找到了我自己的解决方案,为我的案子找到了最好的方法。(请看我的回答)欢呼,谢谢!谢谢,但是我没想到API改变是解决办法(它并不总是可行的)。,考虑到你问题的局限性,我采取了最好的方法。很高兴你解决了:)起初,我不想改变我创建的API,因为我想了解更多,但从Android基础知识中学到的知识来看,Nanodegree不足以涵盖我所需要的一切,我试着按照我学到的方法去做,我试着尽可能地坚持我学到的东西。我认为通过定义一个公共构造函数并在片段中调用它可以更容易地实现这一点,但这超出了我现在想要处理的范围。因此,我想出了另一个解决办法。你不可能知道我也可以改变API,并利用你所拥有的。非常感谢。
class Day {
String id;
List<ClassDetail> classes;
}
class ClassDetail {
//all the details
}
List<Day> extractFeatureFromJson(String dayJSON)
HashMap<String, ClassDetail> parseScheduleJson(String scheduleJSON)
@Nullable
private static Map<String, List<ClassDetail>> parseScheduleJson(String scheduleJSON) {
if (TextUtils.isEmpty(scheduleJSON)) {
return null;
}
HashMap<String, List<ClassDetail>> result = new HashMap<>();
try {
JSONObject baseJsonResponse = new JSONObject(scheduleJSON);
JSONArray dayArray = baseJsonResponse.getJSONObject("schedule").getJSONArray("day");
for (int i = 0; i < dayArray.length(); i++) {
ArrayList<ClassDetail> classes = new ArrayList<>();
JSONObject currentDay = dayArray.getJSONObject(i);
for (int j = 0; j < currentDay.getJSONArray("classes").length(); j++) {
JSONObject currentClass = currentDay.getJSONArray("classes").getJSONObject(j);
String retrieveCourseTitle = currentClass.getString("class");
String retrieveCourseTime = currentClass.getString("time");
String retrieveCourseTrainer = currentClass.getString("trainer");
String retrieveCourseCancelState = currentClass.getString("canceled");
classes.add(new ClassDetail(retrieveCourseTitle, retrieveCourseTime, retrieveCourseTrainer, retrieveCourseCancelState));
}
result.put(currentDay.getString("id"), classes);
}
} catch (JSONException e) {
// If an error is thrown when executing any of the above statements in the "try" block,
// catch the exception here, so the app doesn't crash. Print a log message
// with the message from the exception.
Log.e("QueryUtils", "Problem parsing JSON results", e);
return null;
}
return result;
}
mymap.get("Monday");
mymap.get("Tuesday");
...
mymap.get("Sunday");
public FragmentAdapter(Context context, FragmentManager fm, Map<String, List<ClassDetail> schedule) {
super(fm);
mContext = context;
mSchedule = schedule;
}
@Override
public Fragment getItem(int position) {
if (position == 0) {
return MondayFragment.newInstance(mSchedule.get("Monday"));
//...
//same for all conditions
//...
} else {
return SundayFragment.newInstance(mSchedule.get("Sunday"));
}
}
private List<ClassDetail> mClasses;
public static MondayClassDetailFragment newInstance(ArrayList<ClassDetail> classes){
MondayClassDetailFragment myFragment = new MondayClassDetailFragment();
Bundle args = new Bundle();
args.putParcelableArrayList("classes", classes);
myFragment.setArguments(args);
return myFragment;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mClasses = getArguments().getParcelableArrayList("classes");
}