2017-02-20 10 views
0

Я пытаюсь изменить значок кнопки в представлении recycler каждый раз, когда действие начинается с булевского значения в моем пользовательском объекте. Я предполагаю, что это должно быть сделано в адаптере, так как не каждая кнопка группы будет иметь тот же фон.Изменение значка кнопки в просмотре Recycler в классе адаптера На основе логического значения

Ниже приведен код для моего ресайклера адаптера вида:

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

    private List<Recipe> mRecipeSet; 
    private Button mAddToGroceriesButton; 


    public RecipeListAdapter(List<Recipe> recipes){ 
     mRecipeSet = recipes; 
    } 

    // Provide a reference to the views for each data item 
    // Complex data items may need more than one view per item, and 
    // you provide access to all the views for a data item in a view holder 
    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
     //This is what will handle what happens when you click a recipe in the recycler view 


     private TextView mRecipeName; 
     private TextView mPrepTime; 
     private TextView mCookTime; 
     private TextView mServingSize; 
     private RelativeLayout mRecipeTextSection; 


     public ViewHolder(View v) { 
      super(v); 
      mRecipeName = (TextView) v.findViewById(R.id.recipe_list_recycler_view_recipe_name); 
      mServingSize = (TextView) v.findViewById(R.id.recipe_list_recycler_view_serving_size); 
      mPrepTime = (TextView) v.findViewById(R.id.recipe_list_recycler_view_prep_time); 
      mCookTime = (TextView) v.findViewById(R.id.recipe_list_recycler_view_cook_time); 
      mRecipeTextSection = (RelativeLayout) v.findViewById(R.id.recycled_item_section_view); 

      mRecipeTextSection.setOnClickListener(this); 

      mAddToGroceriesButton = (Button) v.findViewById(R.id.add_to_grocery_list); 
      mAddToGroceriesButton.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        int position = getAdapterPosition(); 
        Recipe recipeToGrocery = mRecipeSet.get(position); 

        //RecipeDB dbHelper = new RecipeDB(v.getContext()); 
        //dbHelper.addGroceryItem(recipeToGrocery); 

        if(!recipeToGrocery.isInList()) { 
         RecipeDB dbHelper = new RecipeDB(v.getContext()); 
         dbHelper.addGroceryItem(recipeToGrocery); 

         recipeToGrocery.setInList(true); 
         dbHelper.updateRecipe(recipeToGrocery); 
         mAddToGroceriesButton.setBackgroundResource(R.mipmap.ic_playlist_add_check_black_24dp); 
         Toast.makeText(v.getContext(), recipeToGrocery.getRecipeName() + " added to grocery list.", Toast.LENGTH_SHORT).show(); 
        } 
        else { 
         Toast.makeText(v.getContext(), "That recipe is already in the list.", Toast.LENGTH_SHORT).show(); 
        } 

       } 
      }); 

     } 

     @Override 
     public void onClick(View v){ 
      int position = getAdapterPosition(); 
      Intent i = new Intent(v.getContext(), RecipeTextView.class); 
      Recipe selectedRecipe = mRecipeSet.get(position); 
      i.putExtra("view_recipe_key", selectedRecipe); 
      v.getContext().startActivity(i); 
     } 

    } 


    public void add(int position, Recipe item) { 
     mRecipeSet.add(position, item); 
     notifyItemInserted(position); 
    } 

    public void remove(Recipe item) { 
     int position = mRecipeSet.indexOf(item); 
     mRecipeSet.remove(position); 
     notifyItemRemoved(position); 
    } 



    public RecipeListAdapter(ArrayList<Recipe> myRecipeset) { 
     mRecipeSet = myRecipeset; 
    } 

    // Create new views (invoked by the layout manager) 
    @Override 
    public RecipeListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     // create a new view 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.recipe_item_recycled, parent, false); 
     ViewHolder vh = new ViewHolder(v); 
     return vh; 

    } 


    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     Recipe recipe = mRecipeSet.get(position); 
     String recipeName = recipe.getRecipeName(); 
     String prepTime = "Prep Time: " + String.valueOf(recipe.getPrepTime()) + " minutes"; 
     String cookTime = "Cook Time: " + String.valueOf(recipe.getCookTime()) + " minutes"; 
     String servingSize = "Servings: " + String.valueOf(recipe.getServings()); 

     holder.mRecipeName.setText(recipeName); 

     //Only display values if they are not null 
     if(recipe.getServings() != null) { 
      holder.mServingSize.setText(servingSize); 
     } 
     if (recipe.getPrepTime() != null) { 
      holder.mPrepTime.setText(prepTime); 
     } 
     if(recipe.getCookTime() != null) { 
      holder.mCookTime.setText(cookTime); 
     } 


    } 

    // Return the size of your dataset (invoked by the layout manager) 
    @Override 
    public int getItemCount() { 
     if(mRecipeSet != null) { 
      return mRecipeSet.size(); 
     } 
     return 0; 
    } 



} 

Я знаю, как изменить цвет фона кнопки, когда она нажата с

mAddToGroceriesButton.setBackgroundResource(R.mipmap.ic_playlist_add_check_black_24dp); 

, но это, очевидно, не собирается спасать состояние этой кнопки при перезапуске активности. Я просто не уверен, как проверить логическое значение для каждой группы при запуске активности и соответственно изменить фон кнопки.

Я попытался с помощью

if(recipe.isInList()){ 
      mAddToGroceriesButton.setBackgroundResource(R.mipmap.ic_playlist_add_check_black_24dp); 
     } 

в методе onBindViewHolder, но это ничего не делать, и я уверен, что не было бы правильным местом для этого в любом случае. Я знаю, что boolean работает правильно, потому что я использую его в других местах, и он работает нормально.

Вот соответствующий код XML:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/apk/res/android" 
    android:layout_margin="7dp" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:paddingLeft="10dp" 
    android:id="@+id/recycled_item_section_view" 
    android:elevation="30dp" 
    android:background="@drawable/background_border" 
    > 


    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     tools:text="Recipe name" 
     android:textSize="24dp" 
     android:textColor="@color/black" 
     android:id="@+id/recipe_list_recycler_view_recipe_name" 
     android:paddingBottom="3dp" 
     android:maxWidth="275dip" 
     android:singleLine="false"/> 

    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:textSize="18dp" 
     android:textColor="@color/black" 
     android:layout_below="@id/recipe_list_recycler_view_recipe_name" 
     android:id="@+id/recipe_list_recycler_view_serving_size" 
     android:paddingBottom="3dp"/> 

    <Button 
     android:layout_width="35dp" 
     android:layout_height="35dp" 
     android:background="@mipmap/ic_playlist_add_black_24dp" 
     android:height="36dp" 
     android:padding="8dp" 
     android:layout_alignParentRight="true" 
     android:id="@+id/add_to_grocery_list" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentEnd="true" 
     /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/recipe_list_recycler_view_serving_size" 
     android:layout_alignParentLeft="true" 
     android:textSize="18dp" 
     android:textColor="@color/black" 
     android:id="@+id/recipe_list_recycler_view_prep_time" 
     android:paddingBottom="3dp" 
     /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/recipe_list_recycler_view_prep_time" 
     android:textSize="18dp" 
     android:textColor="@color/black" 
     android:layout_alignParentLeft="true" 
     android:id="@+id/recipe_list_recycler_view_cook_time"/> 


</RelativeLayout> 

Рецепт Класс:

public class Recipe implements Parcelable { 

    //These are all of the qualities a recipe contains, we will create an arraylist of this in the activity 
    private String mRecipeName; 
    private int mID; 
    private String mServings; 
    private String mPrepTime; 
    private String mCookTime; 
    private boolean isInList; 

    private List<String> mIngredients; 
    private List<String> mDirections; 


    public Recipe(){ 

    } 

    public Recipe(int id, String name, String serving, String prep, String cook, List<String> 
        ingredientsList, List<String> directionsList, boolean inList){ 

     this.mID = id; 
     this.mRecipeName = name; 
     this.mServings = serving; 
     this.mPrepTime = prep; 
     this.mCookTime = cook; 
     this.mIngredients = ingredientsList; 
     this.mDirections = directionsList; 
     this.isInList = inList; 
    } 

    public Recipe(String name, String serving, String prep, String cook, List<String> 
      ingredientsList, List<String> directionsList, boolean inList){ 

     this.mRecipeName = name; 
     this.mServings = serving; 
     this.mPrepTime = prep; 
     this.mCookTime = cook; 
     this.mIngredients = ingredientsList; 
     this.mDirections = directionsList; 
     this.isInList = inList; 
    } 


    public String getRecipeName() { 
     return mRecipeName; 
    } 

    public int getID() { 
     return mID; 
    } 

    public void setID(int id){ 
     mID = id; 
    } 

    public String getServings() { 
     return mServings; 
    } 

    public String getPrepTime() { 
     return mPrepTime; 
    } 


    public void setRecipeName(String recipeName) { 
     mRecipeName = recipeName; 
    } 

    public void setServingSize(String servings) { 
     mServings = servings; 
    } 

    public void setPrepTime(String prepTime) { 
     mPrepTime = prepTime; 
    } 

    public void setServings(String servings) { 
     mServings = servings; 
    } 

    public List<String> getIngredients() { 
     return mIngredients; 
    } 

    public List<String> getDirections() { 
     return mDirections; 
    } 

    public String getCookTime() { 
     return mCookTime; 
    } 

    public void setCookTime(String cookTime) { 
     mCookTime = cookTime; 
    } 

    public void setIngredients(List<String> ingredients) { 
     mIngredients = ingredients; 
    } 

    public void setDirections(List<String> directions) { 
     mDirections = directions; 
    } 

    public boolean isInList() { 
     return isInList; 
    } 

    public void setInList(boolean inList) { 
     isInList = inList; 
    } 

    @Override 
    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeString(this.mRecipeName); 
     dest.writeInt(this.mID); 
     dest.writeString(this.mServings); 
     dest.writeString(this.mPrepTime); 
     dest.writeString(this.mCookTime); 
     dest.writeByte(this.isInList ? (byte) 1 : (byte) 0); 
     dest.writeStringList(this.mIngredients); 
     dest.writeStringList(this.mDirections); 
    } 

    protected Recipe(Parcel in) { 
     this.mRecipeName = in.readString(); 
     this.mID = in.readInt(); 
     this.mServings = in.readString(); 
     this.mPrepTime = in.readString(); 
     this.mCookTime = in.readString(); 
     this.isInList = in.readByte() != 0; 
     this.mIngredients = in.createStringArrayList(); 
     this.mDirections = in.createStringArrayList(); 
    } 

    public static final Creator<Recipe> CREATOR = new Creator<Recipe>() { 
     @Override 
     public Recipe createFromParcel(Parcel source) { 
      return new Recipe(source); 
     } 

     @Override 
     public Recipe[] newArray(int size) { 
      return new Recipe[size]; 
     } 
    }; 
} 

И основной класс активности, который использует адаптер:

public class RecipeList extends AppCompatActivity{ 
    private RecyclerView mRecyclerView; 
    private RecyclerView.Adapter mAdapter; 
    private RecyclerView.LayoutManager mLayoutManager; 
    private int REQUEST_CODE=1; 
    private Button mNavigateGroceryButton; 
    RecipeDB dbHelper = new RecipeDB(this); 
    List<Recipe> recipes; 


    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     recipes = dbHelper.getAllRecipes(); 

     setContentView(R.layout.activity_recipe_list); 
     mRecyclerView = (RecyclerView) findViewById(R.id.list_recycler_view); 


     mLayoutManager = new LinearLayoutManager(this); 
     mRecyclerView.setLayoutManager(mLayoutManager); 

     mAdapter = new RecipeListAdapter(recipes); 
     mRecyclerView.setAdapter(mAdapter); 


     mNavigateGroceryButton = (Button) findViewById(R.id.navigate_to_groceries_button_list_view); 
     mNavigateGroceryButton.setOnClickListener(new View.OnClickListener(){ 
      @Override 
      public void onClick(View v){ 
       Intent i = new Intent(RecipeList.this, ExpandableListViewActivity.class); 
       //Log.d("Navigate", "navigate pressed"); 
       startActivity(i); 
      } 
     }); 
    } 

    @Override 
    public void onBackPressed() { 
    } 

    public boolean onOptionsItemSelected(MenuItem item){ 
     //Handles menu buttons 
     switch (item.getItemId()){ 
      case R.id.recipe_list_add_recipe_actionbar_button: 
       //This button creates a new empty Recipe object and passes it to the EditRecipe class 
       //The Recipe object is passed as a parcelable 
       Recipe passedRecipe = new Recipe(); 
       Intent i = new Intent(RecipeList.this, EditRecipe.class); 
       i.putExtra("passed_recipe_key", (Parcelable) passedRecipe); 
       startActivityForResult(i, REQUEST_CODE); 
       return true; 
      default: 
       Log.d("Name,", "default called"); 
       return super.onOptionsItemSelected(item); 

     } 
    } 

    public void addNewReRecipe(Recipe recipe){ 
     dbHelper.addRecipe(recipe); 
     recipes = dbHelper.getAllRecipes(); 
     mAdapter = new RecipeListAdapter(recipes); 
     mRecyclerView.setAdapter(mAdapter); 
    } 

    //Makes the menu bar appear as it is in the action_bar_recipe_list_buttons menu layout file 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu){ 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.action_bar_recipe_list_buttons, menu); 
     return true; 
    } 


    //This code is called after creating a new recipe. This is only for creating, and not editing. 
    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data){ 
     super.onActivityResult(requestCode, resultCode, data); 
     if (requestCode == REQUEST_CODE){ 
      if(resultCode == Activity.RESULT_OK) { 
       Recipe createdRecipe = data.getExtras().getParcelable("recipe_key"); 
       addNewReRecipe(createdRecipe); 
      } 
     } 
    } 


}  
+0

добавить свой класс рецептов – user2025187

+0

Добавил его, а также мой основной класс деятельности. – knokout1

+0

Итак, что вы хотите сделать, это сохранить выбор и отобразить его при перезапуске активности или приложению, которое было запущено и снова запущено. @ knockout1 – HourGlass

ответ

1

Похоже, что вам нужно, чтобы объявить в верхней части вашего ViewHolder с другими видами. Так переместить объявление из верхней части адаптера:

private Button mAddToGroceriesButton;

Тогда в вашем методе onBindViewHolder вы можете получить ссылку на кнопку через держатель и установить фон:

if(recipe.isInList()) { 
    holder.mAddToGroceriesButton.setBackgroundResource(R.mipmap.ic_playlist_add_check_black_24dp); 
} 
1

Попробуйте это ,

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

     private List<Recipe> mRecipeSet; 
     private Button mAddToGroceriesButton; 


     public RecipeListAdapter(List<Recipe> recipes){ 
      mRecipeSet = recipes; 
     } 

     // Provide a reference to the views for each data item 
     // Complex data items may need more than one view per item, and 
     // you provide access to all the views for a data item in a view holder 
     public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
      //This is what will handle what happens when you click a recipe in the recycler view 


      private TextView mRecipeName; 
      private TextView mPrepTime; 
      private TextView mCookTime; 
      private TextView mServingSize; 
      private RelativeLayout mRecipeTextSection; 


      public ViewHolder(View v) { 
       super(v); 
       mRecipeName = (TextView) v.findViewById(R.id.recipe_list_recycler_view_recipe_name); 
       mServingSize = (TextView) v.findViewById(R.id.recipe_list_recycler_view_serving_size); 
       mPrepTime = (TextView) v.findViewById(R.id.recipe_list_recycler_view_prep_time); 
       mCookTime = (TextView) v.findViewById(R.id.recipe_list_recycler_view_cook_time); 
       mRecipeTextSection = (RelativeLayout) v.findViewById(R.id.recycled_item_section_view); 
       mAddToGroceriesButton = (Button) v.findViewById(R.id.add_to_grocery_list); 

      } 


     } 


     public void add(int position, Recipe item) { 
      mRecipeSet.add(position, item); 
      notifyItemInserted(position); 
     } 

     public void remove(Recipe item) { 
      int position = mRecipeSet.indexOf(item); 
      mRecipeSet.remove(position); 
      notifyItemRemoved(position); 
     } 



     public RecipeListAdapter(ArrayList<Recipe> myRecipeset) { 
      mRecipeSet = myRecipeset; 
     } 

     // Create new views (invoked by the layout manager) 
     @Override 
     public RecipeListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
      // create a new view 
      View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.recipe_item_recycled, parent, false); 
      ViewHolder vh = new ViewHolder(v); 
      return vh; 

     } 


     @Override 
     public void onBindViewHolder(ViewHolder holder, int position) { 
      Recipe recipe = mRecipeSet.get(position); 
      String recipeName = recipe.getRecipeName(); 
      String prepTime = "Prep Time: " + String.valueOf(recipe.getPrepTime()) + " minutes"; 
      String cookTime = "Cook Time: " + String.valueOf(recipe.getCookTime()) + " minutes"; 
      String servingSize = "Servings: " + String.valueOf(recipe.getServings()); 

      holder.mRecipeName.setText(recipeName); 

      //Only display values if they are not null 
      if(recipe.getServings() != null) { 
       holder.mServingSize.setText(servingSize); 
      } 
      if (recipe.getPrepTime() != null) { 
       holder.mPrepTime.setText(prepTime); 
      } 
      if(recipe.getCookTime() != null) { 
       holder.mCookTime.setText(cookTime); 
      } 

      mRecipeTextSection.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       int position = getAdapterPosition(); 
       Intent i = new Intent(v.getContext(), RecipeTextView.class); 
       Recipe selectedRecipe = mRecipeSet.get(position); 
       i.putExtra("view_recipe_key", selectedRecipe); 
       v.getContext().startActivity(i); 
      }); 

      Recipe recipeToGrocery = mRecipeSet.get(position); 
      if(!recipeToGrocery.isInList()) { 
         mAddToGroceriesButton.setBackgroundResource(R.mipmap.ic_playlist_add_check_black_24dp); 
        } 
        else{ 
         mAddToGroceriesButton.setBackgroundResource(R.mipmap.ic_playlist_add_check_black_26dp);//set another image 
        } 

      mAddToGroceriesButton.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        int position = getAdapterPosition(); 
        Recipe recipeToGrocery = mRecipeSet.get(position); 

        //RecipeDB dbHelper = new RecipeDB(v.getContext()); 
        //dbHelper.addGroceryItem(recipeToGrocery); 

        if(!recipeToGrocery.isInList()) { 
         RecipeDB dbHelper = new RecipeDB(v.getContext()); 
         dbHelper.addGroceryItem(recipeToGrocery); 

         recipeToGrocery.setInList(true); 
         dbHelper.updateRecipe(recipeToGrocery); 

         notifyDataSetChanged(); 
        } 
        else { 
         Toast.makeText(v.getContext(), "That recipe is already in the list.", Toast.LENGTH_SHORT).show(); 
        } 

       } 
      }); 


     } 

     // Return the size of your dataset (invoked by the layout manager) 
     @Override 
     public int getItemCount() { 
      if(mRecipeSet != null) { 
       return mRecipeSet.size(); 
      } 
      return 0; 
     } 



    }