Android ArrayAdapter проблема с пользовательским макетом - PullRequest
1 голос
/ 14 октября 2019

Я новичок в программировании Android. столкнулся с проблемой, которая не может решить ее путем большого поиска. Я пытаюсь получить данные Json с моего сайта WordPress и поместить их в простое приложение для Android.

Это работает, когда я получаю один параметр, такой как заголовки записей, и отображаю его в виде списка. но когда я пытаюсь получить заголовки, изображения и выдержку из 10 последних сообщений и отобразить их в виде списка, это кажется немного сложным.

Как мне получить заголовок и фотографию 10 последних сообщений и отобразить ихна андроид? следующий код - это то, что я мог бы написать до сих пор:

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: ошибка андроид студии

спасибо.

1 Ответ

1 голос
/ 14 октября 2019

Используйте MainActivity.this вместо , это . как и

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

ArrayAdapter<>() в первом параметре необходимо указать Context, но вы передали this, что относится к Object из StringRequest.

Примечание: this всегда относится к inner class.

Обновление:

Вы должны закрыть progressDialog после ответа API. как показано ниже

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();
                   }
                }
        });



    }
}
...