我正在办理失物招领处申请。它由四个标签组成,每个标签必须显示用户上传的公告Feed。通过单击特定项目打开一个新活动以获取更多信息。(好吧,有点新闻提要)。我以 JSON 的形式从API网站获取数据。
我使用 ViewPager,Fragment。 image my fragments做了四个标签
我试图放置每个Fragment listview并使用带有AsynTask的JSON显示他们的数据。并且导致每个片段的AsyncTask在第一个片段中也称为相同的JSON。可能是不对。
所以,请告诉我正确的举动。
如果可能,请编写步骤。非常感谢,我将很高兴得到任何帮助。
P.S抱歉英文不好
答案 0 :(得分:0)
首先,您可以使用简单的列表适配器将JSON数据放入listview,您可以看到这个here的教程。
其次,为了能够在列表视图中查看有关项目的详细信息,您可以使用onListItemClick
扩展ListActivity。这样做的一个例子是:
<强> MyListActivity.java 强>
public class MyListActivity extends ListActivity {
// . . .
protected void onListItemClick(ListView l, View v, int position, long id) {
//handle the list click here
intent = new Intent(this, ListDetails.class);
//convert the position int into a string to pass to the intent
value = String.valueOf(position);
//put the value into the intent
intent.putExtra("key", value);
//start the activity here
MyListActivity.this.startActivity(intent);
}
}
<强> ListDetails.java 强>
public class ListDetails extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//gets the value sent with the intent
Intent intent = getIntent();
final String helpView = intent.getStringExtra("key");
// . . .
}
这假设您正在使用ListActivity来创建列表,它实际上取决于您要显示的信息类型,如果要显示所有数据,您可以将JSON数据作为字符串传递给意图,然后像上面的例子中那样得到它。
第三,如果你想保留JSON数据,你可以将它与意图一起传递,然后当用户按下时,再次通过意图将其传回原始活动。如果你想重新下载JSON数据,你可以,但为了保存用户移动互联网连接(特别是对于重复的大型JSON文件),不建议使用此选项。如果你想再次下载JSON数据,你需要使用AsyncTask来下载数据,这样就不会破坏用户界面,并且当你尝试这样做时它会引发错误(相信我,我拉了我的头发在这上面)。 AsyncTask的一个例子是(来自我正在研究的android项目,它使用谷歌地图来计算路线):
private class ReadTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... url) {
String data = "";
try {
HttpConnection http = new HttpConnection();
data = http.readUrl(url[0]);
} catch (Exception e) {
Log.d("Background Task", e.toString());
}
return data;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
Log.i("Log","Parser Task Started");
Log.i("Log",result);
new ParserTask().execute(result);
}
}
private class ParserTask extends
AsyncTask<String, Integer, List<List<HashMap<String, String>>>> {
@Override
protected List<List<HashMap<String, String>>> doInBackground(
String... jsonData) {
JSONObject jObject;
List<List<HashMap<String, String>>> routes = null;
try {
jObject = new JSONObject(jsonData[0]);
PathJSONParser parser = new PathJSONParser();
routes = parser.parse(jObject);
} catch (Exception e) {
e.printStackTrace();
}
return routes;
}
@Override
protected void onPostExecute(List<List<HashMap<String, String>>> routes) {
//process the JSON data here
}
}
您可以将其置于活动中,为ParserTask中的onPostExecute中的JSON数据添加必要的处理。要下载JSON数据,您可以调用(用您的url替换url以获取JSON数据):
String url = "http://www.example.com"
ReadTask downloadTask = new ReadTask();
downloadTask.execute(url);
修改强> 最后,为了显示最新或最重要/相关的遗失物业广告,您可以再次使用JSON从您的后端网站获取此信息。在PHP中,您可以自定义服务器响应,根据GET中的值发送回JSON响应(?thisIsTheGet = blahblahblah)。要添加广告,您可以使用EditTexts等创建单独的活动来创建表单,然后通过GET请求将数据发送到后端服务器(保存JSON的位置),以便服务器可以更新广告列表。您可以再次使用AsyncTask将GET请求发送到服务器,可能使用上述方法从服务器发回添加广告的成功。表单的外观(XML)示例如下:
<强> activity_add_advertisement.xml 强>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="your.activity.class.root.activityAddAdvertisement"
tools:showIn="@layout/activity_add_advertisement"
android:id="@+id/LLMainContent"
android:orientation="vertical"
>
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/edittext1"/>
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/edittext2"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/submitButton"/>
</LinearLayout>
然后为活动中按下的按钮设置一个on click侦听器:
<强> activityAddAdvertisement.java 强>
public class activityAddAdvertisement {
// . . .
Button submitButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
// . . .
submitButton = (Button) findViewById(R.id.submitButton);
submitButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//call the methods from above to send a request to a url, with the contents of the edit texts in the GET request
}
}
}
您可以在GET请求中的内容中添加更多EditTexts和其他元素。然后,服务器将编辑JSON以包含新广告。 PHP不会太难,如果您需要一些关于PHP的教程,W3Schools有很好的教程和示例供您使用。
进一步阅读: Android Intents