Я просто пытаюсь обновлять свой RecyclerView каждый раз, когда мой AudioRecorder создает новый файл. Мое повторное представление создается на фрагменте (назовем его фрагментом А). У меня есть еще один фрагмент, где каждый раз, когда он вызывается, начинается запись звука (назовем его фрагмент B).
Я использую интерфейс во фрагменте B, чтобы сообщить фрагменту A, что адаптер должен обновлять данные.
Я создал открытый интерфейс с методом «UpdateData ()».
Когда кнопка «Остановить запись» нажата на фрагменте B, я вызываю интерфейс, чтобы он мог связаться с основным фрагментом (фрагмент A) и обновить данные.
Пока что Android Studio сообщает, что моя переменная из интерфейса равна нулю, хотя я определил ее в методе «При подключении».
[Переменная контекста в методе «При подключении» относится к моей основной деятельности, а не к моему текущему фрагменту, в котором находится обзор реселлера. Это проблема, поэтому я изменил ее, чтобы он получил фрагменты. Но это не остановило приложение от сбоя].
//Here's my main Fragment (Fragment A)
public class RecordsFragment extends Fragment implements Records_BottomSheet_Dialog.BottomSheet_Interface {
private static final int PERMISSION_REQUEST = 1000;
static ArrayList<String> mNames = new ArrayList<>();
static ArrayList<String> NbFiles = new ArrayList<>();
static ArrayList<String> PathFiles = new ArrayList<>();
static int NumberFile= 0;
static RecyclerView recyclerView;
static RecyclerViewAdapter adapter;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_records, container, false);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
//Check if we have the permission to read storage
if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
//We don't have the permission, so request it.
ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, PERMISSION_REQUEST);
}
if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.RECORD_AUDIO)
!= PackageManager.PERMISSION_GRANTED) {
//We don't have the permission, so request it.
ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.RECORD_AUDIO}, PERMISSION_REQUEST);
}
//We already have permission
else {
permissionExists();
}
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
initRecyclerView(view, recyclerView, adapter);
}
@Override
public void onResume() {
super.onResume();
((FileAndDirectoryActivity) getActivity())
.setButton("Créer un nouvel Enregistrement", true);
}
public void initRecyclerView(View v, RecyclerView recyclerView, RecyclerView.Adapter adapter) {
recyclerView = v.findViewById(R.id.recyclerview);
adapter = new RecyclerViewAdapter(mNames, getActivity().getApplicationContext());
adapter.notifyDataSetChanged();
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity().getApplicationContext()));
}
private void permissionExists() {
mNames.clear();
PathFiles.clear();
NbFiles.clear();
String path = Environment.getExternalStorageDirectory().toString() + "/Rapture";
File directory = new File(path);
boolean success = true;
if (!directory.exists()) {
success = directory.mkdirs();
}
if (success) {
File[] arrayFiles = directory.listFiles();
for (File file : arrayFiles) {
mNames.add(file.getName());
PathFiles.add(file.getPath());
NbFiles.add(file.getName());
}
}
}
@Override
public void UpdatetheData(boolean state) {
if (state==true){
adapter.notifyDataSetChanged();
}
}
}
//Here's my other fragment (the one that records upon called, Fragment B)
public class Records_BottomSheet_Dialog extends BottomSheetDialogFragment{
private MediaRecorder AudioRecorder;
private String outputFile;
private FloatingActionButton stop;
private static final int PERMISSION_REQUEST = 1000;
private Integer FileSize = RecordsFragment.NbFiles.size();
private BottomSheet_Interface bts;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
permissionExists();
View view = inflater.inflate(R.layout.modal_records, container, false);
FloatingActionButton stop_record = view.findViewById(R.id.stop);
stop_record.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
bts.UpdatetheData(true);
AudioRecorder.stop();
AudioRecorder.release();
AudioRecorder = null;
Toast.makeText(getActivity(), "Fin de l'enregistrement", Toast.LENGTH_SHORT).show();
dismiss();
}
});
return view;
}
public interface BottomSheet_Interface{
void UpdatetheData(boolean state);
}
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
try {
bts = (BottomSheet_Interface) getActivity().getFragmentManager().findFragmentById(R.id.fragment_container);
} catch (ClassCastException e){
throw new ClassCastException(context.toString()
+" must implement BottomSheet_Interface");
}
}
private void permissionExists() {
AudioRecorder = new MediaRecorder();
AudioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
AudioRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
if (FileSize != 0) {
for (int i = 0; i < FileSize + 1; i++) {
String path = Environment.getExternalStorageDirectory().toString() + "/Rapture/Recording(" + Integer.toString(i) + ").mp3";
File f = new File(path);
if (!f.exists()) {
AudioRecorder.setOutputFile(Environment.getExternalStorageDirectory().toString() + "/Rapture/Recording(" + Integer.toString(i) + ").mp3");
break;
}
}
} else {
AudioRecorder.setOutputFile(Environment.getExternalStorageDirectory().toString() + "/Rapture/Recording(0).mp3");
}
AudioRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
Toast.makeText(getActivity(), "Enregistrement", Toast.LENGTH_SHORT).show();
try {
AudioRecorder.prepare();
AudioRecorder.start();
} catch (IllegalStateException ie) {
} catch (IOException ioe) {
}
}
}
Проблема в том, что когда я записываю несколько дублей с помощью AudioRecorder, если RecyclerView не был обновлен, то приложение вылетает, если я пытаюсь повторить попытку. Поэтому мне нужно обновлять адаптер RecyclerView каждый раз, когда пользователь прекращает запись.
Я ожидаю, что RecyclerView напрямую покажет созданный новый файл, но вместо этого мне придется перейти на другие вкладки, прежде чем вернуться на вкладку аудио, чтобы обновить его.