java - recyclerview 项目显示抽屉导航 fragment 中显示空白屏幕

标签 java android android-recyclerview retrofit navigation-drawer

我正在开发新闻,并且我已经在抽屉导航 fragment 中实现了带搜索 View 的recyclerview,但是抽屉导航中的recyclerview项目显示空的白色屏幕。 我在 fragment 类中和根 URL 下方得到了两个结束点。

private static final String ROOT_URL = "https://newsapi.org";

低于我的第一个终点,我成为头条新闻。

 @GET("/v2/top-headlines?sources=bbc-sport&apiKey=my-api-key")
    Call<SportNews> getArticles();

低于第二个终点,我得到了一切

 @GET("/v2/everything?apiKey=my-api-key")
    Call<Search> getSearchViewArticles(@Query("q") String q);

在 BBCSportsFragment 类下面,我实现了 RecyclerView 和 SearchView

public class BBCSportFragment extends Fragment implements ArticleAdapter.ClickListener {

public static List<Article> articleList = new ArrayList<>();

public static List<Article> origArticleList = new ArrayList<>();

@ActivityContext
public Context activityContext;
Search search;
@ApplicationContext
public Context mContext;

@BindView(R.id.recycler_view)
RecyclerView recyclerView;
BBCSportFragmentComponent bbcSportFragmentComponent;
BBCFragmentContextModule bbcFragmentContextModule;
private SportNews sportNews;
private static ArticleAdapter articleAdapter;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_bbcsport, container, false);
    ButterKnife.bind(this, view);
    SportInterface sportInterface = SportClient.getApiService();
    Call<SportNews> call = sportInterface.getArticles();
    call.enqueue(new Callback<SportNews>() {
        @Override
        public void onResponse(Call<SportNews> call, Response<SportNews> response) {
            if (response == null) {
                sportNews = response.body();
                if (sportNews != null && sportNews.getArticles() != null) {
                    articleList.addAll(sportNews.getArticles());

                }
                articleAdapter = new ArticleAdapter(articleList, sportNews);
                ApplicationComponent applicationComponent;
                applicationComponent = (ApplicationComponent) MyApplication.get(Objects.requireNonNull(getActivity())).getApplicationContext();
                bbcSportFragmentComponent = (BBCSportFragmentComponent) DaggerApplicationComponent.builder().contextModule(new ContextModule(getContext())).build();
                bbcSportFragmentComponent.injectBBCSportFragment(BBCSportFragment.this);
                RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext(applicationComponent));
                recyclerView.setLayoutManager(layoutManager);
                recyclerView.setAdapter(articleAdapter);
            }
        }

        @Override
        public void onFailure(Call<SportNews> call, Throwable t) {

        }
    });


    SportInterface searchInterface = SportClient.getApiService();
    Call<Search> searchCall = searchInterface.getSearchViewArticles("q");
    searchCall.enqueue(new Callback<Search>() {
        @Override
        public void onResponse(Call<Search> call, Response<Search> response) {
            search = response.body();

            if (search != null && search.getArticles() != null) {
                articleList.addAll(search.getArticles());
                origArticleList.clear();
                origArticleList.addAll(search.getArticles());
            }

            articleAdapter = new ArticleAdapter(articleList, search);
            RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext());
            recyclerView.setLayoutManager(layoutManager);
            recyclerView.setAdapter(articleAdapter);
        }

        @Override
        public void onFailure(Call<Search> call, Throwable t) {

        }
    });


    return view;


}

private Context getContext(ApplicationComponent applicationComponent) {
    return null;
}

public static void doFilter(String searchQuery) {
    searchQuery = searchQuery.toLowerCase();
    articleList.clear();
    for (Article article : origArticleList) {
        final String text = article.getTitle();
        if (text.equals(searchQuery))
            articleList.add(article);
    }
    articleAdapter.notifyDataSetChanged();
}
}

低于适配器类

public class ArticleAdapter extends RecyclerView.Adapter<ArticleAdapter.CustomViewHolder> {

public static final String urlKey = "urlKey";
List<Article> articles;

private ClipboardManager myClipboard;
private ClipData myClip;


public ArticleAdapter(List<Article> articles, SportNews sportNews) {
    this.articles = articles;


}

public ArticleAdapter(ClickListener clickListener) {
}

public ArticleAdapter(List<Article> articleList, Search search) {
}

@NonNull
@Override
public ArticleAdapter.CustomViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.article_list, null);
    return new ArticleAdapter.CustomViewHolder(itemView);
}

@Override
public void onBindViewHolder(@NonNull edgar.yodgorbek.sportnews.adapter.ArticleAdapter.CustomViewHolder customViewHolder, int position) {
    Article article = articles.get(position);
    SimpleDateFormat input = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
    SimpleDateFormat output = new SimpleDateFormat("dd/MM/yyyy");

    Date d = new Date();
    try {
        d = input.parse(article.getPublishedAt());
    } catch (ParseException e) {
        e.printStackTrace();
    }


    String formatted = output.format(d);
    customViewHolder.articleTime.setText(formatted);
    customViewHolder.articleAuthor.setText(article.getSource().getName());
    customViewHolder.articleTitle.setText(article.getTitle());
    Picasso.get().load(article.getUrlToImage()).into(customViewHolder.articleImage);
    customViewHolder.itemView.setOnClickListener(v -> {
        Intent intent = new Intent(v.getContext(), DetailActivity.class);

        intent.putExtra("urlKey", article.getUrl());

        v.getContext().startActivity(intent);

    });
    customViewHolder.articleShare.setOnClickListener(v -> {
        Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
        sharingIntent.setType("text/plain");
        String articleDescription = article.getDescription();
        String articleTitle = article.getTitle();
        sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, articleDescription);
        sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, articleTitle);
        v.getContext().startActivity((Intent.createChooser(sharingIntent, "Share using")));


    });

    customViewHolder.articleFavorite.setOnClickListener(v -> {
        myClipboard = (ClipboardManager) v.getContext().getSystemService(Context.CLIPBOARD_SERVICE);


        myClip = ClipData.newPlainText("label", customViewHolder.articleTitle.getText().toString());
        myClipboard.setPrimaryClip(myClip);
        Toast.makeText(v.getContext(), "Copied to clipboard", Toast.LENGTH_SHORT).show();

    });
}


@Override
public int getItemCount() {
    if (articles == null) return 0;
    return articles.size();
}

public interface ClickListener {
}

public class CustomViewHolder extends RecyclerView.ViewHolder {
    @BindView(R.id.articleAuthor)
    TextView articleAuthor;
    @BindView(R.id.articleTitle)
    TextView articleTitle;
    @BindView(R.id.articleImage)
    ImageView articleImage;
    @BindView(R.id.articleTime)
    TextView articleTime;
    @BindView(R.id.articleShare)
    ImageButton articleShare;
    @BindView(R.id.articleFavorite)
    ImageButton articleFavorite;

    public CustomViewHolder(View view) {
        super(view);
        ButterKnife.bind(this, view);


    }
}


}

在main.xml下面

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_search"
        android:icon="@drawable/ic_search_white"
        android:title="@string/search_hint"
        app:showAsAction="collapseActionView|ifRoom"
        app:actionViewClass="android.support.v7.widget.SearchView" />
</menu>

正在关注screeshot of recyclerview item in navgation drawer fragment

最佳答案

抱歉回复晚了,但您似乎同时调用了这两个 API。 一种用于获取所有数据,另一种用于获取包含某些字符串的过滤数据(例如,在您的代码中您有“q”)。

您需要从 Fragment 的 onCreateView 中删除以下行。仅在单击搜索图标后调用它。并将 searchInterface.getSearchViewArticles("q"); 中的参数“q”替换为从搜索框中获取的字符串值。

    SportInterface searchInterface = SportClient.getApiService();
    Call<Search> searchCall = searchInterface.getSearchViewArticles("q");
    searchCall.enqueue(new Callback<Search>() {
        @Override
        public void onResponse(Call<Search> call, Response<Search> response) {
            search = response.body();

            if (search != null && search.getArticles() != null) {
                articleList.clear();
                articleList.addAll(search.getArticles());
            }

            if(articleAdapter != null){
                articleAdapter.notifyDataSetChanged();
            } else {
                articleAdapter = new ArticleAdapter(articleList, search);
                RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext());
                recyclerView.setLayoutManager(layoutManager);
                recyclerView.setAdapter(articleAdapter);
            }
        }

        @Override
        public void onFailure(Call<Search> call, Throwable t) {

        }
    });

关于java - recyclerview 项目显示抽屉导航 fragment 中显示空白屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56441827/

相关文章:

java - POM.xml依赖错误

android - 如何在多风格应用程序中添加多个 Google Maps API 配置

java - SelectionTracker.Builder 不工作 IllegalArgumentException

android - 如何自定义放置自动完成小部件对话框设计以列出位置

android - 带有 RecyclerView 的自定义对话框在屏幕上膨胀得非常小

java - 我如何知道我在点击什么 Recyclerview - Firebase 删除数据

java - 如何更改对象实例并在同一方法中返回值?

java - 如果类只有构造函数,我应该在类中声明变量吗?

java - 事件发生时要显示的JFrame?

java - 在 Android 应用程序中托管可执行文件