Если я правильно понял вашу проблему, вы хотите воспроизвести звук при загрузке элемента в RecyclerView
.
Поэтому я хотел бы подумать об обходном пути здесь.Вы можете рассмотреть возможность добавления элемента после воспроизведения звука для предыдущего элемента.
Я хотел бы предоставить псевдокод для того, что я пытаюсь объяснить.Вы можете использовать MediaPlayer.OnCompletionListener
для прослушивания, если ваш звук перестал воспроизводиться, а затем добавить следующий элемент в RecyclerView
и затем вызвать notifyDataSetChanged
на вашем адаптере, чтобы загрузить следующий элемент в RecyclerView
.
Следовательно, вам может понадобиться следующая модификация вашего адаптера.
// Declare a function in your adapter which adds new item in the RecyclerView
public void addItem(Multiples item) {
items.add(item);
notifyItemInserted(items.size());
}
Теперь в вашем Activity
, где вы настроили RecyclerView
, вам нужно иметь следующие массивы.
ArrayList<Multiples> allItems = new ArrayList<Multiples>(); // This list will contain all the data
int soundToBePlayed = -1; // Initialize the value with -1
ArrayList<Integer> soundList = getAllSoundsInAList();
Измените ваши функции следующим образом.
private void initComponent() {
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setHasFixedSize(true);
allItems = DataGenerator.getPeopleData(this,of,value);
setAdapter();
}
private void setAdapter() {
mAdapter = new AdapterListAnimation(this, animation_type); // Do not pass the items list
recyclerView.setAdapter(mAdapter);
// .. Your item click listener goes here
}
Поскольку items
был удален из конструктора, вам также необходимо изменить конструктор вашего адаптера.Просто удалите переменную, которая принимает items
.Потому что мы будем добавлять элементы к items
позже.
Затем вам нужно написать другую функцию, которую нужно вызывать в вашей функции onCreate
вашей активности после вызова вашей функции initComponent
.Функция должна выглядеть следующим образом.
private void addItemInRecyclerViewAndPlaySound() {
soundToBePlayed++;
adapter.addItem(allItems.get(soundToBePlayed));
recyclerView.scrollToPosition(adapter.getItemCount() - 1);
Integer soundId = soundList.get(soundToBePlayed);
MediaPlayer mp = MediaPlayer.create(this, soundId);
if (mp.isPlaying()) {
mp.stop();
mp.release();
mp = MediaPlayer.create(this, soundId);
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
// Call this function again to add next item
// and play the next sound at the same time
if(soundToBePlayed < allItems.size() - 1)
addItemInRecyclerViewAndPlaySound();
}
});
}
mp.start();
}
Я не тестировал код, однако, думаю, вы уже поняли идею.Это можно реализовать изящно, используя interface
внутри адаптераТехника imeplemntation - ваш выбор.