2017-08-31 49 views
0

我在回收站视图中有切换按钮我在sharedpreference中保存布尔值,以识别是否在应用程序的每次重新启动时按下切换按钮现在问题是 当我点击1切换按钮和关闭应用程序的每个切换为脱离按钮同样的事情按钮那里是切换按钮和回收视图之间没有位置连接,这里是我的代码在RecyclerView中切换按钮位置

@Override 
public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.model,null); 

    MyHolder holder=new MyHolder(v); 
    SharedPreferences sharedPrefs = c.getSharedPreferences("lol", MODE_PRIVATE); 
    Boolean a = sharedPrefs.getBoolean("abc" , false); 
    if(a) { 
     holder.fav.setBackgroundDrawable(ContextCompat.getDrawable(c, R.drawable.star_light)); 
     holder.fav.setChecked(true); 
    } else { 
     holder.fav.setBackgroundDrawable(ContextCompat.getDrawable(c, R.drawable.star_off)); 
     holder.fav.setChecked(false); 
    } 
    return holder; 
} 

@Override 
public void onBindViewHolder(final MyHolder holder, final int position) { 
    holder.nameTxt.setText(players[position]); 
    holder.posTxt.setText(positions[position]); 
    holder.img.setImageResource(images[position]); 
    holder.fav.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      if(isChecked) { 
       holder.fav.setBackgroundDrawable(ContextCompat.getDrawable(c,R.drawable.star_light)); 
      SharedPreferences.Editor editor = c.getSharedPreferences("lol", MODE_PRIVATE).edit(); 
      editor.putBoolean("abc", true); 
      editor.commit(); 
      } else { 
       holder.fav.setBackgroundDrawable(ContextCompat.getDrawable(c, R.drawable.star_off)); 
       SharedPreferences.Editor editor = c.getSharedPreferences("lol", MODE_PRIVATE).edit(); 
       editor.putBoolean("abc", false); 
       editor.commit(); 
      } 
     } 
    }); 
+0

好吧,你是正确的。但是你的问题是什么? –

+0

您使用的逻辑错误。您只使用一个SharedPreferences'abc'值来切换所有按钮。因此,如果一个按钮有效,它就会反映出来。 –

+0

@ josef.adamcik当我点击一个切换按钮并重新启动应用程序时,所有的按钮都变成了他们一样 – Eazyz

回答

0

它的工作谢谢你,这一切都是正确的答案

@Override 
public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.model,null); 

    MyHolder holder=new MyHolder(v); 

    return holder; 
} 


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


    holder.nameTxt.setText(players[position]); 
    holder.posTxt.setText(positions[position]); 
    holder.img.setImageResource(images[position]); 
    SharedPreferences sharedPrefs = c.getSharedPreferences("lol", MODE_PRIVATE); 
    Boolean a = sharedPrefs.getBoolean("abc" + position, false); 
    if (a){ 
     holder.fav.setBackgroundDrawable(ContextCompat.getDrawable(c, R.drawable.star_light)); 
     holder.fav.setChecked(true); 

    }else { 
     holder.fav.setBackgroundDrawable(ContextCompat.getDrawable(c, R.drawable.star_off)); 
     holder.fav.setChecked(false); 

    } 


    holder.fav.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 

      if (isChecked){ 
       holder.fav.setBackgroundDrawable(ContextCompat.getDrawable(c,R.drawable.star_light)); 
      SharedPreferences.Editor editor = c.getSharedPreferences("lol", MODE_PRIVATE).edit(); 
      editor.putBoolean("abc" + position, true); 
      editor.commit(); 
      } 
      else{ 
       holder.fav.setBackgroundDrawable(ContextCompat.getDrawable(c, R.drawable.star_off)); 
       SharedPreferences.Editor editor = c.getSharedPreferences("lol", MODE_PRIVATE).edit(); 
       editor.putBoolean("abc" + position, false); 
       editor.commit(); 

      } 
     } 
    }); 
0

你的实现是错误的。

您应该只使用onCreateViewHolder()来扩大布局。

绑定操作应该在onBindViewHolder()。在onBindViewHolder()使用切换操作

+0

我试图在onBindeView里添加相同的代码,但是结果相同 – Eazyz

0

我做了一个快速编辑。请详细检查。我在SharedPreferences中使用了position。所以每个toggle button值都保存在不同的密钥中。这可能工作。

SharedPreferences.Editor editor = c.getSharedPreferences("lol", MODE_PRIVATE).edit(); 

@Override 
public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.model,null); 

    MyHolder holder=new MyHolder(v); 

    return holder; 
} 


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


    holder.nameTxt.setText(players[position]); 
    holder.posTxt.setText(positions[position]); 
    holder.img.setImageResource(images[position]); 

    SharedPreferences sharedPrefs = c.getSharedPreferences("lol", MODE_PRIVATE); 
     Boolean a = sharedPrefs.getBoolean("abc"+position , false); 
     if (a){ 
      holder.fav.setBackgroundDrawable(ContextCompat.getDrawable(c, R.drawable.star_light)); 
      holder.fav.setChecked(true); 

     }else { 
      holder.fav.setBackgroundDrawable(ContextCompat.getDrawable(c, R.drawable.star_off)); 
      holder.fav.setChecked(false); 

     } 

    holder.fav.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 

      if (isChecked){ 
       holder.fav.setBackgroundDrawable(ContextCompat.getDrawable(c,R.drawable.star_light)); 

      editor.putBoolean("abc"+position, true); 
      editor.commit(); 
      } 
      else{ 
       holder.fav.setBackgroundDrawable(ContextCompat.getDrawable(c, R.drawable.star_off)); 

       editor.putBoolean("abc"+position, false); 
       editor.commit(); 

      } 
     } 
    }); 
+0

这段代码给了我NullPointerException – Eazyz

+1

我想你有解决方案! –