0

お気に入りのアクティビティで新しい更新リストを取得したいのですが、お気に入りのリストにアイテムを追加しません。リストはsharedpreferenceから値を取得しますが、ビュー。Recyclerviewアダプタを新しいリストで更新できません。新しいリストが空白に表示されます。

DiseaseAdapter

import android.content.Context; 
    import android.content.Intent; 
    import android.database.Cursor; 
    import android.os.Build; 
    import android.support.annotation.RequiresApi; 
    import android.support.v7.widget.RecyclerView; 
    import android.view.LayoutInflater; 
    import android.view.View; 
    import android.view.ViewGroup; 
    import android.widget.ImageView; 
    import android.widget.TextView; 
    import android.widget.Toast; 

    import java.util.ArrayList; 
    import java.util.List; 

    /** 
    * Created by admin on 12/4/2017. 
    */ 

    public class DiseaseAdapter extends RecyclerView.Adapter<DiseaseAdapter.DiseaseAdapterViewHolder> { 
     List <String> data; 
     Context ctx; 



     SharedPreference sharedPreference; 

     DiseaseAdapter(List <String> data, Context ctx){ 
      this.data=data; 
      notifyDataSetChanged(); 
      this.ctx=ctx; 
      sharedPreference = new SharedPreference(); 


     } 



     @Override 
     public DiseaseAdapterViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
      LayoutInflater inflater=LayoutInflater.from(parent.getContext()); 
      View view= inflater.inflate(R.layout.activity_listview,parent,false); 

      return new DiseaseAdapterViewHolder(view); 
     } 

     @Override 
     public void onBindViewHolder(DiseaseAdapterViewHolder holder, int position) { 
      final String title=data.get(position); 
      holder.textView1.setText(title); 

      if (checkFavoriteItem(title)) { 

       holder.imageButton.setImageResource(R.drawable.star_colour); 
       holder.imageButton.setTag("red"); 
      } else { 

       holder.imageButton.setImageResource(R.drawable.ic_action_name); 
       holder.imageButton.setTag("grey"); 
      } 

     } 


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


     class DiseaseAdapterViewHolder extends RecyclerView.ViewHolder { 

      TextView textView1; 
      ImageView imageButton; 

      public DiseaseAdapterViewHolder(View itemView) { 
       super(itemView); 

       textView1=(TextView) itemView.findViewById(R.id.textView); 
       imageButton=(ImageView)itemView.findViewById(R.id.imgbtn_favorite); 


      } 
     } 

     /*Checks whether a particular product exists in SharedPreferences*/ 
     public boolean checkFavoriteItem(String checkProduct) { 
      boolean check = false; 
      List<String> favorites = sharedPreference.getFavorites(ctx); 
      if (favorites != null) { 
       for (String product : favorites) { 
        if (product.equals(checkProduct)) { 
         check = true; 
         break; 
        } 
       } 
      } 
      return check; 
     } 







    } 

MainActivity

import android.content.Context; 
import android.content.Intent; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ImageView; 
import android.widget.Toast; 

import java.util.Arrays; 
import java.util.List; 

public class MainActivity extends AppCompatActivity{ 
    RecyclerView simpleListView; 
    static Context ctx; 
    String diseaseList[]; 

    SharedPreference sharedPreference; 

    DiseaseAdapter da; 
    List<String> newDiseaseList; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     ctx=this; 

     sharedPreference = new SharedPreference(); 

     diseaseList= new String[]{"Abscess", 
       "Allergies", 
       "Amnesia", 
       "Anemia", 
       "Andropause", 
       "Angina", 
       "Weight Loss"}; 


     Arrays.sort(diseaseList); 





     newDiseaseList = Arrays.asList(diseaseList); 

     simpleListView= (RecyclerView)findViewById(R.id.simpleListView); 
     LinearLayoutManager lm=new LinearLayoutManager(MainActivity.this); 
     simpleListView.setLayoutManager(lm); 
     /* DividerItemDecoration di=new DividerItemDecoration(MainActivity.this,lm.getOrientation()); 
     simpleListView.addItemDecoration(di);*/ 

     da=new DiseaseAdapter(newDiseaseList,ctx); 
     simpleListView.setAdapter(da); 
     simpleListView.setHasFixedSize(true); 


     simpleListView.addOnItemTouchListener(
       new RecyclerItemClickListener(ctx, simpleListView ,new RecyclerItemClickListener.OnItemClickListener() { 
        @Override public void onItemClick(View view, int position) { 

         ImageView button = (ImageView) view.findViewById(R.id.imgbtn_favorite); 

         String tag = button.getTag().toString(); 
         if (tag.equalsIgnoreCase("grey")) { 
          sharedPreference.addFavorite(ctx, newDiseaseList.get(position)); 
          Toast.makeText(ctx, 
            "add to favourites", 
            Toast.LENGTH_SHORT).show(); 

          button.setTag("red"); 
          button.setImageResource(R.drawable.star_colour); 
         } else { 
          sharedPreference.removeFavorite(ctx, newDiseaseList.get(position)); 
          button.setTag("grey"); 
          button.setImageResource(R.drawable.ic_action_name); 
          Toast.makeText(ctx, 
            "removed from favourites", 
            Toast.LENGTH_SHORT).show(); 
         } 


        } 

        @Override public void onLongItemClick(View view, int position) { 

        } 
       }) 
     ); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.menu_favorites: 
       Intent i=new Intent(this,Favourite.class); 
      this.startActivity(i); 

       return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

} 

SharedPreference.java

import android.content.Context; 
import android.content.SharedPreferences; 
import android.content.SharedPreferences.Editor; 

import com.google.gson.Gson; 

import java.lang.reflect.Type; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 


public class SharedPreference { 

    public static final String PREFS_NAME = "PRODUCT_APP"; 
    public static final String FAVORITES = "Product_Favorite"; 

    public SharedPreference() { 
     super(); 
    } 

    // This four methods are used for maintaining favorites. 
    public void saveFavorites(Context context, List<String> favorites) { 
     SharedPreferences settings; 
     Editor editor; 

     settings = context.getSharedPreferences(PREFS_NAME, 
       Context.MODE_PRIVATE); 
     editor = settings.edit(); 

     Gson gson = new Gson(); 
     String jsonFavorites = gson.toJson(favorites); 

     editor.putString(FAVORITES, jsonFavorites); 

     editor.commit(); 
    } 

    public void addFavorite(Context context, String product) { 
     List<String> favorites = getFavorites(context); 
     if (favorites == null) 
      favorites = new ArrayList<String>(); 
     favorites.add(product); 
     saveFavorites(context, favorites); 
    } 

    public void removeFavorite(Context context, String product) { 
     List<String> favorites = getFavorites(context); 
     if (favorites != null) { 
      favorites.remove(product); 
      saveFavorites(context, favorites); 
     } 
    } 

    public ArrayList<String> getFavorites(Context context) { 
     SharedPreferences settings; 
     List<String> favorites ; 

     settings = context.getSharedPreferences(PREFS_NAME, 
       Context.MODE_PRIVATE); 

     if (settings.contains(FAVORITES)) { 
      String jsonFavorites = settings.getString(FAVORITES, null); 
      Gson gson = new Gson(); 
      String [] favoriteItems = (gson.fromJson(jsonFavorites,String [].class)); 

      favorites = Arrays.asList(favoriteItems); 
      favorites = new ArrayList<String>(favorites); 
     } else 
      return null; 

     return (ArrayList<String>) favorites; 
    } 
} 

Favourite.java

import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.support.v7.widget.RecyclerView; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ImageView; 
import android.widget.ListView; 
import android.widget.Toast; 

import java.util.List; 

public class Favourite extends AppCompatActivity { 
    RecyclerView favoriteList; 
    SharedPreference sharedPreference; 
    List<String> favorites; 
    DiseaseAdapter diseaseAdapter; 

    Context ctx; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_favourite); 
     ctx=this; 
     sharedPreference = new SharedPreference(); 
     favorites = sharedPreference.getFavorites(ctx); 
     favoriteList = (RecyclerView)findViewById(R.id.favListView); 


     if (favorites == null) { 
      showAlert(getResources().getString(R.string.no_favorites_items), 
        getResources().getString(R.string.no_favorites_msg)); 
     } else { 

      if (favorites.size() == 0) { 
       showAlert(
         getResources().getString(R.string.no_favorites_items), 
         getResources().getString(R.string.no_favorites_msg)); 
      } 


      if (favorites != null) { 

       diseaseAdapter = new DiseaseAdapter(favorites,ctx); 

       diseaseAdapter.notifyDataSetChanged(); 
       favoriteList.setAdapter(diseaseAdapter); 
       favoriteList.invalidate(); 

       favoriteList.addOnItemTouchListener(
         new RecyclerItemClickListener(ctx, favoriteList ,new RecyclerItemClickListener.OnItemClickListener() { 
          @Override public void onItemClick(View view, int position) { 

           ImageView button = (ImageView) view 
             .findViewById(R.id.imgbtn_favorite); 

           String tag = button.getTag().toString(); 
           if (tag.equalsIgnoreCase("grey")) { 
            sharedPreference.addFavorite(ctx, 
              favorites.get(position)); 
            Toast.makeText(
              ctx, 
              ctx.getResources().getString(
                R.string.add_favr), 
              Toast.LENGTH_SHORT).show(); 

            button.setTag("red"); 
            button.setImageResource(R.drawable.star_colour); 
           } else { 
            sharedPreference.removeFavorite(ctx, 
              favorites.get(position)); 
            button.setTag("grey"); 
            button.setImageResource(R.drawable.ic_action_name); 
           /* diseaseAdapter.remove(favorites 
              .get(position));*/ 
            diseaseAdapter.notifyItemRemoved(position); 
            Toast.makeText(
              ctx, 
              ctx.getResources().getString(
                R.string.remove_favr), 
              Toast.LENGTH_SHORT).show(); 
           } 



          } 

          @Override public void onLongItemClick(View view, int position) { 

          } 
         }) 
       ); 



      } 
     } 

    } 

    public void showAlert(String title, String message) { 
     if (ctx != null) { 
      AlertDialog alertDialog = new AlertDialog.Builder(ctx) 
        .create(); 
      alertDialog.setTitle(title); 
      alertDialog.setMessage(message); 
      alertDialog.setCancelable(false); 

      // setting OK Button 
      alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "OK", 
        new DialogInterface.OnClickListener() { 

         public void onClick(DialogInterface dialog, int which) { 
          dialog.dismiss(); 
          // activity.finish(); 
          getFragmentManager().popBackStackImmediate(); 
         } 
        }); 
      alertDialog.show(); 
     } 
    } 

} 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 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_width="match_parent" 
android:layout_height="match_parent" 
tools:context="com.example.admin.fav.MainActivity"> 


<android.support.v7.widget.RecyclerView 
    xmlns:android="http://schemas.android.com/apk/res/android" 

    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/simpleListView" 
    > 
</android.support.v7.widget.RecyclerView> 





</RelativeLayout> 

activity_listview.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal"> 



    <TextView 
     android:id="@+id/textView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:textSize="20dp" 
     android:paddingTop="10dp" 
     android:paddingBottom="10dp" 
     android:paddingLeft="10dp" 
     android:textColor="#434b3e" 
     android:text=""/> 

    <ImageView 
     android:id="@+id/imgbtn_favorite" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_marginRight="3dp" 
     android:background="@null" 
     /> 

</RelativeLayout> 

activity_favourite.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 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_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.example.admin.fav.Favourite"> 

    <android.support.v7.widget.RecyclerView 
     xmlns:android="http://schemas.android.com/apk/res/android" 

     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/favListView" 
     > 
    </android.support.v7.widget.RecyclerView> 


</RelativeLayout> 
+0

アダプタのコンストラクタで 'notifyDataSetChanged()'を呼び出すべきではないと思います。 – salman

+0

thanxお気に入りのアクティビティでsetLayoutManager()が欠落していた –

答えて

0

setLayoutManager()Favourite.javaにあります。

+1

おかげで.....これは今のところ –

+0

ありがとう。それを聞いてうれしい。 –

0

NotifyItemRemoved()またはNotifyItemAdded()の代わりにNotifyDataSetChanged()を呼び出してみてください。 これらのメソッドは私のためにのいずれかを実行しませんでした。追加したり削除したりするアイテムのアニメーションは取得できませんが、独自のアニメーションを追加してトリックを行うことができます。

は、部屋データベースを使用して、リストを保存し、はるかに簡単で多くのことができるようにリストを処理する必要があります。 SharedPreferencesは、リスト全体ではなく、整数やブール値などの値を格納する場合に推奨されます。

関連する問題