java - 如何从 recyclerview newsapi 加载 url

标签 java android android-recyclerview

我正在开发一个使用 fragment 的新闻阅读器应用程序。我从 newsapi 获取数据。到目前为止,我已经设法从 api 中提取数据并将其显示在 recyclerview 中,但是当我单击某个项目时,没有任何反应!

public class HomeFragment extends Fragment implements RecyclerViewAdapter.OnItemClickListener {

    public static final String API_KEY= "c03ceb6a99b14050875f56xxxxxxxx";
    private RecyclerView recyclerView;
    private List<Article> articles = new ArrayList<>();
    private RecyclerViewAdapter recyclerViewAdapter;



    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
       View rootView = inflater.inflate(R.layout.fragment_home,container,false);

        recyclerView = rootView.findViewById(R.id.recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        recyclerViewAdapter = new RecyclerViewAdapter(articles,getActivity());
        recyclerViewAdapter.setOnItemClickListener(HomeFragment.this);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setNestedScrollingEnabled(false);
        LoadJsonData();
        return rootView;


    }

    public void LoadJsonData(){

        ApiInterface apiInterface = ApiClient.getApiClient().create(ApiInterface.class);

        String country = Utils.getCountry();

        Call <News> call;
        call = apiInterface.getNews(country,API_KEY);

        call.enqueue(new Callback<News>() {
            @Override
            public void onResponse(Call<News> call, Response<News> response) {

                if (response.isSuccessful() && response.body().getArticle() != null){

                    if (!articles.isEmpty()){
                        articles.clear();
                    }

                    articles = response.body().getArticle();
                    recyclerViewAdapter = new RecyclerViewAdapter(articles,getActivity());
                    recyclerView.setAdapter(recyclerViewAdapter);
                    recyclerViewAdapter.setOnItemClickListener(HomeFragment.this);
                    recyclerViewAdapter.notifyDataSetChanged();
                } else {

                    Toast.makeText(getActivity(),"No result",Toast.LENGTH_SHORT).show();
                }
            }

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

            }
        });

    }

    @Override
    public void onItemClick(int position) {

      articles.get(position);


    }


}

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {

    private List<Article> articles;
    private Context context;
    private OnItemClickListener onItemClickListener;

    public interface OnItemClickListener {

        void onItemClick(int position);

    }

    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        this.onItemClickListener = onItemClickListener;
    }


    public RecyclerViewAdapter(List<Article> articles, Context context) {
        this.articles = articles;
        this.context = context;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {

        View view = LayoutInflater.from(context).inflate((R.layout.card_view_layout), viewGroup, false);

        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {

        final ViewHolder holder = viewHolder;
        Article model = articles.get(i);

        RequestOptions requestOptions = new RequestOptions();
        requestOptions.placeholder(Utils.getRandomDrawbleColor());
        requestOptions.error(Utils.getRandomDrawbleColor());
        requestOptions.diskCacheStrategy(DiskCacheStrategy.ALL);
        requestOptions.centerCrop();

        Glide.with(context)
                .load(model.getUrlToImage())
                .apply(requestOptions)
                .listener(new RequestListener<Drawable>() {
                    @Override
                    public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {

                        holder.progressBar.setVisibility(View.GONE);
                        return false;
                    }

                    @Override
                    public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {

                        holder.progressBar.setVisibility(View.GONE);
                        return false;
                    }
                })
                .transition(DrawableTransitionOptions.withCrossFade())
                .into(holder.imageView);

        holder.title.setText(model.getTitle());
        holder.desc.setText(model.getDescription());
        holder.source.setText(model.getSource().getName());
        holder.time.setText(" \u2022 " + Utils.DateToTimeFormat(model.getPublishedAt()));

    }

    @Override
    public int getItemCount() {
        return articles.size();
    }


    public class ViewHolder extends RecyclerView.ViewHolder  {

        TextView title, desc, source, time;
        ImageView imageView;
        ProgressBar progressBar;


        public ViewHolder(@NonNull View itemView) {
            super(itemView);

            title = itemView.findViewById(R.id.title);
            desc = itemView.findViewById(R.id.description);
            source = itemView.findViewById(R.id.source);
            time = itemView.findViewById(R.id.time);
            imageView = itemView.findViewById(R.id.headline_image);
            progressBar = itemView.findViewById(R.id.progress_load);

            itemView.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View view) {

                    if (onItemClickListener != null){
                        int position = getAdapterPosition();
                        if (position != RecyclerView.NO_POSITION){
                            onItemClickListener.onItemClick(position);
                        }
                    }


                }
            });
        }

    }
}

最佳答案

看来您在 onClick 中所做的就是获取项目位置。现在你可以用这个职位做一些事情了。

所以问题归结为,你想做什么?

启动详细信息 Activity/fragment 以显示更多信息?这是移动设备的典型模式。

Intent i = new Intent(context,DetailActivity.class);
i.putExtra(Your Data);
startActivity(i);

关于java - 如何从 recyclerview newsapi 加载 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57791736/

相关文章:

java - Web XML 导致应用程序崩溃?

android - 如何在没有任何延迟和第二个元素延迟的情况下获取第一个元素?

java - 如何设置 Android Studio 中安装的默认项目?

java mongo 数组列表保存

android - 手动扩充自定义 View 会为 ActionBar 自定义 View 生成不同的布局

java - 无法解析方法 .getFilter()

android - 带有动态 Edittext 的 RecyclerView

android - getAdapterPosition 已弃用 我应该改用什么?

java - Android studio 在 java class/findViewById 中添加 admob 错误

android - insertOrThrow 如何与 UNIQUE 约束一起使用?