プリファレンス保存、読み出しでSet<> <=> List<> の変換だけで楽だった。
しかし、新しく登録したものが最初に出てこなくなる副作用が…。これは気に入らない。
変換時に順番が入れ替わってしまうようだ。
なので、昇順降順の切り替え、名前、登録時の時間での並び替えを実現する配列を考える。
並び替えの元を作る。パス、登録時の時間、プリファレンス用文字列。
追加、削除、プリファレンス入出力に都合のいい3種のデータをパックにした。
public class MyStringForFavorite {
private String main = ""; // 画像パス
private String time = ""; // 登録時の時間
private String join = ""; // 結合文字列
public MyStringForFavorite( String name ) { // name は画像パスか、時間+",,"+パスの限定。それ以外は飛ぶ・・かな。
join = name;
String[] mSplit = name.split(",,"); // 時間+",,"+パスを分離。
if (mSplit.length == 1){ // 時間成分が無い
main = mSplit[0];
time = getNowDate();
join = time + ",," + main; // 時間+",,"+パスで結合保存。
} else {
time = mSplit[0];
main = mSplit[1];
}
}
public String getPath(){ return main; }
public String getTime(){ return time; }
public String getJoin(){ return join; }
private String getNowDate() {
@SuppressLint("SimpleDateFormat") DateFormat df = new SimpleDateFormat( "yyyy-MM-dd--HH-mm-ss" );
Date date = new Date( System.currentTimeMillis() );
return df.format(date);
}
}
// 上の MyString クラスを配列で使うための MyList クラスを作る。
SetToArrayList(Set<>) でプリファレンスから読み込んだ Set<> を ArrayList<> まで変換させている。
ソート部分の
Collections.sort(
mPathNameList, new Comparator< MyStringForFavorite >() {
@Override
public int compare(MyStringForFavorite mn1, MyStringForFavorite mn2) {
return - mn1.getTime().compareTo(mn2.getTime());
}
}
);
ここで時間を元に並び変え。return値にマイナス符号を付加して降順配列としている。
マイナス符号を付けなければ、この場合は昇順配列となる。
追加、削除、その他ソート、RecyclerView用のList<>排出、リファレンス用のSet<>排出を用意。
public class MyFavoriteList {
private ArrayList< MyStringForFavorite > mPathNameList;
MyFavoriteList() {
mPathNameList = new ArrayList< MyStringForFavorite >();
}
public void SetToArrayList( Set< String > sou ) { // リファレンスデータ変換
if ( sou == null || sou.isEmpty() ) {
clear();
return;
}
List< String > temp = new ArrayList< String >(sou); // Set<> を List<>に変換。
for (int i=0; i < temp.size(); i++ ) {
mPathNameList.add( new MyStringForFavorite(temp.get(i))); // ArrayListへ追加。
}
Collections.sort(
mPathNameList, new Comparator< MyStringForFavorite >() {
@Override
public int compare(MyStringForFavorite mn1, MyStringForFavorite mn2) {
return - mn1.getTime().compareTo(mn2.getTime());
}
});
}
public void add( String path ) {
if ( path == null ) return;
mPathNameList.add( 0, new MyStringForFavorite( path )); // 引数 0 は先頭追加
}
public boolean remove(int index) {
if ( mPathNameList.isEmpty() || index < 0 || index >= mPathNameList.size() ) return false;
try {
mPathNameList.remove(index);
} catch (UnsupportedOperationException e ) {
e.printStackTrace();
}
return true;
}
public void sortTime(boolean flag) {
if ( flag ) {
Collections.sort(
mPathNameList, new Comparator< MyStringForFavorite >() {
@Override
public int compare(MyStringForFavorite mn1, MyStringForFavorite mn2) {
return mn1.getTime().compareTo(mn2.getTime());
}
} );
} else {
//省略 return - mn1.getTime().compareTo(mn2.getTime()); マイナス符号付くだけ
}
}
public void sortPath(boolean flag) {
if ( flag ) {
Collections.sort(
mPathNameList, new Comparator< MyStringForFavorite >() {
@Override
public int compare(MyStringForFavorite mn1, MyStringForFavorite mn2) {
return mn1.getPath().compareTo(mn2.getPath());
}
} );
} else {
//省略 return - mn1.getPath().compareTo(mn2.getPath()); マイナス符号付くだけ
}
}
public List< String > getList() { // RecyclerView用List<>データ
List< String > list = new ArrayList< String >();
for (int i=0; i < mPathNameList.size(); i++ ){
list.add( mPathNameList.get(i).getPath() );// フルパス
}
return list;
}
public Set< String > getSet() { // リファレンス用Set<>データ
List< String > list = new ArrayList< String >();
for (int i=0; i < mPathNameList.size(); i++ ){
list.add( mPathNameList.get(i).getJoin() );// 日時+フルパス
}
return new HashSet< String >( list );
}
public String getPath(int index) {
if ( mPathNameList.isEmpty() || index < 0 || index >= mPathNameList.size() ) return null;
return mPathNameList.get(index).getPath();
}
public boolean isEmpty() { return mPathNameList.isEmpty(); }
public int size() { return mPathNameList.size(); }
public void clear() { mPathNameList.clear(); }
public void finish() {
mPathNameList.clear();
mPathNameList = null;
}
}
なんか、
Set< String > listData = new HashSet< String >( list );
法則性の処理があるみたいで、削除、先頭追加を繰り返してみても同じような場所に配置換えされた。
まぁ、しょうがない。