onClickItem不起作用,出现错误:未连接适配器,跳过布局

huangapple go评论102阅读模式
英文:

onClickItem not working with error No adapter attached, skipping layout

问题

I am using 2 activities (Main and VideoPlayActivity).it shows a recycler view and when clicked on any item the app stop working.

我使用了两个活动(主活动和VideoPlayActivity)。它显示一个可滚动视图,但当单击任何项时,应用程序停止工作。

I am trying to create an intent for onCLickItem to run a new activity I am getting this error

我正在尝试创建一个意图以在单击项目时运行一个新活动,但我遇到了这个错误

my adatper class is like this

我的适配器类如下所示

My MainActivity is as follows

我的MainActivity如下所示

英文:

I am using 2 activities (Main and VideoPlayActivity).it shows a recycler view and when clicked on any item the app stop working.

I am trying to create an intent for onCLickItem to run a new activity I am getting this error

  1. 2020-09-06 09:48:56.601 15956-15956/? E/Zygote: isWhitelistProcess - Process is Whitelisted
  2. 2020-09-06 09:48:58.827 15956-15956/com.currentmedia.channel E/RecyclerView: No adapter attached; skipping layout
  3. 2020-09-06 09:49:10.757 15956-15956/com.currentmedia.channel E/AndroidRuntime: FATAL EXCEPTION: main
  4. Process: com.currentmedia.channel, PID: 15956
  5. java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.currentmedia.channel.VideoDetails.getVideoId()' on a null object reference
  6. at com.currentmedia.channel.adapter$1.onClick(adapter.java:54)
  7. at android.view.View.performClick(View.java:6935)
  8. at android.view.View$PerformClick.run(View.java:26214)
  9. at android.os.Handler.handleCallback(Handler.java:790)
  10. at android.os.Handler.dispatchMessage(Handler.java:99)
  11. at android.os.Looper.loop(Looper.java:164)
  12. at android.app.ActivityThread.main(ActivityThread.java:7025)
  13. at java.lang.reflect.Method.invoke(Native Method)
  14. at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:441)
  15. at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)

my adatper class is like this

  1. public class adapter extends RecyclerView.Adapter<adapter.ViewHolder> {
  2. LayoutInflater inflater;
  3. ArrayList<VideoDetails> videoDetailsArrayList;
  4. Context ctx;
  5. VideoDetails videoDetails;
  6. RecyclerView recyclerView;
  7. //Constructor for adaptor
  8. public adapter(Context ctx, ArrayList<VideoDetails> videoDetailsArrayList)
  9. {
  10. this.videoDetailsArrayList=videoDetailsArrayList;
  11. //this.videoDetails=videoDetails;
  12. this.ctx=ctx;
  13. this.inflater=LayoutInflater.from(ctx);
  14. }
  15. @NonNull
  16. @Override
  17. public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  18. View view=inflater.inflate(R.layout.custom_layout,parent,false);
  19. return new ViewHolder(view);
  20. }
  21. @Override
  22. public void onBindViewHolder(ViewHolder holder, int position) {
  23. holder.textView.setText(videoDetailsArrayList.get(position).getTitle());
  24. holder.imageView.setOnClickListener(new View.OnClickListener() {
  25. @Override
  26. public void onClick(View view) {
  27. Intent i=new Intent(ctx, VideoPlayActivity.class);
  28. i.putExtra("videoId", videoDetails.getVideoId());
  29. ctx.startActivity(i);
  30. }
  31. });
  32. final VideoDetails videoDetails=(VideoDetails)
  33. this.videoDetailsArrayList.get(position);
  34. // final VideoDetails videoDetails=(VideoDetails) this.videoDetailsArrayList.get(position);
  35. Picasso.get().load(videoDetails.getUrl()).into(holder.imageView);
  36. }
  37. @Override
  38. public int getItemCount() {
  39. return videoDetailsArrayList.size();
  40. }
  41. public static class ViewHolder extends RecyclerView.ViewHolder {
  42. TextView textView;
  43. ImageView imageView;
  44. public ViewHolder(View itemView) {
  45. super(itemView);
  46. textView=itemView.findViewById(R.id.mytitle);
  47. imageView=itemView.findViewById(R.id.imageView);
  48. }
  49. }
  50. }

My MAinActivity is as follows

  1. public class MainActivity extends AppCompatActivity {
  2. RecyclerView recyclerView;
  3. ArrayList<VideoDetails> videoDetailsoArrayList;
  4. String API_Key = "";
  5. String url="https://www.googleapis.com/youtube/v3/search?part=snippet&channelId=UCVMWWQ985A_-SESZUy_SsVQ&maxResults=50&key=";
  6. adapter adapter;
  7. Context ctx;
  8. @Override
  9. protected void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.activity_main);
  12. recyclerView=findViewById(R.id.listView);
  13. videoDetailsoArrayList= new ArrayList<>();
  14. adapter=new adapter(MainActivity.this,videoDetailsoArrayList);
  15. displayVideos();
  16. }
  17. private void displayVideos ()
  18. {
  19. RequestQueue requestQueue= Volley.newRequestQueue(this);
  20. StringRequest stringRequest=new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
  21. @Override
  22. public void onResponse(String response) {
  23. try {
  24. JSONObject jsonObject = new JSONObject(response);
  25. JSONArray jsonArray = jsonObject.getJSONArray("items");
  26. for (int i = 0; i < jsonArray.length(); i++) {
  27. JSONObject jsonObject1 = jsonArray.getJSONObject(i);
  28. if (jsonObject1.has("id")){
  29. JSONObject jsonVideoId=jsonObject1.getJSONObject("id");
  30. if (jsonVideoId.has("kind")){
  31. if(jsonVideoId.getString("kind").equals("youtube#video")){
  32. JSONObject jsonObjectSnippet = jsonObject1.getJSONObject("snippet");
  33. JSONObject jsonObjectDefault=jsonObjectSnippet.getJSONObject("thumbnails").getJSONObject("medium");
  34. String video_id=jsonVideoId.getString("videoId");
  35. VideoDetails vd=new VideoDetails();
  36. vd.setVideoId(video_id);
  37. vd.setTitle(jsonObjectSnippet.getString("title"));
  38. vd.setDescription(jsonObjectSnippet.getString("description"));
  39. vd.setUrl(jsonObjectDefault.getString("url"));
  40. videoDetailsoArrayList.add(vd);
  41. }
  42. // recyclerView.setAdapter(adapter);
  43. // adapter.notifyDataSetChanged();
  44. }
  45. }
  46. }
  47. }catch (JSONException e) {
  48. e.printStackTrace();
  49. }
  50. recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
  51. adapter= new adapter(getApplicationContext(),videoDetailsoArrayList);
  52. recyclerView.setAdapter(adapter);
  53. }
  54. }, new Response.ErrorListener() {
  55. @Override
  56. public void onErrorResponse(VolleyError error) {
  57. Toast.makeText(getApplicationContext(),error.getMessage(), LENGTH_LONG).show();
  58. }
  59. });
  60. requestQueue.add(stringRequest);
  61. }
  62. }

I have tried the stackover solutions <https://stackoverflow.com/questions/37202720/no-adapter-attached-skipping-layout-recyclerview> , https://stackoverflow.com/questions/48057595/no-adapter-attach-skipping-layout , https://stackoverflow.com/questions/47546917/attempt-to-invoke-virtual-method-java-lang-string-android-content-context-getpa ,
I have also applied the NPE declaration method in the adapter constructor ctx=ctx

答案1

得分: 1

Your Viewholder.ctx does not have context reference in that object hence the error, we don't set the onClickListener in ViewHolder class, look at the below.

  1. public class adapter extends RecyclerView.Adapter<adapter.ViewHolder> {
  2. LayoutInflater inflater;
  3. ArrayList<VideoDetails> videoDetailsArrayList;
  4. Context ctx;
  5. VideoDetails videoDetails;
  6. RecyclerView recyclerView;
  7. //Constructor for adaptor
  8. public adapter(Context ctx, ArrayList<VideoDetails> videoDetailsArrayList) {
  9. this.inflater = LayoutInflater.from(ctx);
  10. this.videoDetailsArrayList = videoDetailsArrayList;
  11. this.videoDetails = videoDetails;
  12. }
  13. @Override
  14. public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  15. View view = inflater.inflate(R.layout.custom_layout, parent, false);
  16. return new ViewHolder(view);
  17. }
  18. @Override
  19. public void onBindViewHolder(ViewHolder holder, int position) {
  20. holder.textView.setText(videoDetailsArrayList.get(position).getTitle());
  21. holder.imageView.setOnClickListener(new View.OnClickListener() {
  22. @Override
  23. public void onClick(View view) {
  24. Intent i = new Intent(ctx, VideoPlayActivity.class);
  25. i.putExtra("videoId", videoDetails.getVideoId());
  26. ctx.startActivity(i);
  27. }
  28. });
  29. final VideoDetails videoDetails = (VideoDetails)
  30. this.videoDetailsArrayList.get(position);
  31. Picasso.get().load(videoDetails.getUrl()).into(holder.imageView);
  32. }
  33. @Override
  34. public int getItemCount() {
  35. return videoDetailsArrayList.size();
  36. }
  37. public class ViewHolder extends RecyclerView.ViewHolder {
  38. TextView textView;
  39. ImageView imageView;
  40. Context ctx;
  41. public ViewHolder(View itemView) {
  42. super(itemView);
  43. textView = itemView.findViewById(R.id.mytitle);
  44. imageView = itemView.findViewById(R.id.imageView);
  45. }
  46. }
  47. }

By this, you dont need to pass context to ViewHolder as Context ctx reference is already there in Adapter class.

英文:

Your Viewholder.ctx does not have context reference in that object hence the error, we don't set the onClickListener in ViewHolder class, look at the below.

  1. public class adapter extends RecyclerView.Adapter&lt;adapter.ViewHolder&gt; {
  2. LayoutInflater inflater;
  3. ArrayList&lt;VideoDetails&gt; videoDetailsArrayList;
  4. Context ctx;
  5. VideoDetails videoDetails;
  6. RecyclerView recyclerView;
  7. //Constructor for adaptor
  8. public adapter(Context ctx, ArrayList&lt;VideoDetails&gt; videoDetailsArrayList)
  9. {
  10. this.inflater=LayoutInflater.from(ctx);
  11. this.videoDetailsArrayList=videoDetailsArrayList;
  12. this.videoDetails=videoDetails;
  13. }
  14. @Override
  15. public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  16. View view=inflater.inflate(R.layout.custom_layout,parent,false);
  17. return new ViewHolder(view);
  18. }
  19. @Override
  20. public void onBindViewHolder(ViewHolder holder, int position) {
  21. holder.textView.setText(videoDetailsArrayList.get(position).getTitle());
  22. holder.imageView.setOnClickListener(new View.OnClickListener() {
  23. @Override
  24. public void onClick(View view) {
  25. Intent i=new Intent(ctx, VideoPlayActivity.class);
  26. i.putExtra(&quot;videoId&quot;, videoDetails.getVideoId());
  27. ctx.startActivity(i);
  28. }
  29. });
  30. final VideoDetails videoDetails=(VideoDetails)
  31. this.videoDetailsArrayList.get(position);
  32. Picasso.get().load(videoDetails.getUrl()).into(holder.imageView);
  33. }
  34. @Override
  35. public int getItemCount() {
  36. return videoDetailsArrayList.size();
  37. }
  38. public class ViewHolder extends RecyclerView.ViewHolder {
  39. TextView textView;
  40. ImageView imageView;
  41. Context ctx;
  42. public ViewHolder(View itemView) {
  43. super(itemView);
  44. textView=itemView.findViewById(R.id.mytitle);
  45. imageView=itemView.findViewById(R.id.imageView);
  46. }
  47. }
  48. }

By this, you dont need to pass context to ViewHolder as Context ctx reference is already there in Adapter class.

huangapple
  • 本文由 发表于 2020年9月6日 04:13:26
  • 转载请务必保留本文链接:https://go.coder-hub.com/63758094.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定