当前位置: 首页 > 知识库问答 >
问题:

无法基于recyclerAdapter(Viewpager2)内部的sharedpreference更改可见性

澹台建华
2023-03-14

我得到了一个ViewPager2适配器,其中包含2EditText和2TextView。开始时,EditTexts是可见的,而Textviews则消失了。如果我点击一个按钮,如果在1个(或两者)EditText中写的是好答案,则专用EditText被设置为gone,而Textview(显示答案)现在被设置为visible。问题是这些可见性更改没有保存,当我退出并回到这个Viewpager时,Textviews没有了,EditText也可见了,就好像什么都没发生一样。

我尝试使用saveInstanceState,但由于EditTexts只在适配器中定义,在我看来这不是解决方案。

这就是为什么我尝试使用sharedpreference,但我并不真正知道它在适配器内部是如何工作的,并且在启动它时会出现错误。我试图保存布尔值内部可见性的变化,就像我在其他程序中看到的那样。错误:

error: missing return statement
    }
  


error: unreachable statement
        artistetextVisibility = preferences.getBoolean("Atextvisibility", false);

下面是我的代码:

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

    private List<Integer> mimages;
    private LayoutInflater mInflater;
    private ViewPager2 viewPager2;
    private List<String> artistetext;
    private List<String> titretext;
    private boolean artistetextVisibility, titretextVisibility, artisteVisibility, titreVisibility;
    Context context;
    SharedPreferences preferences = context.getSharedPreferences("MyPref", MODE_PRIVATE);

    viewpageradapter_rap_level1(Context context, ViewPager2 viewPager2, List<Integer> images,int position, List<String> artistetext, List<String> titretext) {
        this.mInflater = LayoutInflater.from(context);
        this.mimages = images;
        this.viewPager2 = viewPager2;
        this.artistetext= artistetext;
        this.titretext= titretext;


    }


    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = mInflater.inflate(R.layout.viewpager_content_rap_level1, parent, false);
        return new ViewHolder(view);
        artistetextVisibility = preferences.getBoolean("Atextvisibility", false);
        titretextVisibility = preferences.getBoolean("Ttextvisibility", false);
        artisteVisibility = preferences.getBoolean("Avisibility", true);
        titreVisibility = preferences.getBoolean("Tvisibility", true);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {

        holder.gridIcon.setImageResource(mimages.get(position));
        holder.ArtisteTexts.setText(artistetext.get(position));
        holder.TitreTexts.setText(titretext.get(position));
    }

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


    // stores and recycles views as they are scrolled off screen
    public class ViewHolder extends RecyclerView.ViewHolder {
        EditText Artiste;
        Button button;
        ImageView gridIcon;
        EditText Titre;
        TextView ArtisteTexts;
        TextView TitreTexts;


        ViewHolder(View itemView) {
            super(itemView);
            Artiste = itemView.findViewById(R.id.Artiste);
            button = itemView.findViewById(R.id.btnToggle);
            gridIcon = itemView.findViewById(R.id.imageView2);
            Titre = itemView.findViewById(R.id.titre);
            ArtisteTexts = itemView.findViewById(R.id.Artistetext);
            TitreTexts = itemView.findViewById(R.id.TitreTexts);



            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    SharedPreferences preferences = context.getSharedPreferences("MyPref", MODE_PRIVATE);
                    artistetextVisibility = preferences.getBoolean("Atextvisibility", false);
                    titretextVisibility = preferences.getBoolean("Ttextvisibility", false);
                    artisteVisibility = preferences.getBoolean("Avisibility", true);
                    titreVisibility = preferences.getBoolean("Ttextvisibility", true);
                    String ValueTitre = Titre.getText().toString();
                    String ValueArtiste = Artiste.getText().toString();
                   

                    
                    if (getAdapterPosition() == 0)
                    {
                        if(ValueTitre.equalsIgnoreCase("Random Access Memories"))
                        {
                            Toast.makeText(v.getContext(), "done", Toast.LENGTH_LONG).show();

                            SharedPreferences.Editor editor = preferences.edit();
                            editor.putBoolean("Ttextvisibility", true);
                            editor.putBoolean("Tvisibility", false);
                            editor.commit();
                            Titre.setVisibility(View.GONE);
                            TitreTexts.setVisibility(View.VISIBLE);



                        }
                        if(ValueArtiste.equalsIgnoreCase("Daft Punk"))
                        {
                            SharedPreferences.Editor editor = preferences.edit();
                            editor.putBoolean("Atextvisibility", true);
                            editor.putBoolean("Avisibility", false);
                            editor.commit();
                            Titre.setVisibility(View.GONE);
                            TitreTexts.setVisibility(View.VISIBLE);
                        }

                        else {
                            Toast.makeText(v.getContext(), "error", Toast.LENGTH_LONG).show();
                        }
                    }
                }
            });
        }
    }

在验证一个答案之后,我设法存储了布尔值,但当使用以下代码(Onclick inside Viewholder)返回活动时,它仍然不起作用:

 if (getAdapterPosition() == 0)
                    {
                        if(ValueTitre.equalsIgnoreCase("Random Access Memories"))
                        {
                            Toast.makeText(v.getContext(), "Album validé!", Toast.LENGTH_LONG).show();
                            SharedPreferences preferences = mContext.getSharedPreferences("MyPref", MODE_PRIVATE);
                            preferences.edit().putBoolean("Ttextvisibility", true).commit();
                            preferences.edit().putBoolean("Tvisibility", false).commit();
                            Titre.setVisibility(View.GONE);
                            TitreTexts.setVisibility(View.VISIBLE);



                        }

我有些问题。

1)布尔值被设置为false,因为我的Textview是不可见的。我验证答案,并将其替换为True。我在viewholder中测试是否在sharedpreferences中正确地替换了布尔值,在验证后使用一个按钮检查布尔值是否等于“True”,并且每次都似乎等于“True”,甚至在我终止并再次启动应用程序时也是如此。为什么?如果我终止应用程序,所以答案从未被验证,为什么它说布尔值是True?

button_orientation.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View u) {
                    SharedPreferences preferences = mContext.getSharedPreferences("MyPref", MODE_PRIVATE);
                    boolean value =preferences.getBoolean("Ttextvisibility", false);

                        if (value == true) {
                            Toast.makeText(u.getContext(), "Value", Toast.LENGTH_LONG).show();
                        }}

通过更改布尔值,我尝试在公共类Viewholder中更改项的可见性:

SharedPreferences preferences=mContext.getSharedPreferences(“mypref”,MODE_PRIVATE布尔值=preferences.getBoolean(“ttextVisibility”,false);

然后是在我的ViewWholder中,因为getAdapterPosition()不能单独在ViewWholder类中工作(我需要这个方法,因为它必须根据viewpager中的位置更改特定的textviews)。

ViewHolder(View itemView) {
            super(itemView);
            
...

            ArtisteTexts = itemView.findViewById(R.id.Artistetext);
            TitreTexts = itemView.findViewById(R.id.TitreTexts);

            if (getAdapterPosition() == 0) {
                if (value == true) {
                    Titre.setVisibility(View.GONE);
                    TitreTexts.setVisibility(View.VISIBLE);
                }
            }

它没有改变什么,可视性设置与开始时一样....我真的迷失了,我再也不知道该怎么办了,也许是上错班了?希望任何人能帮助我…

共有1个答案

计燕七
2023-03-14

如果您能分享您所得到的错误和其他代码,那将是很好的!:)

好的,那么:

请注意此处:

  public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = mInflater.inflate(R.layout.viewpager_content_rap_level1, parent, false);
    ***return new ViewHolder(view);***
            artistetextVisibility = preferences.getBoolean("Atextvisibility", false);
            titretextVisibility = preferences.getBoolean("Ttextvisibility", false);
            artisteVisibility = preferences.getBoolean("Avisibility", true);
            titreVisibility = preferences.getBoolean("Tvisibility", true);

返回后的所有内容都是不可达的,因为您已经返回了一个值并离开了方法。代码的其余部分永远不会执行

 类似资料:
  • 是否可以(仅仅)使用Byte-Buddy更改某些方法的可见性?我有一个带有私有静态方法的用户类,我需要将一些调用委托给这些方法,但由于它们是私有的,所以当前失败了。因此,我想知道是否可以通过添加公共修饰符来转换上述方法来重新定义user类。 对于记录,在目标Java方法上调用setAccessible(true)方法作为not effect,因为Byte Buddy仍然失败,出现以下异常: 我发现

  • 我对viewpage er2有一个要求,在肖像上我需要显示1张完整的卡片,在风景上,我需要将其设为2,同时显示上一张和下一张卡片的边界。我如何实现它,因为使用viewpager更容易实现,但viewpage er2无法做到? 请建议一些可行的解决方案或替代方案,以获取页面宽度()我们在寻呼机上,根据设备的方向用来设置页面宽度大小

  • 假设您正在编写一个Android项目(不是库)。所有文件都编译在一起,因此......在这种情况下使用可见性修饰符有任何意义吗?

  • 我是Netbeans和Java的新手,对jpanels上的jlabel有一个问题。我有一个jTabbedPane,里面有一个jPanel。我在JPanel上有一个jLabel。我想将jLabel的可见性设置为false,但似乎不起作用。当我运行程序时,标签仍然可见。我不明白为什么。

  • 我正在研究一个涉及for循环和if-else语句的java函数。我需要根据多次迭代中的条件更改标志变量的值。我声明了一个名为flag的变量,并希望根据每次迭代中的条件进行更改。我需要在每次迭代结束时打印flag变量的值。但是当我打印变量时,它显示了一个错误,变量没有初始化。如果我给它一个初始值,它会一直打印初始值,而不是在If-else语句中处理的值。我不能根据自己的要求初始化for循环中的fla

  • 问题内容: 基本上,这是在尝试回答另一个问题时出现的。假设此代码: 我了解以下事实:这是 无序的无限流 ,要使其完成,必须进行短路操作(在这种情况下)。我也了解,在达到该限制之前,可以随意调用Stream实现多次。 在java-8下运行此命令,将始终打印(可能不总是打印,但在我的机器上是这样)。 相反,在java-10下运行this很少超过。所以我的问题是内部发生了什么变化,从而使短路发生得更好了