Не работает RecyclerView
public class Main2Activity extends AppCompatActivity {
private static ArrayList<WeatherDay> weatherDays;
private static RecyclerView recyclerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
Intent intent = getIntent();
String city=intent.getStringExtra("city");
String query=String.format("https://api.weatherbit.io/v2.0/forecast/daily?city=%s&key=4e2d6343c40d4652b80a70190ff5ac87",city);
recyclerView=findViewById(R.id.recyclerView);
weatherDays=new ArrayList<>();
DownloadTask task = new DownloadTask();
try {
String result=task.execute(query).get();
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
WeatherDayAdapter weatherDayAdapter = new WeatherDayAdapter(weatherDays);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(weatherDayAdapter);
}
public static class DownloadTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... strings) {
StringBuilder result = new StringBuilder();
URL url = null;
HttpURLConnection urlConnection = null;
try {
url = new URL(strings[0]);
urlConnection = (HttpURLConnection) url.openConnection();
InputStream in = urlConnection.getInputStream();
InputStreamReader reader = new InputStreamReader(in);
BufferedReader breader = new BufferedReader(reader);
String line = breader.readLine();
while (line != null) {
result.append(line);
line = breader.readLine();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (urlConnection != null) {
urlConnection.disconnect();
}
}
return result.toString();
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
try {
JSONObject jsonObject = new JSONObject(s);
JSONArray jsonArray=jsonObject.getJSONArray("data");
for(int i=0;i<16;i++) {
JSONObject object = jsonArray.getJSONObject(i);
String date=object.getString("datetime");
String mintemp = object.getString("min_temp");
String maxtemp=object.getString("max_temp");
String descr=object.getJSONObject("weather").getString("description");
String result = date+",."+mintemp+",."+maxtemp+",."+descr;
WeatherDay weatherDay = new WeatherDay(result);
weatherDays.add(weatherDay);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
если текст выводить в консоль в методе onPostExecute тогда все работает. А вот на экран через RecyclerView ничего не выводится. Вообще не понимаю как это исправить. Вот код адаптера:
public class WeatherDayAdapter extends RecyclerView.Adapter<WeatherDayAdapter.WeatherDayViewHolder> {
private ArrayList<WeatherDay> weatherDays;
public WeatherDayAdapter(ArrayList<WeatherDay> weatherDays) { this.weatherDays=weatherDays;}
@NonNull
@Override
public WeatherDayAdapter.WeatherDayViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.weatherday, parent, false);
return new WeatherDayViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull WeatherDayAdapter.WeatherDayViewHolder holder, int position) {
WeatherDay weatherDay = weatherDays.get(position);
holder.textViewDate.setText(weatherDay.getDate());
holder.textViewMinTemp.setText(weatherDay.getMinTemp());
holder.textViewMaxTemp.setText(weatherDay.getMaxTemp());
holder.textViewDescr.setText(weatherDay.getDescr());
}
@Override
public int getItemCount() {
return weatherDays.size();
}
class WeatherDayViewHolder extends RecyclerView.ViewHolder {
private TextView textViewDate;
private TextView textViewMinTemp;
private TextView textViewMaxTemp;
private TextView textViewDescr;
public WeatherDayViewHolder(@NonNull View itemView) {
super(itemView);
textViewDate=itemView.findViewById(R.id.textViewDate);
textViewMinTemp=itemView.findViewById(R.id.textViewMinTemp);
textViewMaxTemp=itemView.findViewById(R.id.textViewMaxTemp);
textViewDescr=itemView.findViewById(R.id.textViewDescr);
}
}
}
Ответы (1 шт):
Автор решения: Mr.Krotos
→ Ссылка
Я так подозреваю... У вас данные не успевают загрузится, а адаптер уже собран и кинут в recyclerview. Ваш downloadtask уходит при вызове в отдельный поток, а после него тут же устонавливается адаптер, пока downloadtask ещё развертывается и разбирвет скаченное в отедьном потоке.