简体   繁体   English

为什么不显示RecycleView项目?

[英]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? 当我第一次使用newsPojo时-全部显示都可以(但无法刷新以进行刷新,当我使用postAdapter.notifyDataSetChanged() -我的项目无法显示。如何解决?

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(); 为什么选择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() 通过调用response()方法获得新值时,必须调用initRecycleView()将新值设置为适配器,然后使用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. 首先,当您刷卡刷新时,那一次您的postAdapter不会为空,否则您的代码就可以了。 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. 并从fromRetrofit对象检查您的值。 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();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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