android - 如何通过 onListItemClick(使用 Volley/JSON)打开 WebView?

标签 android json listview webview

我使用 Volley 制作了一个博客阅读器。当您按下列表时,我创建了 WebView 来显示文章(打开带有文章的 WebView),但是我在使用 onListItemClick 时遇到了问题。问题是:根据我所学,我应该输入 JSONArray 的“名称”,但问题是,我没有这个名称。它看起来像这样:

@Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        try {
            JSONArray jsonPosts = obj.getJSONArray(**!!!I don't know what should I put here!!!**);
            JSONObject jsonPost = jsonPosts.getJSONObject(position);
            String blogUrl = jsonPost.getString(new String(obj.getString("url").getBytes("ISO-8859-1"), "UTF-8"));

            Intent intent = new Intent(this, WebViewActivity.class);
            intent.setData(Uri.parse(blogUrl));
            startActivity(intent);
        } catch (JSONException e) {
            Log.e(TAG, "Exception caught!", e);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }

JSON 代码如下所示:

[
{
"id": 58,
"url": "http://integrallab.ru/index.php/categorii-so-statyami/2013-10-25-13-26-29/spiralnaya-dinamika",
"title": "some data",
"time": "15 min",
"author": "name of the author",
"icon": "http://integrallab.hol.es/thumbnail/spiral_dynamics.jpg"
},
{
....................................

主 Activity .java

public class MainActivity extends ListActivity {
// Log tag
private static final String TAG = MainActivity.class.getSimpleName();

// Posts json url
private static final String url = "http://integrallab.hol.es/document9.json";
private ProgressDialog pDialog;
private List<Post> postList = new ArrayList<Post>();
private ListView listView;
private CustomListAdapter adapter;
private JSONObject obj;

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

    listView = (ListView) findViewById(android.R.id.list);
    adapter = new CustomListAdapter(this, postList);
    listView.setAdapter(adapter);

    pDialog = new ProgressDialog(this);
    // Showing progress dialog before making http request
    pDialog.setMessage("Loading...");
    pDialog.show();

    // changing action bar color
    getActionBar().setBackgroundDrawable(
            new ColorDrawable(Color.parseColor("#1b1b1b")));

    // Creating volley request obj
    JsonArrayRequest postReq = new JsonArrayRequest(url,
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {
                    Log.d(TAG, response.toString());
                    hidePDialog();

                    // Parsing json
                    for (int i = 0; i < response.length(); i++) {
                        try {

                            obj = response.getJSONObject(i);
                            Post post = new Post();
                            post.setTitle(new String(obj.getString("title").getBytes("ISO-8859-1"), "UTF-8"));

                            post.setThumbnailUrl(obj.getString("icon"));
                            post.setAuthor(new String(obj.getString("author").getBytes("ISO-8859-1"), "UTF-8"));
                            post.setTime(new String(obj.getString("time").getBytes("ISO-8859-1"), "UTF-8"));

                            // adding post to posts array
                            postList.add(post);

                        } catch (JSONException e) {
                            e.printStackTrace();
                        } catch (UnsupportedEncodingException e) {
                            e.printStackTrace();
                        }

                    }

                    // notifying list adapter about data changes
                    // so that it renders the list view with updated data
                    adapter.notifyDataSetChanged();
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    VolleyLog.d(TAG, "Error: " + error.getMessage());
                    hidePDialog();

                }
            });

    // Adding request to request queue
    AppController.getInstance().addToRequestQueue(postReq);
}

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    try {
        JSONArray jsonPosts = obj.getJSONArray();
        JSONObject jsonPost = jsonPosts.getJSONObject(position);
        String blogUrl = jsonPost.getString(new String(obj.getString("url").getBytes("ISO-8859-1"), "UTF-8"));

        Intent intent = new Intent(this, WebViewActivity.class);
        intent.setData(Uri.parse(blogUrl));
        startActivity(intent);
    } catch (JSONException e) {
        Log.e(TAG, "Exception caught!", e);
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
}

@Override
public void onDestroy() {
    super.onDestroy();
    hidePDialog();
}

private void hidePDialog() {
    if (pDialog != null) {
        pDialog.dismiss();
        pDialog = null;
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

最佳答案

我相信您不必经历从 onListItemClick 中获取 JSONArray 和/或对象的麻烦。

您可以简单地向您的Post 类添加一个新字段url。然后里面

public void onResponse(JSONArray response)

在解析 JSONResponse 并将相应值放入 Post 对象字段的位置,同时解析 url

post.setUrl(new String(obj.getString("url").getBytes("ISO-8859-1"), "UTF-8"));

现在,每个列表项都有 Post 对象,每个 Post 对象都有 url,您将其称为 blogUrl

至于您的商品点击监听器,下面应该可以满足您的需求

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    Post p = (Post) l.getItemAtPosition(position);
    String blogUrl = p.getUrl();
    Intent intent = new Intent(this, WebViewActivity.class);
    intent.setData(Uri.parse(blogUrl));
    startActivity(intent);
}

希望这对您有所帮助!

关于android - 如何通过 onListItemClick(使用 Volley/JSON)打开 WebView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30850894/

相关文章:

java - 在正确的位置分配菜单图标

json - 对于 JSON 结果

java - 如何在 Java 中反序列化 JSON 对象数组

java - ListView 中的微调器似乎出现在 ListView 之外

android - Android SQLite 中没有此类列错误

android - 从 imageview 和 textview 创建图像?

java - ListView 项目未使用 AsyncTask 加载

java - Android中ListView的问题

android - 从改造2.6.2更新到改造2.9.0后,OkHttpClient.Builder()中的java.lang.NoSuchMethodError

javascript - jQuery 中的 Json 关联数组访问