App"失物招领处"使用ViewPager,Fragment,ListView,JSON

时间:2016-02-05 19:26:12

标签: android json listview android-asynctask android-viewpager

我正在办理失物招领处申请。它由四个标签组成,每个标签必须显示用户上传的公告Feed。通过单击特定项目打开一个新活动以获取更多信息。(好吧,有点新闻提要)。我以 JSON 的形式从API网站获取数据。
    我使用 ViewPager,Fragment。 image my fragments做了四个标签     我试图放置每个Fragment listview并使用带有AsynTask的JSON显示他们的数据。并且导致每个片段的AsyncTask在第一个片段中也称为相同的JSON。可能是不对。

    所以,请告诉我正确的举动。

  1. 用于将数据显示到json
  2. 的listview中的内容
  3. 如何显示按下列表视图项时打开的新活动的信息?
  4. 通过意图发送到片段或再次下载JSON?
  5. 如何实现用户添加广告?
  6. 如果可能,请编写步骤。非常感谢,我将很高兴得到任何帮助。

    P.S抱歉英文不好

1 个答案:

答案 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