如何在Recyclerview上实现SharedPreference,以便保存收藏夹列表以便于使用 [英] How to Implement SharedPreference on Recyclerview so as to save lists of favorites for easy use

查看:99
本文介绍了如何在Recyclerview上实现SharedPreference,以便保存收藏夹列表以便于使用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

A建立了一个歌曲列表,当单击该列表中的某个项目时,您将进入NewActivity1,其中将显示歌曲的完整歌词.我将数据存储在String.xml中.因此,将此数据从字符串通过适配器传递,并在NewActivity1中显示.我为此目的使用了Recyclerview.我发现很难在sharedpreference中实现这一点.我希望用户能够将歌曲添加到NewActivity1的sharedpreference中.因为那是用户阅读歌曲完整歌词的地方.

A built a lists of songs and when an item is clicked in this list takes you to NewActivity1 where full lyrics of songs is shown. I stored data in the String.xml. So, pass this data from string through adapter and show it in the NewActivity1. I used Recyclerview for this purpose. I am finding very difficult to implement this in sharedpreference. I want the user to be able to add a song to sharedpreference from NewActivity1. Because that is where the user have read the full lyrics of song.

请帮助我.我实际上不知道如何开始.如果要将fav_icon放置在row.xml中,我可以设法对其进行配置.

Please I need your help. I actually don't know how to start. If it were for the fav_icon to be placed in the row.xml I may manage to configure it.

这是activity_tips1.xml

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/star_wars"
    tools:context=".Tips_1">



    <androidx.recyclerview.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        style="@style/scrollbar_shape_style"
        android:layout_marginBottom="60dp"

        android:id="@+id/recyclerview1">


    </androidx.recyclerview.widget.RecyclerView>
    

</RelativeLayout>

这是Recyclerview activity_favorite

This is Recyclerview activity_favorite

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/star_wars"
    tools:context=".Tips_1">



    <androidx.recyclerview.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        style="@style/scrollbar_shape_style"
        android:layout_marginBottom="60dp"
        android:id="@+id/favorite_recyclerview">


    </androidx.recyclerview.widget.RecyclerView>

</RelativeLayout>

这是NewActiviy.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"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:layout_marginTop="5dp"
    tools:context=".NewActivity1">

    <RelativeLayout
        android:id="@+id/layout_default"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <TextView
                android:id="@+id/txt1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="30dp"
                android:layout_marginLeft="30dp"
                android:textSize="10sp"
                android:text="Play song here\n\t\t\there\t\t➝"
                android:textColor="#8c0b0b" />
        </LinearLayout>

        <ImageView
            android:id="@+id/img1"
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:onClick="play"
            android:layout_marginLeft="190dp"
            android:src="@drawable/ic_play_circle_outline_black_24dp"
            />

        <ImageView
            android:id="@+id/img2"
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:onClick="pause"
            android:layout_toRightOf="@id/img1"
            android:layout_marginHorizontal="30dp"
            android:src="@drawable/ic_pause_circle_outline_black_24dp" />

        <SeekBar
            android:id="@+id/seekBar1"
            android:layout_marginTop="40dp"
            android:layout_width="200dp"
            android:background="#565858"
            android:layout_height="wrap_content"
            android:layout_marginLeft="145dp"
            android:indeterminate="false" />

    </RelativeLayout>


    <View
        android:id="@+id/viewera"
        android:layout_marginTop="6dp"
        android:layout_below="@id/layout_default"
        android:layout_width="match_parent"
        android:layout_height="8dp"
        android:background="#01645A" />


    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_below="@+id/viewera"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="60dp"
        style="@style/scrollbar_shape_style">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:layout_margin="18dp">


            <TextView
                android:id="@+id/textView"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:fontFamily="sans-serif-condensed"
                android:text="Full lyrics details"
                android:textColor="#000"
                android:textIsSelectable="true"
                android:textSize="21sp" />
        </LinearLayout>
    </ScrollView>

    <ImageButton
        android:layout_width="70dp"
        android:layout_height="70dp"
        android:text="How are you"
        android:textColor="#000"
        android:textSize="18sp"
        android:layout_marginBottom="60dp"
        android:layout_alignParentEnd="true"
        android:src="@drawable/ic_heart_o"
        android:layout_alignParentBottom="true"
       />



</RelativeLayout>

这是我存储在 String.xml 中的数据

<string-array name="array_titles">

        <item>"<![CDATA[001 | Ubangiji Allah, Ga Mu Nan Gabanka ]]>"</item>
        <item>"<![CDATA[002 | Ubanginmu, Mai Ceto ]]>"</item>
        <item>"<![CDATA[003 | Abu Duk A Duniya Ubanmu Ne Ya Yi ]]>"</item>
        etc....
    </string-array>


    <string-array name="array_lyrics">

        <item>"<![CDATA[Littafin Wakoki]]>"</item>, <item>"<![CDATA[Littafin Wakoki]]>"</item>, <item>"<![CDATA[Littafin Wakoki]]>"</item>,
       etc....
        
    </string-array>


    <string-array name="newbrandDesc">


        <item>"<![CDATA[ <p>1) Ubangiji Allah, ga mu nan gabanka.<br />Tun da farin hasken safe, mu ke nemanka.<br />Muna yabon sunanka, ya Mai Iko Duka,<br />Muna sujada, ya Mai Tsarki.</p>
<p>2) Ubangiji Uba, kai ne farkon kome,<br />Kai ka ba da Ɗanka Yesu domin cetonmu.<br />Mu da muka tayar, kai ka ji tausayinmu.<br />Muna sujada, ya Mai Tsarki.</p>
<p>3) Ubangiji Yesu, kai ne Almasihu,<br />Kai ka fanshi bayin Shaiɗan daga bautarsa.<br />Kai ka ba da jininka domin mu mutane.<br />Muna sujada, ya Mai Tsarki.</p>
<p>4) Ubangiji Ruhu, sunanka Mai Tsarki,<br />Kai ne kana koya mana hanyar cetonmu.<br />Kai ne jagabanmu, kullum sai mu bi ka.<br />Muna sujada, ya Mai Tsarki.</p>
<p>5) Allah Ubangijinmu, ɗaya cikin uku,<br />Harshe ba ya iya faɗin girman sunanka.<br />Uba, Ɗa, da Ruhu, uku cikin ɗaya,<br />Muna sujada, ya Mai Tsarki.</p> ]]>"</item>
        <item>"<![CDATA[ <p>1) Ubanginmu, Mai Ceto,<br />Don zumunta ne muka zo.<br />A duniyan nan sai sakewa,<br />Wurinka fa sai hutawa.</p>
<p>2) Tun jiya, yau, har abada,<br />Madauwami ne sunanka!<br />Kai ne ka kafa duniyan nan,<br />Kai ne mai shirya gida can.</p>
<p>3) Almasihu, Cetonmu,<br />Ba mu da wani taimako,<br />Amma ƙaunarka cikakkiya,<br />Ita ce garkuwar ƴaƴanka.</p>
<p>4) Ƙaunarka ! har wa yau ta tsaya<br />Da, ka ɗanɗana mutuwa.<br />Can bisa kursiyin Allahnmu,<br />Yanzu ka rayu dominmu.</p>
<p>5) Yabo, daraja, godiya<br />Gare ka Yesu Ɗan Allah!<br />Ka cika mu da Ruhunka,<br />Ya koya mana nufinka.</p> ]]>"</item>
        <item>"<![CDATA[ <p>1) Abu duk a duniya Ubanmu ne ya yi,<br />Sai mu yi ta yabonsa, Allah Mahalicci.<br />Shi ya kan ba mu ruwa a loton shukawa,<br />Har amfanin gonaki ba za mu rasa ba.</p>
<p>2) Abu duk a duniya Ubanmu ne ya yi,<br />Sai mu yi ta yabonsa, Allah Mahalicci.<br />Ya ba mu hasken rana, mu kama aikinmu.<br />Duhun dare kyautarsa, mu riƙa hutawa.</p>
<p>3) Abu duk a duniya Ubanmu ne ya yi,<br />Sai mu yi ta yabonsa, Allah Mahalicci.<br />Duk masu rai na duniya, ya kan ciyad da su.<br />Kifaye da tsuntsaye, ya san bukatarsu.</p>
<p>4) Abu duk a duniya Ubanmu ne ya yi,<br />Sai mu yi ta yabonsa, Allah Mahalicci<br />Mu kuma Masu Binsa aikin hannunsa ne, Ubanmu mai ƙauna mahaliccinmu ne.</p> ]]>"</item>
        etc....
    </string-array>

这是 Tips_1.java

public class Tips_1 extends Main2Activity {
    private String TAG = "Tips_2 ----- ; ";


    // Store instance variables
    private int page;

    RecyclerView mRecyclerview;
    MyAdapter1 myAdapter;
    int[] MusicFile;
    List<String> title, newDesc, description;
    int[] icon;
    ArrayList<Model1> arrayList = new ArrayList<Model1>();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tips1);

        ActionBar actionBar = getSupportActionBar();
        actionBar.setTitle("Hausa Audio Hymnal");

        final MoPubAdsHandlerBannerNdInterstitial adsHandler = new MoPubAdsHandlerBannerNdInterstitial(this, AddCheck.MySourceActivity);
        adsHandler.handleBannerAds();
        adsHandler.handleInterstitialAds();

        Button button1 = (Button) findViewById(R.id.mainButton1);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(Tips_1.this, Tips_2.class);
                i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(i);
                Toast.makeText(Tips_1.this, "English Audio Hymns Selected!", Toast.LENGTH_SHORT).show();
            }
        });


        //Listview icons for song titles in position
        icon = new int[]{R.drawable.hymn, R.drawable.hymn, R.drawable.hymn};


        mRecyclerview = findViewById(R.id.recyclerview1);
        mRecyclerview.setLayoutManager(new LinearLayoutManager(this));


        title = Arrays.asList(getResources().getStringArray(R.array.array_titles));

        //listview descriptions for songs in position
        description = Arrays.asList(getResources().getStringArray(R.array.array_lyrics));

        //listview NewDescriptions (NewActivity1) for songs in position
        newDesc = Arrays.asList(getResources().getStringArray(R.array.newbrandDesc));

        //listview soundfile file for songs in position
        MusicFile = new int[]{R.raw.aud_1, R.raw.aud_2, R.raw.aud_3};


        for (int i = 0; i < title.size(); i++) {
            Model1 model = new Model1(title.get(i), description.get(i), newDesc.get(i), icon[i], MusicFile[i]);
            //bind all strings in an array
            arrayList.add(model);
        }

        //pass result to listview class
        myAdapter = new MyAdapter1(this, arrayList);

        //bind the adapter to the listview class
        mRecyclerview.setAdapter(myAdapter);


    }

}

这是MyAdapter1类

public class MyAdapter1 extends RecyclerView.Adapter<MyHolder1> implements Filterable {

    Context mContext;
    ArrayList<Model1> models, filterList;  // this array list create a list of array which parameter define in our class
    CustomFilter1 filter;


    public MyAdapter1(Context context, ArrayList<Model1> models) {
        this.mContext = context;
        this.models = models;
        this.filterList = models;
    }

    @NonNull
    @Override
    public MyHolder1 onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {

        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.row1, null); //this line inflate our row1


        return new MyHolder1(view); //this will return our view to holder class
    }

    @Override
    public void onBindViewHolder(@NonNull final MyHolder1 myHolder, int i) {

        myHolder.mTitle.setText(models.get(i).getTitle()); //here is position
        myHolder.mDesc.setText(models.get(i).getDesc());
        myHolder.mImageView.setImageResource(models.get(i).getIcon()); // here we used imge resource

        myHolder.setItemCLickListener(new ItemClickListener1() {
            @Override
            public void onItemClickListener(View v, int position) {

                String gTitle = models.get(position).getTitle();
                String gDesc = models.get(position).getDesc();
                BitmapDrawable bitmapDrawable = (BitmapDrawable)myHolder.mImageView.getDrawable();
                Bitmap bitmap = bitmapDrawable.getBitmap();

                ByteArrayOutputStream stream = new ByteArrayOutputStream();
                bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
                byte[] bytes = stream.toByteArray();

                //get our data with intent
                Intent intent = new Intent(mContext, NewActivity1.class);
                intent.putExtra("actionBarTitle", models.get(position).getTitle());
                intent.putExtra("brandNewDesc", models.get(position).getBrandNewDesc());
                intent.putExtra("soundfile", models.get(position).getSoundfile());
                intent.putExtra("iImage", bytes);
                mContext.startActivity(intent);
                return;
            }
        });

   }

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

    @Override
    public Filter getFilter() {

        if (filter == null){
            filter = new CustomFilter1(filterList, this);
        }

        return filter;
    }
}

这就是我试图做到的,这使我在整个过程中感到困惑

public class PreferenceUtils {
    private static final PreferenceUtils ourInstance = new PreferenceUtils();
    private static SharedPreferences sharedPreferences;
    private static Context context;

    private static String APP_DATA_NAME = "SONGS";

    static PreferenceUtils getInstance() {
        return ourInstance;
    }

    private PreferenceUtils() {
    }

    public static void initialize(Context c) {
        sharedPreferences = c.getSharedPreferences(APP_DATA_NAME, Context.MODE_PRIVATE);
        context = c;
    }

    public static String getPreference(String key, String defaultValue) {
        if (sharedPreferences == null) return null;
        return sharedPreferences.getString(key, defaultValue);
    }

    public static boolean getPreference(String key, boolean defaultValue) {
        if (sharedPreferences == null) return false;
        return sharedPreferences.getBoolean(key, defaultValue);
    }

    public static Set<String> getPreference(String key) {
        if (sharedPreferences == null) return null;
        return sharedPreferences.getStringSet(key,null);
    }

    public static void setPreference(String key, String value) {
        if (sharedPreferences == null) return;
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString(key, value);
        editor.commit();
    }

    public static void setPreference(String key, boolean value) {
        if (sharedPreferences == null) return;
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putBoolean(key, value);
        editor.commit();
    }
    public static void setPreference(String key, Set<String> value) {
        if (sharedPreferences == null) return;
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putStringSet(key, value);
        editor.apply();
    }

}

这是我的row.xml

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

    <ImageView
        android:id="@+id/mainIcon"
        android:src="@drawable/song"
        android:layout_width="0dp"
        android:layout_height="40dp"
        android:layout_weight="0.1"/>
    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:gravity="center"
        android:layout_weight="0.8"
        android:layout_marginLeft="5dp"
        android:layout_marginStart="5dp">

        <TextView
            android:id="@+id/mainTitle"
            android:textStyle="bold"
            android:textColor="#740303"
            android:text="Title"
            android:textSize="15sp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
        <TextView
            android:id="@+id/mainDesc"
            android:text="Description"
            android:textColor="#262626"
            android:textSize="12sp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />


    </LinearLayout>
<ImageView
    android:id="@+id/favorite"
    android:layout_width="0dp"
    android:layout_height="30dp"
    android:layout_weight="0.1"
    android:src="@drawable/ic_heart_o"/>
</LinearLayout>

这也是我在model.class中能够做到的

public class Model {

    String title;
    String desc;

    //favorites songs key
    private static String FAVORITE_SONGS_KEY = "favorites";

    //song identifier
    int id;

    int icon;

    //constructor
    public Model(String title, String desc, int icon) {
        this.title = title;
        this.desc = desc;
        this.icon = icon;
    }

    //getters


    public String getTitle() {
        return this.title;
    }

    public String getDesc() {
        return this.desc;
    }

    public int getIcon() {
        return this.icon;
    }

    public void setFavorite() {
        if (isFavorite()) unset();
        else addTofavorite();
    }

    public boolean isFavorite() {
        String listIds = PreferenceUtils.getPreference(FAVORITE_SONGS_KEY, null);
        if (listIds == null) return false;
        List ids = new Gson().fromJson(listIds, List.class);
        if (ids == null) ids = new ArrayList();
        return ids.contains(String.valueOf(this.id));
    }

    private void unset() {
        String listIds = PreferenceUtils.getPreference(FAVORITE_SONGS_KEY, null);
        if (listIds == null) listIds = new String();
        List ids = new Gson().fromJson(listIds, List.class);
        if (ids == null) ids = new ArrayList();
        ids.add(String.valueOf(this.id));
        if (ids.contains(String.valueOf(this.id))) ids.remove(String.valueOf(this.id));
        PreferenceUtils.setPreference(FAVORITE_SONGS_KEY, new Gson().toJson(ids));
    }

    private void addTofavorite() {
        String listIds = PreferenceUtils.getPreference(FAVORITE_SONGS_KEY, null);
        if (listIds == null) listIds = new String();

        List ids = new Gson().fromJson(listIds, List.class);
        if (ids == null) ids = new ArrayList();
        ids.add(String.valueOf(this.id));
        PreferenceUtils.setPreference(FAVORITE_SONGS_KEY, new Gson().toJson(ids));
    }
}

推荐答案

您必须在适配器中创建arraylist,就像您要定义数组的数据类型一样,例如 public ArrayList< String>selectedImages; 然后onbindView,然后在收藏夹图标上单击类似的监听器

you have to create the arraylist in the adapter just like that the data type of the array is define as you want e.g public ArrayList<String> selectedImages; then onbindView and then on fav icon click listener like that

myViewHolder.favBtn.setOnClickListener(new View.OnClickListener() {
            if (selectedImages.contains(images.get(i))) {
                myViewHolder.mylinear.setBackgroundColor(Color.WHITE);
                selectedImages.remove(images.get(i));
            } else {
                myViewHolder.favBtn.setBackgroundColor(Color.BLACK);
                selectedImages.add(images.get(i)); //this is the list which you passing to the adapter
                Log.e("selected",selectedImages.toString());
            }
            return true;
    });

然后为在适配器中创建的该数组列表创建getter函数

then you make getter function for this array list which you created in the adapter like that

public ArrayList<String> getSelectedImages() {
    Log.e("selected",selectedImages.toString());
    return selectedImages;
}

现在您可以在需要的地方使用此方法像这样创建适配器的对象

now you can use call this method where you wants like that create the object of the adapter like that

ImageAdapter applicationimagesadapter;

然后创建数组列表以保存适配器getter函数的结果

then create the array list to save the result from the adapter getter function

 ArrayList<String> images;

然后使用适配器对象调用getter函数

then call the getter function with the adapter object

if (applicationimagesadapter != null) {
        images = applicationimagesadapter.getSelectedImages();
    }

就这样

这篇关于如何在Recyclerview上实现SharedPreference,以便保存收藏夹列表以便于使用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆