繁体   English   中英

为什么不显示RecycleView项目?

[英]why RecycleView items is not displayed?

我有个问题。 当我第一次使用newsPojo时-全部显示都可以(但无法刷新以进行刷新,当我使用postAdapter.notifyDataSetChanged() -我的项目无法显示。如何解决?

这是我的活动课

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);
    }
}

在这里您可以看到我的适配器类

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;
        }
    }

为什么选择postAdapter.notifyDataSetChanged(); 不管用?

我建议以下内容:

更改以下行:

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

为了这:

postAdapter.cleanAddArticles(response.body());

并在适配器中添加以下内容:

public void cleanAddArticles(NewsPojo newsPj){
    this.newsPojo.getArticles().clear();
    this.newsPojo.getArticles().addAll(newsPj.getArticles());
    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();
            }
        }

首先,当您刷卡刷新时,那一次您的postAdapter不会为空,否则您的代码就可以了。 如果要为适配器创建一种单独的方法,如下所示。

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();
    }
}

并从fromRetrofit对象检查您的值。 我认为适配器没有获得任何价值,因为仅是清晰的文章,但对象有一些价值,因为我认为获取数据时使对象为空...

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

暂无
暂无

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

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