【问题标题】:data not showing in recyclerview using notifyDataSetChanged in Retrofit but works in volley在Retrofit中使用notifyDataSetChanged的数据未显示在recyclerview中,但在volley中有效
【发布时间】:2020-01-09 00:33:36
【问题描述】:

我一直使用Volley在recyclerview中显示数据的方法是在Oncreate方法中创建Adapter,然后在收到响应后通知使用 notifyDataSetChanged 从凌空抽射。

我尝试在 Retrofit 中使用相同的方法,但数据未显示在 Recyclerview 中,但如果我在改造后设置 Adapter 而不是在 Oncreate 方法中设置适配器收到 Retrofit 的响应,然后它就可以正常工作了

我的问题是

(1) 如果我在 Oncreate 中创建适配器,为什么数据没有显示在 Retrofit 中是我做错了什么吗?

(2)在Oncreate中创建适配器然后在收到响应后通知它是一种好方法吗?还是应该在收到响应后设置适配器?

如果我在收到这样的响应后设置适配器

@Override
                public void onResponse(Call<SubCatModelList> call, Response<SubCatModelList> response) {
                    Log.d("subcategoryJsonResponse", String.valueOf(response));
                    Gson gson = new Gson();
                    String successResponse = gson.toJson(response.body());
                    Log.d("aaaaaa", String.valueOf(successResponse));
                    if (response.isSuccessful()) {
                        subCatModel =response.body().getSubCategories();
                        Log.d("asaaaaaaa", String.valueOf(subCatModel));
                        subCategoryAdapter = new SubCategoryAdapter(BinaryCommissionActivity.this, subCatModel);
                        FixedGridLayoutManager manager = new FixedGridLayoutManager();
                        manager.setTotalColumnCount(1);
                        rvBinaryCommission.setLayoutManager(manager);
                        rvBinaryCommission.setAdapter(subCategoryAdapter);
                        rvBinaryCommission.addItemDecoration(new DividerItemDecoration(BinaryCommissionActivity.this, DividerItemDecoration.VERTICAL));
}

然后每次这个行初始化适配器并在 api 命中时创建对象,我认为这是一个不好的方法

subCategoryAdapter = 新 SubCategoryAdapter(BinaryCommissionActivity.this, subCatModel);

public class BinaryCommissionActivity extends AppCompatActivity {
    int scrollX = 0;
    List<SubCatModel> subCatModel = new ArrayList<>();
    SubCategoryAdapter subCategoryAdapter;
    VolleyCustomClass volleyCustomClass;
    @BindView(R.id.toolbarcustom) Toolbar toolbarcustom;
    @BindView(R.id.spinner_binary_commission) Spinner spinnerBinaryCommission;
    @BindView(R.id.searchViewBinary) SearchView searchViewBinary;
    @BindView(R.id.headerScroll) HorizontalScrollView headerScroll;
    @BindView(R.id.rvBinaryCommission) RecyclerView rvBinaryCommission;
    @BindView(R.id.swipeRefreshBinaryList) SwipeRefreshLayout swipeRefreshBinaryList;


    private AlertDialog dialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_binary_commission);
        ButterKnife.bind(this);
        toolbarcustom = findViewById(R.id.toolbarcustom);
        setSupportActionBar(toolbarcustom);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setTitle("Binary Commission");
        volleyCustomClass = new VolleyCustomClass(getApplicationContext());
        dialog = new SpotsDialog.Builder().setContext(this)
                .setMessage("Loading...")
                .setCancelable(false).build();

        spinnerData();
        setUpRecyclerView();
        prepareClubData();
        recyclerviewScrollListener();
        searchFilter();

        swipeRefreshBinaryList.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                if (!InternetUtils.checkForInternet(getApplicationContext())) {
                    swipeRefreshBinaryList.setRefreshing(false);
                    FancyToast.makeText(getApplicationContext(), "No Internet Connection", FancyToast.LENGTH_LONG, FancyToast.ERROR, false).show();
                } else {
                    prepareClubData();
                }
            }
        });

    }

    @Override
    public boolean onSupportNavigateUp() {
        onBackPressed();
        return super.onSupportNavigateUp();
    }

    /**
     * Recyclerview ScrollListener
     */
    private void recyclerviewScrollListener() {
        rvBinaryCommission.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                scrollX += dx;
                headerScroll.scrollTo(scrollX, 0);
            }

            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
            }
        });
    }

    /**
     * Search Filter
     */
    private void searchFilter() {
        searchViewBinary.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                subCategoryAdapter.getFilter().filter(query);
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                subCategoryAdapter.getFilter().filter(newText);
                return false;
            }
        });
    }

    /**
     * Adding data to spinner
     */
    private void spinnerData() {
        List<String> show_entries = new ArrayList<String>();
        show_entries.add("5");
        show_entries.add("10");
        show_entries.add("15");
        show_entries.add("20");
        show_entries.add("All");

        ArrayAdapter<String> dataAdapterShowEntries = new ArrayAdapter<String>(this,
                android.R.layout.simple_spinner_item, show_entries);
        dataAdapterShowEntries.setDropDownViewResource(R.layout.layout_spinner_item);
        spinnerBinaryCommission.setAdapter(dataAdapterShowEntries);
        spinnerBinaryCommission.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
                Object item = adapterView.getItemAtPosition(position);
                if (item != null) {
                    // Toast.makeText(getContext(), item.toString(), Toast.LENGTH_SHORT).show();
                }
                // Toast.makeText(getContext(), "Selected", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {
                // TODO Auto-generated method stub
            }
        });
    }


    private void prepareClubData() {
        if (!InternetUtils.checkForInternet(getApplicationContext())) {
            FancyToast.makeText(getApplicationContext(), "No Internet Connection", FancyToast.LENGTH_LONG, FancyToast.ERROR, false).show();
            return;
        } else {
            dialog.show();
            if (subCatModel != null) {
                subCatModel.clear();
            }

            /**
             * Volley
             */
            /* volleyCustomClass.callGetServer(URLs.subcategoryURL, new VolleyCallback() {
                @Override
                public void onSuccess(String response) {
                    Log.d("subcategoryJsonResponse", response);
                    try {
                        JSONObject obj = new JSONObject(response);
                        JSONArray productArray = obj.getJSONArray("sub-categories");

                        for (int i = 0; i < productArray.length(); i++) {
                            JSONObject productObject = productArray.getJSONObject(i);
                            SubCatModel subCatModelClass = new SubCatModel();
                            subCatModelClass.setSubcategoriesId(productObject.getString("Subcategories-Id"));
                            subCatModelClass.setCategoriesId(productObject.getString("categories-Id"));
                            subCatModelClass.setSubcategoriesName(productObject.getString("Subcategories-Name"));
                            subCatModel.add(subCatModelClass);
                            Log.d("subCategoryArraylist", String.valueOf(subCatModel));
                        }
                        dialog.dismiss();
                        subCategoryAdapter.notifyDataSetChanged();
                        swipeRefreshBinaryList.setRefreshing(false);
                    } catch (JSONException e) {
                        e.printStackTrace();
                        dialog.dismiss();
                    }
                }

                @Override
                public void onError(VolleyError error) {
                    VolleyLog.e("Error: ", error.getMessage());
                    swipeRefreshBinaryList.setRefreshing(false);
                }
            });*/


            /**
             * Retrofit
             */
            ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);
            Call<SubCatModelList> call = apiService.getList();
            call.enqueue(new Callback<SubCatModelList>() {
                @Override
                public void onResponse(Call<SubCatModelList> call, Response<SubCatModelList> response) {
                    Log.d("subcategoryJsonResponse", String.valueOf(response));
                    Gson gson = new Gson();
                    String successResponse = gson.toJson(response.body());
                    Log.d("aaaaaa", String.valueOf(successResponse));
                    if (response.isSuccessful()) {
                        subCatModel =response.body().getSubCategories();
                        Log.d("asaaaaaaa", String.valueOf(subCatModel));

                    }
                    dialog.dismiss();
                    subCategoryAdapter.notifyDataSetChanged();
                    swipeRefreshBinaryList.setRefreshing(false);
                }

                @Override
                public void onFailure(Call<SubCatModelList> call, Throwable t) {
                    swipeRefreshBinaryList.setRefreshing(false);
                }
            });



        }

    }

    /**
     * Handles RecyclerView for the action
     */
    private void setUpRecyclerView() {
        subCategoryAdapter = new SubCategoryAdapter(BinaryCommissionActivity.this, subCatModel);
        FixedGridLayoutManager manager = new FixedGridLayoutManager();
        manager.setTotalColumnCount(1);
        rvBinaryCommission.setLayoutManager(manager);
        rvBinaryCommission.setAdapter(subCategoryAdapter);
        rvBinaryCommission.addItemDecoration(new DividerItemDecoration(BinaryCommissionActivity.this, DividerItemDecoration.VERTICAL));

    }

}

【问题讨论】:

  • subCatModel =response.body().getSubCategories(); - 这并没有更新subCatModel 最初指向的ArrayList,而是您传递给Adapter。那只是将subCatModel 指向不同的ListAdapter 没有参考的一个。也许你打算改用subCatModel.addAll(response.body().getSubCategories());

标签: android retrofit android-volley adapter


【解决方案1】:

您可以使用:(在适配器类中)而不是每次都初始化适配器

public void setItems(List<String> myList) { // Let's say it's List of Strings
        this.myList = myList;
        notifyDataSetChanged();
    }

每次你用你的数据改变 List 来显示(在你的情况下在 onResponse() 中)你只需在你的适配器上调用 'setItems()'。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-08
    • 2019-01-09
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    相关资源
    最近更新 更多