首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RecyclerView clickListener不工作

RecyclerView clickListener不工作
EN

Stack Overflow用户
提问于 2020-07-21 16:09:53
回答 2查看 115关注 0票数 0

我已经使用最佳实践实现了recyclerView点击监听器,但它仍然不起作用。回收视图正在使用改造从互联网上加载数据,应该带用户到文章发布的站点,以下是我的代码:

注意:我的RecyclerView是卡视图的RecyclerView

RecyclerView适配器

代码语言:javascript
复制
    public class NewsArticleAdapter extends RecyclerView.Adapter<NewsArticleAdapter.Viewholder> {
    private ArrayList<Article> newsArticles = new ArrayList<>();
    private Context context;
    private OnArticleListener onArticleListener;

    public NewsArticleAdapter(List<Article> newsArticles, Context context, OnArticleListener onArticleListener) {
        this.newsArticles = (ArrayList<Article>) newsArticles;
        this.context = context;
        this.onArticleListener = onArticleListener;
    }

    @NonNull
    @Override
    public Viewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.news_list_item, parent, false);
        Viewholder viewholder = new Viewholder(view, onArticleListener);
        return viewholder;
    }

    @Override
    public void onBindViewHolder(@NonNull Viewholder holder, int position) {
        Article currentArticle = newsArticles.get(position);

        holder.newsHeadline.setText(currentArticle.getTitle());
        Glide.with(context)
                .load(currentArticle.getUrlToImage())
                .placeholder(R.drawable.ic_launcher_foreground)
                .into(holder.newsImage);
        holder.newsContent.setText(currentArticle.getContent());
//        holder.publishedTime.setText(UTCtoLocalDateConverter(currentArticle.getPublishedAt()));


    }

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

    public class Viewholder extends RecyclerView.ViewHolder implements View.OnClickListener {
        OnArticleListener onArticleClickedListner;
        TextView newsHeadline;
        TextView newsContent;
        //       TextView publishedTime;
        ImageView newsImage;
        ConstraintLayout parentLayout;

        public Viewholder(@NonNull View itemView, OnArticleListener onArticleListener) {
            super(itemView);
            newsHeadline = itemView.findViewById(R.id.news_headline_textView);
            newsContent = itemView.findViewById(R.id.news_content_textView);
//            publishedTime = itemView.findViewById(R.id.published_time_textView);
            newsImage = itemView.findViewById(R.id.news_image_view);
            parentLayout = itemView.findViewById(R.id.list_item_parent_layout);
            onArticleClickedListner = onArticleListener;
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {
            Log.d("RecyclerViewAdapter", "item position clicked: " + getAdapterPosition());
            onArticleClickedListner.onArticleClicked(getAdapterPosition());
        }
    }

    /*RecyclerView onItemClickListenerInterface*/
    public interface OnArticleListener {
        void onArticleClicked(int position);

    }

}

MainActivity (房屋RecyclerView)

代码语言:javascript
复制
public class MainActivity extends AppCompatActivity implements NewsArticleAdapter.OnArticleListener {
private RecyclerView newsRecyclerView;
private NewsArticleAdapter newsAdapter;
private NewsAPI NewsAPI;
private ArrayList<Article> newsArticles;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    newsRecyclerView = findViewById(R.id.newsRecyclerView);
    newsAdapter = new NewsArticleAdapter(new ArrayList<Article>(), this, this);
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
    newsRecyclerView.setLayoutManager(layoutManager);
    newsRecyclerView.setAdapter(newsAdapter);


    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(RetrofitClient.BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    NewsAPI = retrofit.create(NewsAPI.class);

    Call<Example> call = NewsAPI.getRootJSONObject();

    call.enqueue(new Callback<Example>() {
        @Override
        public void onResponse(Call<Example> call, Response<Example> response) {
            if (response.isSuccessful()) {
                newsArticles = (ArrayList<Article>) response.body().getArticles();
                refreshAdapterWithNewsArticles(newsArticles);
            } else {
                Log.d("MainActivity", "Error in on Response " + String.valueOf(response.code()));
            }
        }

        @Override
        public void onFailure(Call<Example> call, Throwable t) {
            Toast.makeText(MainActivity.this, "Error retrieving News Articles :(", Toast.LENGTH_SHORT).show();
        }
    });


}
/*
 *Method used to generate list of data using recyclerView with costom adapter
 *  */
private void refreshAdapterWithNewsArticles(List<Article> body) {
    newsAdapter = null;
    newsAdapter = new NewsArticleAdapter(body, this, MainActivity.this);
    newsRecyclerView.setAdapter(newsAdapter);

}

@Override
public void onArticleClicked(int position) {
    Log.d("MainActivity", "onArticleClicked Was called in MainACtivity");
    Article currentArticle = newsArticles.get(position);
    Uri articleUri = Uri.parse(currentArticle.getUrl());
    Intent intent = new Intent(Intent.ACTION_VIEW, articleUri);
    startActivity(intent);
}

}

EN

回答 2

Stack Overflow用户

发布于 2020-07-21 16:32:23

this answerJacob Tabak提供的代码的启发,在onCreate方法下的mainActivity中。

代码语言:javascript
复制
recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(MainActivity.this, recyclerView, new RecyclerItemClickListener.OnItemClickListener() {
        @Override
        public void onItemClick(View view, int position) {
            //whatever you want to do with position
        }

        @Override
        public void onLongItemClick(View view, int position) {
            //whatever you want to do with position
        }
    }));

并创建一个新的类名为RecyclerItemClickListener并粘贴到

代码语言:javascript
复制
public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
GestureDetector mGestureDetector;
private OnItemClickListener mListener;

public RecyclerItemClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener) {
    mListener = listener;
    mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            return true;
        }

        @Override
        public void onLongPress(MotionEvent e) {
            View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
            if (child != null && mListener != null) {
                mListener.onLongItemClick(child, recyclerView.getChildAdapterPosition(child));
            }
        }
    });
}

@Override
public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
    View childView = view.findChildViewUnder(e.getX(), e.getY());
    if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
        mListener.onItemClick(childView, view.getChildAdapterPosition(childView));
        return true;
    }
    return false;
}

@Override
public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) {
}

@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}

public interface OnItemClickListener {
    public void onItemClick(View view, int position);

    public void onLongItemClick(View view, int position);
}}

这是一个定制的RecyclerItemClickListener。

票数 0
EN

Stack Overflow用户

发布于 2020-07-21 16:53:26

为什么不试试onBindViewHolder()方法中的侦听器呢?

代码语言:javascript
复制
holder.your_layout_item.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            onArticleClickedListner.onArticleClicked(position);
        }
    });

如果你有任何混淆,我可以解释得更清楚。如果你解决了它,你就能接受答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63018577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档