#android #android-recyclerview #sharedpreferences
#Android #android-recyclerview #sharedpreferences
Вопрос:
A создал списки песен, и при нажатии на элемент в этом списке вы попадаете в NewActivity1, где отображаются полные тексты песен. Я сохранил данные в String.xml . Итак, передайте эти данные из строки через адаптер и покажите их в NewActivity1. Я использовал Recyclerview для этой цели. Мне очень сложно реализовать это в sharedpreference. Я хочу, чтобы пользователь мог добавлять песню в sharedpreference из NewActivity1. Потому что именно там пользователь прочитал полный текст песни.
Пожалуйста, мне нужна ваша помощь. На самом деле я не знаю, с чего начать. Если бы fav_icon был помещен в row.xml Возможно, мне удастся его настроить.
Это 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
<?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 herentttherett➝"
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>
This is the data I stored in the String.xml from where I populate
<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>
This is the 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);
}
}
This is the MyAdapter1 class
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;
}
}
This is what I was trying to do that got me confused in the whole process
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();
}
}
This is my 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));
}
}
Комментарии:
1. Да, вы можете поместить значок избранного в строку, а затем щелкнуть по кнопке «Избранное», поместить все детали песни в настройки общего доступа, а затем использовать там, где вы хотите, по щелчку мыши вы должны изменить цвет значка, поместить его в настройки общего доступа, а по другому щелчку удалить из него и изменить цвет значка
2. что вы хотите в избранном btn click
3. все это происходит в адаптере
Ответ №1:
вы должны создать arraylist в адаптере точно так же, чтобы тип данных массива определялся так, как вы хотите, например, public ArrayList<String> selectedImages;
затем onBindView, а затем на значке избранного нажмите listener вот так
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;
});
затем вы создаете функцию получения для этого списка массивов, который вы создали в адаптере, следующим образом
public ArrayList<String> getSelectedImages() {
Log.e("selected",selectedImages.toString());
return selectedImages;
}
теперь вы можете использовать вызов этого метода там, где хотите, вот так
создайте объект адаптера следующим образом
ImageAdapter applicationimagesadapter;
затем создайте список массивов, чтобы сохранить результат из функции получения адаптера
ArrayList<String> images;
затем вызовите функцию получения с объектом адаптера
if (applicationimagesadapter != null) {
images = applicationimagesadapter.getSelectedImages();
}
и это все