RecyclerView未显示已解析的GSON数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RecyclerView未显示已解析的GSON数据相关的知识,希望对你有一定的参考价值。

我在这里已经完成了几个问题,但我对如何继续下去感到困惑。我正在使用GSON解析数据,除了将notifydatachange添加到适配器之外,我已将结果添加到我的recyclerview,但我的Recycler视图仍为空。我的logcat显示没有错,正在从服务器接收信息。有人能让我知道我做错了什么吗?我的RecyclerView适配器似乎没问题,我想我在片段中添加了必要的代码。

片段活动:

 public class WeatherAppFragment extends Fragment implements Listener {

// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
private SearchView searchView = null;
private SearchView.OnQueryTextListener queryTextListener;
RecyclerView mRecyclerView;
String mStatusView;
List<ForecastWeatherList> items = new ArrayList<>();
RecyclerViewAdapter adapter;




        @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_weather_app, container, false);

    mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    mRecyclerView.addItemDecoration(new DividerItemDecoration(mRecyclerView.getContext(), DividerItemDecoration.VERTICAL));
    Log.d("debugMode", "I'm in onCreateView");

    adapter = new RecyclerViewAdapter(items, mRecyclerView.getContext());

    mRecyclerView.setAdapter(adapter);

    new GetWeatherAync(this, mStatusView, api_key).execute();
    return view;
}


  private class GetWeatherAync extends AsyncTask<Context, Void, List<ForecastWeatherList>> {
    private String TAG = GetWeatherAync.class.getSimpleName();
    private final String serviceUrl;
    private Context mContext;
    private Listener listener;
    HttpURLConnection urlConnection = null;


    public GetWeatherAync(Listener listener, Object mStatusView, Object api_key) {
        this.listener = listener;
        this.serviceUrl =  "http://api.openweathermap.org/data/2.5/forecast?q=" + "Miami" +"&APPID="+ " ";
    }

    @Override
    protected List<ForecastWeatherList> doInBackground(Context...params) {
        try {
            Log.d("debugMode", "The application is in doInBackground");

            URL url = new URL(serviceUrl);
                urlConnection = (HttpURLConnection) url.openConnection();
                urlConnection.setReadTimeout(10000 /* milliseconds */);
                urlConnection.setConnectTimeout(15000 /* milliseconds */);
                urlConnection.setRequestMethod("GET");
                urlConnection.connect();
                // If the request was successful (response code 200),
                // then read the input stream and parse the response.
                if (urlConnection.getResponseCode() == 200) {
                    Log.e(TAG, "Response code:" + urlConnection.getResponseCode());
                    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
                    Log.e("response",bufferedReader.toString());
                    Gson gson = new Gson();
                    if (!bufferedReader.equals("")) {
                        ForecastWeatherListWrapper weatherWrapper = gson.fromJson(bufferedReader, ForecastWeatherListWrapper.class);
                        Log.e("something", weatherWrapper.getforecastWeatherLists().size() + "");
                        List<ForecastWeatherList> forecastWeatherLists = weatherWrapper.getforecastWeatherLists();

                        return forecastWeatherLists;
                    } else {
                        Log.e(TAG, "Error response code: " + urlConnection.getResponseCode());
                    }
                }
        } catch (Exception e) {
            Log.e("catch","error");
            System.out.println(e.getMessage());

        }


        return null;


    }

       @Override
        protected void onPostExecute(List<ForecastWeatherList> result) {
        super.onPostExecute(result);
        if (result != null) {
            Log.e(TAG, "populate UI recycler view with gson converted data");
            listener.afterSearch(result);
            items.clear();
            items.addAll(result);
            adapter.notifyDataSetChanged();







        } else{
        Log.e(TAG, "Result is null");
        // check if this Log shows up?
    }
}
    }

RecyclerViewAdapter:

     public class RecyclerViewAdapter  extends    
     RecyclerView.Adapter<RecyclerViewAdapter.ForecastRecycler> {

     private List<ForecastWeatherList> mForecastWeatherDataList;
     Context mContext;

public static class ForecastRecycler extends RecyclerView.ViewHolder{

    public TextView currentTemp;
    public TextView currentHumidity;
    public TextView currentDescription;
    public ImageView currentIcon;


    public ForecastRecycler (View view) {
        super (view);


        currentTemp = (TextView) view.findViewById(R.id.current_temperature);
        currentHumidity = (TextView) view.findViewById(R.id.current_humidity);
        currentDescription = (TextView) view.findViewById(R.id.current_weather_description);
        currentIcon = (ImageView) view.findViewById(R.id.current_weather_icon);

    }

}

public RecyclerViewAdapter(List<ForecastWeatherList> mForecastWeatherDataList,Context mContext) {
    this.mForecastWeatherDataList = mForecastWeatherDataList;

    this.mContext = mContext;
}

@Override
public ForecastRecycler onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item, parent, false);

    return new ForecastRecycler(view);
}

@Override
public void onBindViewHolder( ForecastRecycler holder, int position) {

    final ForecastWeatherList currentRecycler = mForecastWeatherDataList.get(position);

    Log.d("weather", currentRecycler.getWeather().getDescription());


    holder.currentTemp.setText((Double.toString(currentRecycler.getMain().getTemp())));
    holder.currentHumidity.setText(currentRecycler.getMain().getHumidity());
    holder.currentDescription.setText(currentRecycler.getWeather().getDescription());
    Picasso.with(holder.currentIcon.getContext()).load(currentRecycler.getWeather().getIcon());


}

@Override
public int getItemCount() {
    return mForecastWeatherDataList.size();
}

}

FragmentWeatherApp:

   <?xml version="1.0" encoding="utf-8"?>

  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".WeatherAppFragment">


<android.support.v7.widget.RecyclerView
    android:id="@+id/recyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"

    />


 </RelativeLayout>

回收物品:

    <?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">

    <TextView
        android:id="@+id/current_city_location"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

    <ImageView
        android:id="@+id/current_weather_icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

    <TextView
        android:id="@+id/current_temperature"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

    <TextView
        android:id="@+id/current_humidity"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />


    <TextView
        android:id="@+id/current_weather_description"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

</LinearLayout>

这是我的forecastweatherlistwrapper:

 public class ForecastWeatherListWrapper {

 @SerializedName("list")
 @Expose
 private List<ForecastWeatherList> forecastWeatherLists;

 public List<ForecastWeatherList> getforecastWeatherLists() {
    return forecastWeatherLists;
}

public void setforecastWeatherLists(List<ForecastWeatherList>      
forecastWeatherItems){

   this.forecastWeatherLists = forecastWeatherItems;
       }
}

这是我的ForecastWeatherList:

public class ForecastWeatherList {
@SerializedName("dt")
@Expose
private Integer dt;
@SerializedName("main")
@Expose
private Main main;
@SerializedName("weather")
@Expose
private Weather weather = null;
@SerializedName("clouds")
@Expose
private Clouds clouds;
@SerializedName("wind")
@Expose
private Wind wind;
@SerializedName("rain")
@Expose
private Rain rain;
@SerializedName("sys")
@Expose
private Sys sys;
@SerializedName("dt_txt")
@Expose
private String dtTxt;

public Integer getDt() {
    return dt;
}

public void setDt(Integer dt) {
    this.dt = dt;
}

public Main getMain() {
    return main;
}

public void setMain(Main main) {
    this.main = main;
}

public Weather getWeather() {
    return (Weather) weather;
}

public void setWeather(Weather weather) {
    this.weather = weather;
}

public Clouds getClouds() {
    return clouds;
}

public void setClouds(Clouds clouds) {
    this.clouds = clouds;
}

public Wind getWind() {
    return wind;
}

public void setWind(Wind wind) {
    this.wind = wind;
}

public Rain getRain() {
    return rain;
}

public void setRain(Rain rain) {
    this.rain = rain;
}

public Sys getSys() {
    return sys;
}

public void setSys(Sys sys) {
    this.sys = sys;
}

public String getDtTxt() {
    return dtTxt;
}

public void setDtTxt(String dtTxt) {
    this.dtTxt = dtTxt;
}



  }

以下是我的一些用于解析JSON数据的GSON类。有些课程是Main,Clouds等

这是我的主要课程:

public class Main {

@SerializedName("temp")
@Expose
private Double temp;
@SerializedName("temp_min")
@Expose
private Double tempMin;
@SerializedName("temp_max")
@Expose
private Double tempMax;
@SerializedName("pressure")
@Expose
private Double pressure;
@SerializedName("sea_level")
@Expose
private Double seaLevel;
@SerializedName("grnd_level")
@Expose
private Double grndLevel;
@SerializedName("humidity")
@Expose
private Integer humidity;
@SerializedName("temp_kf")
@Expose
private Integer tempKf;

public Double getTemp() {
    return temp;
}

    public void setTemp(Double temp) {
        this.temp = temp;
    }

    public Double getTempMin() {
        return tempMin;
    }

    public void setTempMin(Double tempMin) {
        this.tempMin = tempMin;
    }

    public Double getTempMax() {
        return tempMax;
    }

    public void setTempMax(Double tempMax) {
        this.tempMax = tempMax;
    }

public Double getPressure() {
    return pressure;
}

public void setPressure(Double pressure) {
    this.pressure = pressure;
}

public Double getSeaLevel() {
    return seaLevel;
}

public void setSeaLevel(Double seaLevel) {
    this.seaLevel = seaLevel;
}

public Double getGrndLevel() {
    return grndLevel;
}

public void setGrndLevel(Double grndLevel) {
    this.grndLevel = grndLevel;
}

public Integer getHumidity() {
    return humidity;
}

public void setHumidity(Integer humidity) {
    this.humidity = humidity;
}

public Integer getTempKf() {
    return tempKf;
}

public void setTempKf(Integer tempKf) {
    this.tempKf = tempKf;
}

  }

这是我的天气课:

public class Weather {

@SerializedName("id")
@Expose
private Integer id;
@SerializedName("main")
@Expose
private String main;
@SerializedName("description")
@Expose
private String description;
@SerializedName("icon")
@Expose
private String icon;

public Integer getId() {
    return id;
}

public void setId(Integer id) {
    this.id = id;
}

public String getMain() {
    return main;
}

public void setMain(String main) {
    this.main = main;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

public String getIcon() {
    return icon;
}

public void setIcon(String icon) {
    this.icon = icon;
}


  }

这是我的原始字符串数据(我认为)。

 "cod":"200",
"message":0.0074,
  "cnt":39,
"list":[
  {
     "dt":1534215600,
     "main":{
        "temp":293.24,
        "temp_min":292.346,
        "temp_max":293.24,
        "pressure":1021.77,
        "sea_level":1028.21,
        "grnd_level":1021.77,
        "humidity":100,
        "temp_kf":0.89
     },
     "weather":[
        {
           "id":500,
           "main":"Rain",
           "description":"light rain",
           "icon":"10n"
        }
     ],
     "clouds":{
        "all":20
     },
     "wind":{
        "speed":2.51,
        "deg":275.001
     },
     "rain":{
        "3h":0.0050000000000008
     },
     "sys":{
        "pod":"n"
     },
     "dt_txt":"2018-08-14 03:00:00"
  },
  {
     "dt":1534226400,
     "main":{
        "temp":292.3,
        "temp_min":291.706,
        "temp_max":292.3,
        "pressure":1020.99,
        "sea_level":1027.42,
        "grnd_level":1020.99,
        "humidity":100,
        "temp_kf":0.6
     },
     "weather":[
        {
           "id":800,
           "main":"Clear",
           "description":"clear sky",
           "icon":"01n"
        }
     ],
     "clouds":{
        "all":0
     },
     "wind":{
        "speed":2.52,
        "deg":294.505
     },
     "rain":{

     },
     "sys":{
        "pod":"n"
     },
     "dt_txt":"2018-08-14 06:00:00"
  },
  {
     "dt":1534237200,
     "main":{
        "temp":291.07,
        "temp_min":290.77,
        "temp_max":291.07,
        "pressure":1020.65,
        "sea_level":1027.03,
        "grnd_level":1020.65,
        "humidity":100,
        "temp_kf":0.3
     },
     "weather":[
        {
           "id":800,
           "main":"Clear",
           "description":"clear sky",
           "icon":"01n"
        }
     ],
     "clouds":{
        "all":0
     },
     "wind":{
        "speed":1.31,
        "deg":225.5
     },
     "rain":{

     },
     "sys":{
        "pod":"n"
     },
     "dt_txt":"2018-08-14 09:00:00"
  },
  {
     "dt":1534248000,
     "main":{
        "temp":293.286,
        "temp_min":293.286,
        "temp_max":293.286,
        "pressure":1020.78,
        "sea_level":1027.17,
        "grnd_level":1020.78,
        "humidity":100,
        "temp_kf":0
     },
     "weather":[
        {
           "id":800,
           "main":"Clear",
           "description":"clear sky",
           "icon":"02d"
        }
     ],
     "clouds":{
        "all":8
     },
     "wind":{
        "speed":2.83,
        "deg":234.501
     },
     "rain":{

     },
     "sys":{
        "pod":"d"
     },
     "dt_txt":"2018-08-14 12:00:00"
  },
  {
     "dt":1534258800,
     "main":{
        "temp":298.671,
        "temp_min":298.671,
        "temp_max":298.671,
        "pressure":1020.76,
        "sea_level":1027.15,
        "grnd_level":1020.76,
        "humidity":92,
        "temp_kf":0
     },
     "weather":[
        {
           "id":800,
           "main":"Clear",
           "description":"clear sky",
           "icon":"01d"
        }
     ],
     "clouds":{
        "all":0
     },
     "wind":{
        "speed":2.71,
        "deg":259.5
     },
     "rain":{

     },
     "sys":{
        "pod":"d"
     },
     "dt_txt":"2018-08-14 15:00:00"
  },
  {
     "dt":1534269600,
     "main":{
        "temp":300.7,
        "temp_min":300.7,
        "temp_max":300.7,
        "pressure":1019.76,
        "sea_level":1026.18,
        "grnd_level":1019.76,
        "humidity":83,
        "temp_kf":0
     },
     "weather":[
        {
           "id":500,
           "main":"Rain",
           "description":"light rain",
           "icon":"10d"
        }
     ],
     "clouds":{
        "all":24
     },
     "wind":{
        "speed":3.66,
        "deg":285.503
     },
     "rain":{
        "3h":1.11
     },
     "sys":{
        "pod":"d"
     },
     "dt_txt":"2018-08-14 18:00:00"
  },
  {
     "dt":1534280400,
     "main":{
        "temp":298.464,
        "temp_min":298.464,
        "temp_max":298.464,
        "pressure":1019.68,
        "sea_level":1025.97,
        "grnd_level":1019.68,
        "humidity":83,
        "temp_kf":0
     },
     "weather":[
        {
           "id":500,
           "main":"Rain",
           "description":"light rain",
           "icon":"10d"
        }
     ],
     "clouds":{
        "all":48
     },
     "wind":{
        "speed":3.27,
        "deg":289.504
     },
     "rain":{
        "3h":1.61
     },
     "sys":{
        "pod":"d"
     },
     "dt_txt":"2018-08-14 21:00:00"
  },
  {
     "dt":1534291200,
     "main":{
        "temp":297.882,
        "temp_min":297.882,
        "temp_max":297.882,
        "pressure":1020,
        "sea_level":1026.37,
        "grnd_level":1020,
        "humidity":82,
        "temp_kf":0
     },
     "weather":[
        {
           "id":500,
           "main":"Rain",
           "description":"light rain",
           "icon":"10n"
        }
     ],
     "clouds":{
        "all":36
     },
     "wind":{
        "speed":2.37,
        "deg":275.004
     },
     "rain":{
        "3h":0.13
     },
     "sys":{
        "pod":"n"
     },
     "dt_txt":"2018-08-15 00:00:00"
  },
  {
     "dt":1534302000,
     "main":{
        "temp":295.242,
        "temp_min":295.242,
        "temp_max":295.242,
        "pressure":1021.11,
        "sea_level":1027.53,
        "grnd_level":1021.11,
        "humidity":94,
        "temp_kf":0
     },
     "weather":[
        {
           "id":802,
           "main":"Clouds",
           "description":"scattered clouds",
           "icon":"03n"
        }
     ],
     "clouds":{
        "all":32
     },
     "wind":{
        "speed":1.26,
        "deg":313.002
     },
     "rain":{

     },
     "sys":{
        "pod":"n"
     },
     "dt_txt":"2018-08-15 03:00:00"
  },
  {
     "dt":1534312800,
     "main":{
        "temp":294.05,
        "temp_min":294.05,
        "temp_max":294.05,
        "pressure":1021.27,
        "sea_level":1027.77,
        "grnd_level":1021.27,
        "humidity":100,
        "temp_kf":0
     },
     "weather":[
        {
           "id":800,
           "main":"Clear",
           "description":"clear sky",
           "icon":"01n"
        }
     ],
     "clouds":{
        "all":0
     },
     "wind":{
        "speed":2.46,
        "deg":274.504
     },
     "rain":{

     },
     "sys":{
        "pod":"n"
     },
     "dt_txt":"2018-08-15 06:00:00"
  },
  {
     "dt":1534323600,
     "main":{
        "temp":293.495,
        "temp_min":293.495,
        "temp_max":293.495,
        "pressure":1021.36,
        "sea_level":1027.7,
        "grnd_level":1021.36,
        "humidity":100,
        "temp_kf":0
     },
     "weather":[
        {
           "id":800,
           "main":"Clear",
           "description":"clear sky",
           "icon":"01n"
        }
     ],
     "clouds":{
        "all":0
     },
     "wind":{
        "speed":3.01,
        "deg":277.505
     },
     "rain":{

     },
     "sys":{
        "pod":"n"
     },
     "dt_txt":"2018-08-15 09:00:00"
],
"city":{
  "id":4347778,
  "name":"Baltimore",
  "coord":{
     "lat":39.2909,
     "lon":-76.6108
  },
  "country":"US",
  "population":620961
 }
  }

这是我的LogCat:

  ksburneytwo.weathertest E/GetWeatherAync: Response code:200
  ksburneytwo.weathertest E/response: java.io.BufferedReader@3d54b14
  ksburneytwo.weathertest E/something: 40
  ksburneytwo.weathertest E/GetWeatherAync: populate UI recycler view with gson converted data
答案

我弄清楚发生了什么。 postexecute将它发送给listener.aftersearch。在那里,结果需要以items.addAll(结果)的形式发送到recyclerview。 Recyclerview现在加载。

以上是关于RecyclerView未显示已解析的GSON数据的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Assets 文件夹中解析 StickyHeader RecyclerView 中的 json 数据

解析嵌套的 JSONArray 并以 Recyclerview 正确的方式显示它

Kotlin 用Retrofit+OkHttp+协程+LiveData搭建MVVM(Jetpack)来实现网络请求(网络数据JSON解析)显示在RecyclerView(更新中)

android使用gson解析嵌套复杂的json数据,数据怎么显示到布局上,布局怎么写

无法在 Recyclerview 中显示图像 - 文本已成功显示

ratrofit +okhttp + gson 解析数据为空 (接口已返回json数据)