RecyclerView не показывает никаких элементов, пока я не нажму кнопку home и снова войду в действие - PullRequest
0 голосов
/ 31 марта 2020

При первом открытии приложения ничего не отображается в окне рециркуляции, но отображаются элементы после нажатия кнопки «Домой», а затем нажатия кнопки обзора и открытия приложения оттуда

вот код в mainActivity

public class MainActivity extends AppCompatActivity {
private RecyclerView mRecyclerView;
private RecyclerView.Adapter mAdapter;
private RecyclerView.LayoutManager mlayoutManager;
private ProgressDialog dialog;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final ArrayList<String> countryNmaeList =new ArrayList<>();

    final ArrayList<countryItem> countryList = new ArrayList<>();
    final ProgressDialog dialog = new ProgressDialog(this);
    dialog.setMessage("Loading data");



    mRecyclerView = findViewById(R.id.recyclerView);
    mAdapter=new countryAdapter(countryList);

    mlayoutManager=new LinearLayoutManager(this);

    mRecyclerView.setLayoutManager(mlayoutManager);





    dialog.show();
    OkHttpClient client = new OkHttpClient();

    Request request = new Request.Builder()
            .url("https://covid-193.p.rapidapi.com/statistics")
            .get()
            .addHeader("x-rapidapi-host", "covid-193.p.rapidapi.com")
            .addHeader("x-rapidapi-key", "xxxxxxxxxxxxx")
            .build();

    client.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(@NotNull Call call, @NotNull IOException e) {

        }

        @Override
        public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
            dialog.dismiss();
            String response1=response.body().string();
            try {
                //geting Jason object
                JSONObject jsonObject=new JSONObject(response1);
                JSONArray jsonArray = jsonObject.getJSONArray("response");
                for (int i=0;i<jsonArray.length();i++){
                    JSONObject country = jsonArray.getJSONObject(i);
                   JSONObject cases = country.getJSONObject("cases");
                    int activecaseint = cases.getInt("active");
                    int recoveredint =cases.getInt("recovered");
                    JSONObject death= country.getJSONObject("deaths");
                    int dtotal = death.getInt("total");
                    //adding items into country items 
                    countryList.add(new countryItem(country.getString("country"),String.valueOf(activecaseint),String.valueOf(recoveredint),String.valueOf(dtotal)));
                }



            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    });
    //nottifying the dataset changed 
    mAdapter.notifyDataSetChanged();
    mRecyclerView.setAdapter(mAdapter);


}

}

вот моя активность адаптера

countryAdapter. java

public class countryAdapter extends RecyclerView.Adapter<countryAdapter.countryViewHolder> {
    private ArrayList<countryItem> mCountryList;

    public static class countryViewHolder extends RecyclerView.ViewHolder{
        public TextView mCountryName;
        public TextView mActivePatients;
        public TextView mRecovered;
        public TextView mDeath;

        public countryViewHolder(@NonNull View itemView) {
            super(itemView);
            mCountryName=itemView.findViewById(R.id.CountyNameTv);
            mActivePatients=itemView.findViewById(R.id.activePatientsTv);
            mRecovered=itemView.findViewById(R.id.recoveredTv);
            mDeath=itemView.findViewById(R.id.deathTv);
        }
    }
    public countryAdapter(ArrayList<countryItem> countryList){
        mCountryList = countryList;
    }

    @NonNull
    @Override
    public countryViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.itemview,parent,false);
        countryViewHolder cvh =new countryViewHolder(v);
        return cvh;
    }

    @Override
    public void onBindViewHolder(@NonNull countryViewHolder holder, int position) {
        countryItem currentItem=mCountryList.get(position);

        holder.mCountryName.setText(currentItem.getCountryname());
        holder.mActivePatients.setText(currentItem.getActivePatients());
        holder.mRecovered.setText(currentItem.getRecovered());
        holder.mDeath.setText(currentItem.getDeath());
    }

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

    public void swapData(ArrayList<countryItem> list) {
        if (list != null) {
            this.mCountryList.clear();
            this.mCountryList.addAll(list);
            notifyDataSetChanged();
        }
    }
}

я попытался поместить notifyDataSetChanged внутри попытки, но это не работал Я надеюсь, что вы можете найти способ исправить это.

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

Вместо вызова mAdapter.notifyDataSetChanged () в конце onCreate () вы должны вызывать его в onRespone (), когда новые данные будут установлены.

@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
    dialog.dismiss();
    String response1=response.body().string();
    try {
        //geting Jason object
        JSONObject jsonObject=new JSONObject(response1);
        JSONArray jsonArray = jsonObject.getJSONArray("response");
        for (int i=0;i<jsonArray.length();i++){
            JSONObject country = jsonArray.getJSONObject(i);
           JSONObject cases = country.getJSONObject("cases");
            int activecaseint = cases.getInt("active");
            int recoveredint =cases.getInt("recovered");
            JSONObject death= country.getJSONObject("deaths");
            int dtotal = death.getInt("total");
            //adding items into country items 
            countryList.add(new countryItem(country.getString("country"),String.valueOf(activecaseint),String.valueOf(recoveredint),String.valueOf(dtotal)));
        }
        mAdapter.notifyDataSetChanged();   // ←  notify adapter here!



    } catch (JSONException e) {
        e.printStackTrace();
    }
}   
0 голосов
/ 31 марта 2020

Если у вас есть новое обновление списка данных после добавления его в список как:

 public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
            dialog.dismiss();
            String response1=response.body().string();
            try {
                //geting Jason object
                JSONObject jsonObject=new JSONObject(response1);
                JSONArray jsonArray = jsonObject.getJSONArray("response");
                for (int i=0;i<jsonArray.length();i++){
                    JSONObject country = jsonArray.getJSONObject(i);
                   JSONObject cases = country.getJSONObject("cases");
                    int activecaseint = cases.getInt("active");
                    int recoveredint =cases.getInt("recovered");
                    JSONObject death= country.getJSONObject("deaths");
                    int dtotal = death.getInt("total");
                    //adding items into country items 
                    countryList.add(new countryItem(country.getString("country"),String.valueOf(activecaseint),String.valueOf(recoveredint),String.valueOf(dtotal)));
                }

            //adapter.swapData(countryList);
              updateData(countryList);

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

, вы можете закомментировать следующую строку:

 mAdapter.notifyDataSetChanged();

Добавьте эту функцию в свой класс адаптера и вызовите это когда вам нужно обновить список:

public void swapData(ArrayList<countryItem> list) {
    if (list != null) {
        this.arrayList.clear();
        this.arrayList.addAll(list);
        notifyDataSetChanged();
    }
}

В объявлении глобального объекта измените тип адаптера на:

private countryAdapter mAdapter;

добавьте этот метод в mainActivity и вызывайте, когда вы хотите обновить данные :

public void updateData(ArrayList<countryItem> countryList) {
    new Handler(Looper.getMainLooper()).post(new Runnable() {
        @Override
        public void run() {
            mAdapter.swapData(countryList);
        }
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...