简体   繁体   中英

why RecycleView items is not displayed?

I have a problem. When I use newsPojo at first - all displayed ok (but swipe to refresh is not work, when I use postAdapter.notifyDataSetChanged() - my items is not displayed. How can I fix it?

This is my Activity class

public class MainActivity extends AppCompatActivity {
    private RecyclerView recyclerView;
    private NewsApi newsApi;
    private NewsPojo fromRetrofit;
    private MainAdapter postAdapter;
    @BindView(R.id.activity_main_swipe_to_refresh) SwipeRefreshLayout swipeRefreshLayout;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        fromRetrofit = new NewsPojo();
        fromRetrofit.setArticles(new ArrayList<Article>());
        response();
        initRecycleView();


        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                response();
                swipeRefreshLayout.setRefreshing(false);
            }
        });
    }

    private void response() {
        newsApi = RitApplication.getApi();

        newsApi.getData().enqueue(new Callback<NewsPojo>() {
            @Override
            public void onResponse(Call<NewsPojo> call, Response<NewsPojo> response) {
                fromRetrofit.getArticles().clear();
                fromRetrofit = response.body();
            postAdapter.notifyDataSetChanged();
                }
            }

            @Override
            public void onFailure(Call<NewsPojo> call, Throwable t) {
            }
        });
    }

    public void initRecycleView() {
        recyclerView = findViewById(R.id.activity_main_recycle_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        postAdapter = new MainAdapter(fromRetrofit, new OnIteamClickListener() {
            @Override
            public void onItemClick(View itemView) {
            }
        }, getApplicationContext());
        recyclerView.setAdapter(postAdapter);
    }
}

Here you can see my Adapter class

public class MainAdapter extends RecyclerView.Adapter<MainAdapter.ViewHolder> {
    private NewsPojo newsPojo;
    private OnIteamClickListener listener;
    private Context mContext;

    public MainAdapter(NewsPojo newsPojo, OnIteamClickListener listener, Context mContext) {
        this.newsPojo = newsPojo;
        this.listener = listener;
        this.mContext = mContext;
    }

    public void clear(){
        newsPojo.getArticles().clear();
        notifyDataSetChanged();
    }
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_news, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.bind(newsPojo.getArticles().get(position));
    }

    @Override
    public int getItemCount() {
        if (newsPojo != null) {
            return newsPojo.getArticles().size();
        } else {
            return 0;
        }
    }

Why postAdapter.notifyDataSetChanged(); is not working?

I suggest the following:

Change the following lines:

fromRetrofit.getArticles().clear();
fromRetrofit = response.body();
postAdapter.notifyDataSetChanged();

For this:

postAdapter.cleanAddArticles(response.body());

and in the adapter add the following:

public void cleanAddArticles(NewsPojo newsPj){
    this.newsPojo.getArticles().clear();
    this.newsPojo.getArticles().addAll(newsPj.getArticles());
    notifyDataSetChanged();
}

Note: Error depending on the circumstances must be going through object references.

When you get new values by calling response() method, then you must call initRecycleView() to set the new values to the adapter, then use notifyDataSetChanged()

      @Override
        public void onResponse(Call<NewsPojo> call, Response<NewsPojo> response) {
            fromRetrofit.getArticles().clear();
            fromRetrofit = response.body();

            initRecycleView()  //*** Add this.

            postAdapter.notifyDataSetChanged();
            }
        }

first of check when you swipe refresh that time your postAdapter not getting null other wise your code is ok. if you want to make one separate method for adapter like below..

private void setAdater(){
    if (postAdapter==null) {
        postAdapter = new MainAdapter(fromRetrofit, new OnIteamClickListener() {
            @Override
            public void onItemClick(View itemView) {
            }
        }, getApplicationContext());
        recyclerView.setAdapter(postAdapter);
    }
    else{
        postAdapter.notifyDataSetChanged();
    }
}

and also check your from fromRetrofit object what value have. i think adapter not getting any value bacause only clear article but object has some value there for i think you make object null when getting data...

   fromRetrofit=null;
fromRetrofit = response.body();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM