【问题标题】:Android ArrayAdapter problem by custom layout自定义布局的Android ArrayAdapter问题
【发布时间】:2019-10-14 07:30:32
【问题描述】:

我是安卓编程新手。遇到了一个通过大量搜索无法解决的问题。 我正在尝试从我的 wordpress 网站获取 Json 数据并将其放入一个简单的 android 应用程序中。

当我获得一个参数(如帖子标题)并通过 listView 显示它时,它会起作用。但是当我试图获取 10 个最近帖子的标题、图像和摘录并将它们显示在 listView 中时,似乎有点复杂。

如何获取最近 10 个帖子的标题和照片并在 android 上显示它们? 以下代码是我到目前为止可以写的:

mainActivity.java

package com.example.test1;

import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

import android.app.ProgressDialog;
import android.content.Intent;
//import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.google.gson.Gson;

import java.util.List;
import java.util.Map;

public class MainActivity extends ListActivity {

    String url = "http://www.example.com/wp-json/wp/v2/posts";
    List<Object> list;
    Gson gson;
    ProgressDialog progressDialog;
    // ListView postList;
    Map<String, Object> mapPost;
    Map<String, Object> mapTitle;
    int postID;
    String postTitle[];
    String image[];


    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView ( R.layout.activity_main );

        progressDialog = new ProgressDialog ( MainActivity.this );
        progressDialog.setMessage ( "Loading..." );
        progressDialog.setProgressStyle ( ProgressDialog.STYLE_SPINNER );
        progressDialog.show ();

        StringRequest request = new StringRequest ( Request.Method.GET, url, new Response.Listener<String> () {
            @Override
            public void onResponse(String s) {
                gson = new Gson ();
                list = (List) gson.fromJson ( s, List.class );
                postTitle = new String[list.size ()];
                image = new String[list.size ()];

                for (int i = 0; i < list.size (); ++i) {
                    mapPost = (Map<String, Object>) list.get ( i );
                    mapTitle = (Map<String, Object>) mapPost.get ( "title" );
                    postTitle[i] = (String) mapTitle.get ( "rendered" );
                    image[i] = (String) mapPost.get ( "poster_big" );
                }

                // the following line display error
                // error : in picture
                ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.activity_main, R.id.label, image);
                setListAdapter(adapter);


            }

         }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError volleyError) {
                    Toast.makeText(MainActivity.this, "Some error occurred", Toast.LENGTH_LONG).show();
                }
        });



    }
}

main_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/icon"
        android:layout_width="136dp"
        android:layout_height="139dp"
        android:layout_marginLeft="4px"
        android:layout_marginTop="4px"
        android:layout_marginRight="10px"
        android:src="@drawable/ic_launcher"></ImageView>

    <TextView
        android:id="@+id/label"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World"
        android:textSize="20px"></TextView>

</LinearLayout>

这是来自 Android 工作室的错误: error android studio

谢谢。

【问题讨论】:

  • 我建议您使用RecyclerView。在那里,您可以创建一个布局,您可以将其应用到一个viewholder,然后应用元素。学习起来似乎有点复杂,但如果你学会了它就超级容易。如果您需要帮助,请写信给我。

标签: java android listview android-arrayadapter


【解决方案1】:

使用 MainActivity.this 而不是 this。喜欢

 ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, R.layout.activity_main, R.id.label, image);

ArrayAdapter&lt;&gt;()构造函数在第一个参数中需要Context,但是你传递了this,它指的是StringRequestObject

注意:this 始终指代inner class

更新:

您应该在API 响应之后关闭您的progressDialog。如下所示

public class MainActivity extends ListActivity {

    String url = "http://www.example.com/wp-json/wp/v2/posts";
    List<Object> list;
    Gson gson;
    ProgressDialog progressDialog;
    // ListView postList;
    Map<String, Object> mapPost;
    Map<String, Object> mapTitle;
    int postID;
    String postTitle[];
    String image[];


    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView ( R.layout.activity_main );

        progressDialog = new ProgressDialog ( MainActivity.this );
        progressDialog.setMessage ( "Loading..." );
        progressDialog.setProgressStyle ( ProgressDialog.STYLE_SPINNER );
        progressDialog.show ();

        StringRequest request = new StringRequest ( Request.Method.GET, url, new Response.Listener<String> () {
            @Override
            public void onResponse(String s) {
                gson = new Gson ();
                list = (List) gson.fromJson ( s, List.class );
                postTitle = new String[list.size ()];
                image = new String[list.size ()];

                // here you should close your progress dialog.
                if (progressDialog.isShowing()) {
                    progressDialog.dismiss();
                }

                for (int i = 0; i < list.size (); ++i) {
                    mapPost = (Map<String, Object>) list.get ( i );
                    mapTitle = (Map<String, Object>) mapPost.get ( "title" );
                    postTitle[i] = (String) mapTitle.get ( "rendered" );
                    image[i] = (String) mapPost.get ( "poster_big" );
                }

                // the following line display error
                // error : in picture
                ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.activity_main, R.id.label, image);
                setListAdapter(adapter);
            }

         }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError volleyError) {
                    Toast.makeText(MainActivity.this, "Some error occurred", Toast.LENGTH_LONG).show();

                   // here you should close your progress dialog.
                   if (progressDialog.isShowing()) {
                      progressDialog.dismiss();
                   }
                }
        });



    }
}

【讨论】:

  • 嗨,贾基尔。感谢重播。可行,但现在应用程序屏幕在加载时冻结...添加了互联网访问,并且调试器没有错误
  • 好吧,没有任何改变,我在 2 个地方添加了它。在 setListAdapter() 和我添加它的地方之后。我觉得这是一个无法结束的循环或类似的东西
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多