RecyclerView ViewHolder 的新活动卡在黑屏上

Posted

技术标签:

【中文标题】RecyclerView ViewHolder 的新活动卡在黑屏上【英文标题】:New Activity from RecyclerView ViewHolder stuck on blackscreen 【发布时间】:2021-07-25 08:15:54 【问题描述】:

我正在尝试制作一个简单的应用程序,其中您在 RecyclerView 中有一个元素列表,如果您单击任何一个,您可以查看更多详细信息。我坚持如何从 RecyclerView 内部启动新活动。我尝试了许多在这里找到的解决方案,但没有一个有效。

我的新 Activity 从未启动(我从未在 GroupActivity 上看到 Toast 消息)并且应用卡在黑屏上,但由于我在 onClick 函数中看到消息而触发了侦听器。

我检查了我的新活动在 androidManifest.xml 中,并且我在新活动上有 setContentView

我的新活动,GroupActivity.java


    public class GroupActivity extends AppCompatActivity 
        
        @Override
        public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) 
            super.onCreate(savedInstanceState, persistentState);
            setContentView(R.layout.activity_group);
    
            Toast.makeText(this, "Started new activity", Toast.LENGTH_SHORT).show();
    
        
        
    

我的activity_group.xml:


    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_
        android:layout_
        android:orientation="vertical"
        android:background="@color/white">
    
    
        <TextView
            android:id="@+id/textView2"
            android:layout_
            android:layout_
            android:text="Hello!"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent" />

    </androidx.constraintlayout.widget.ConstraintLayout>

我的 RecyclerView 适配器,RecyclerAdapter.java


    public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> 
    
        private String data[];
        private Context context;
    
        public RecyclerAdapter(Context context, String[] data) 
            this.data = data;
            this.context = context;
        
    
        @NonNull
        @Override
        public RecyclerAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) 
            LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
            View view = layoutInflater.inflate(R.layout.custom_item, parent, false);
            ViewHolder viewHolder = new ViewHolder(view);
            return viewHolder;
        
    
        @Override
        public void onBindViewHolder(@NonNull RecyclerAdapter.ViewHolder holder, int position) 
            holder.textView.setText(data[position]);
            holder.itemView.setOnClickListener(new View.OnClickListener() 
                @Override
                public void onClick(View v) 
                    Toast.makeText(this.context,"The Item Clicked is: " + getPosition(), Toast.LENGTH_SHORT).show();
                    Intent intent = new Intent(context, GroupActivity.class);
                    context.startActivity(intent);
                
            );
        
    
        @Override
        public int getItemCount() 
            return data.length;
        
    
        public class ViewHolder extends RecyclerView.ViewHolder /*implements View.OnClickListener*/ 
    
            // private final Context context;
            TextView textView;
    
            public ViewHolder(@NonNull View itemView) 
                super(itemView);
                textView = itemView.findViewById(R.id.textName);
                context = itemView.getContext();
                // itemView.setClickable(true);
                // itemView.setOnClickListener(this);
            
    
            /* @Override
            public void onClick(View v) 
                Toast.makeText(context,"The Item Clicked is: " + getPosition(),Toast.LENGTH_SHORT).show();
                Intent intent = new Intent(context, GroupActivity.class);
                context.startActivity(intent);
             */
        
    

从注释行中可以看出,我都尝试在 ViewHolder 和 onBindViewHolder 中添加 OnClickListener。有什么想法吗?

【问题讨论】:

你的听众被触发了吗? @dinkar_kumar 是的,我添加了一条 Toast 消息,当我单击一个元素时,消息会弹出 但是您在问题中说了以下。 My new Activity never starts (i never see the Toast message) and the app gets stuck on a black screen,那么向您显示了哪个 toast 消息,您通过该消息验证了您的侦听器正在工作? @dinkar_kumar 不是 GroupActivity.java 上的 toast 消息,我的意思是我在 onBindViewHolder 方法的 onClickListener 中添加了一条 Toast 消息,而我看到的就是那个。我从来没有在 GroupActivity.onCreate 方法中看到过这个。对不起,让我编辑我的代码 是的,你应该总是粘贴最新的代码,否则我怎么知道你在说什么或在谈论什么 【参考方案1】:

删除这一行

上下文 = itemView.getContext();

在 ViewHolder 中。因为当您想要意图时,您需要活动的上下文,而不是 itemView。

看来你改变了你的主题。转到 res-> values-> 主题-> theme.xml

变化:

<style name="Theme.Practica1" parent="Theme.AppCompat.NoActionBar">

<style name="Theme.Practica1" parent="Theme.AppCompat.Light.NoActionBar">

然后您的小组活动将是白色的。 由于工具栏的原因,您需要将原色更改为另一种颜色,并且还需要仅使用 1 个参数(Bundle)覆盖 onCreate 方法

【讨论】:

不走运,仍然是黑屏。我确保我正确传递了 MainActivity 上下文并且仍然无法正常工作。我最终删除了它,因为我可以看到问题 如果您的项目是开源的,您可以发送您的 URL 吗? 我已经上传到驱动供你下载:drive.google.com/file/d/1OXy4jNEjA4AdGPLmEQeg6TMf2OeXuVKb/… 更新我的答案。请检查。 我这样做了,并将我的主要和次要颜色更改为粉色和蓝色,这样我就可以分辨出区别了。现在我得到一个白屏,但在 GroupActivity 的 textView 中看不到“Hello”。我误解你的答案了吗?

以上是关于RecyclerView ViewHolder 的新活动卡在黑屏上的主要内容,如果未能解决你的问题,请参考以下文章

Recyclerview ViewHolder中的TextView - OnClickListener

RecyclerView.ViewHolder 是不是总是必须是内部类?

在“ListAdapter”或“RecyclerView.ViewHolder”做繁重的工作?

等效于 RecyclerView 中 ViewHolder 的 onAttachedToWindow()/onDetachedFromWindow()

ViewHolder 中的嵌套 RecyclerView 破坏了折叠工具栏布局

不可见的 ViewHolder 动画在 RecyclerView 中延迟