Добавьте это в ваш класс HAdapter
private View.OnKeyListener mOnKeyListener = new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
RecyclerView rv = (RecyclerView) v.getParent();
if (event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_DPAD_UP) {
rv.getLayoutManager().scrollToPosition(0);
}
return false;
}
};
и
itemView.setOnKeyListener(mOnKeyListener);
в метод onCreateViewHolder
вашего класса HAdapter.
Это только для клавиши «Стрелка вверх», вы можете расширить предложение if, чтобы включить клавишу «Стрелка вниз».
Редактировать:
Кроме того, вы можете поместить это в предложение if вместо вызова метода scrollToPosition:
private View.OnKeyListener mOnKeyListener = new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
RecyclerView rv = (RecyclerView) v.getParent();
if (event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_DPAD_UP) {
int pos = rv.getLayoutManager().getPosition(v);
rv.scrollBy(-((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, pos * width, mContext.getResources().getDisplayMetrics())), 0);
}
return false;
}
};
где width - это ширина RecyclerView пункт (ы) в дп.
Предложение:
Я бы переместил методы setAdapter и setLayoutManager из класса ViewHolder в тело класса HAdapter. (Сделайте то же самое в классе VAdapter). Они не имеют ничего общего с шаблоном ViewHolder. Шаблон ViewHolder используется для оптимизации производительности путем кэширования представлений, возвращаемых findViewById ()
Редактировать 2:
Добавить этот класс в ваш проект:
Затем измените свой v_item_view .xml:
Я проверил это, и оно работает.
Самый легкий должен был бы заменить каждого %Label%
с (?<Label>.*?)
, и выйдите из любых других символов.
%Artist%-%Album%-%Track%-%Title%.mp3
становится
(?<Artist>.*?)-(?<Album>.*?)-(?<Track>.*?)-(?<Title>.*?)\.mp3
Вы затем получили бы каждый компонент в именованные группы получения.
Dictinary<string,string> match_filename(string rule, string filename) {
Regex tag_re = new Regex(@'%(\w+)%');
string pattern = tag_re.Replace(Regex.escape(rule), @'(?<$1>.*?)');
Regex filename_re = new Regex(pattern);
Match match = filename_re.Match(filename);
Dictionary<string,string> tokens =
new Dictionary<string,string>();
for (int counter = 1; counter < match.Groups.Count; counter++)
{
string group_name = filename_re.GroupNameFromNumber(counter);
tokens.Add(group_name, m.Groups[counter].Value);
}
return tokens;
}
Но если пользователь не учитывает разделители, или если разделители могли бы содержаться в полях, Вы могли бы получить некоторые странные результаты. Шаблон был бы для %Artist%%Album%
стал бы (?<Artist>.*?)(?<Album>.*?)
который эквивалентен .*?.*?
. Шаблон не знал бы, где разделить.
Это могло быть решено, если Вы знаете формат определенных полей, таких как номер дорожки. Если Вы переводите %Track%
кому: (?<Track>\d+)
вместо этого, шаблон знал бы, что любые цифры в имени файла должны быть Track
.
Не ответ на вопрос Вы спросили, но библиотека чтения тега ID3 могла бы быть лучшим способом сделать это при использовании MP3s. Быстрый Google придумал: Библиотека C# ID3.
Что касается предположения, которые представляют положения в виде строки, содержат художника, альбом и заголовок песни..., первая вещь, о которой я могу думать, состоит в том, что, если у Вас есть хороший выбор для работы со скажем несколько альбомов, Вы могли бы увидеть в первый раз, какое положение повторяется больше всего, который был бы художником, который повторяет вторые самые большие (альбом) и который повторяет наименьшее количество (заголовок песни).
Иначе на трудное предположение походит делать базирующимся только на нескольких строках в имени файла... Вы могли попросить, чтобы пользователь также ввел выражение соответствия для имени файла, которое описывает порядок полей?
Имена файлов в Вашем примере кажутся довольно последовательными мне. Можно просто сделать строку. Разделение () и добавляет каждый элемент полученного массива к согласно данным меток.
Предположение, которое - положение, какие данные меток включили бы ТОННЫ эвристики.
Папки Btw., которые содержат файлы песни обычно, имеют некоторый шаблон на свое имя также, f.e.
1998 - Семь
1999 - Перископ
2000 - CO2
Формат здесь является %Year % - %AlbumName %, который мог бы помочь Вам определить, какой элемент в имени файла является альбомом.
Для разъяснения у меня ДЕЙСТВИТЕЛЬНО есть шаблон для соответствия именам файлов против.
Я не знаю имени файла или шаблона заранее, это - все время выполнения.
Шаблон:
%Artist%-%Album%-%Track%-%Title%.mp3
Имена файлов:
Kraftwerk-Kraftwerk-01-RuckZuck.mp3 Kraftwerk-Autobahn-01-Autobahn.mp3 Kraftwerk-Computer World-03-Numbers.mp3
Ожидаемый результат:
Artist Album Track Title Kraftwerk Kraftwerk 01 RuckZuck Kraftwerk Autobahn 01 Autobahn Kraftwerk Computer World 01 Numbers
Снова, формат и имена файлов являются не всегда тем же.
Я записал файл renamer---RenameWand---командной строки, который делает вид сопоставления с образцом, которое Вы описываете. Это находится в Java, хотя, но я думаю, часть исходного кода и документации использования может представлять интерес для Вас. Простой пример того, что может сделать программа:
Исходный шаблон (указан пользователями):
<artist>-<album>-<track>-<title>.mp3
Целевой шаблон (указан пользователями):
<title.upper>-<3|track+10>-<album.lower>-<artist>.mp3
Исходное имя файла:
Kraftwerk-Computer World-03-Numbers.mp3
Переименованное имя файла:
NUMBERS-013-computer world-Kraftwerk.mp3