Имеется адаптер, в котором на основе запроса формируется строка textToSpeech, мне нужно эту строку передать в активность. Код адаптера:
public class ProblemNameFilter extends Filter {
private final String SEARCH_DATA = "SEARCH_DATA";
ProblemNameAdapter adapter;
List<GetProblemListResponse.Problems> filterList;
Context context;
public String textToSpeech;
public ProblemNameFilter(List<GetProblemListResponse.Problems> filterList, ProblemNameAdapter adapter, Context context)
{
this.adapter=adapter;
this.filterList=filterList;
this.context = context;
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
if(constraint != null && constraint.length() > 0)
{
constraint=constraint.toString().toUpperCase();
List<GetProblemListResponse.Problems> filteredProblems = new ArrayList<>();
for (int i=0; i < filterList.size(); i++)
{
if (context.getSharedPreferences(SEARCH_DATA, Context.MODE_PRIVATE).getString("search", "code").equals("code")) {
if (filterList.get(i).getProblemCode().toUpperCase().contains(constraint)) {
filteredProblems.add(filterList.get(i));
}
}else {
if (filterList.get(i).getProblemName().toUpperCase().contains(constraint)) {
filteredProblems.add(filterList.get(i));
}
}
}
results.count = filteredProblems.size();
results.values = filteredProblems;
}else {
results.count = filterList.size();
results.values = filterList;
}
return results;
}
@Override
public void publishResults(CharSequence constraint, FilterResults results) {
adapter.problems = (List<GetProblemListResponse.Problems>) results.values;
if (adapter.problems.size() == 1) {
if (context.getSharedPreferences(SEARCH_DATA, Context.MODE_PRIVATE).getString("search", "code").equals("code")) {
textToSpeech = adapter.problems.get(0).getProblemName();
} else if (context.getSharedPreferences(SEARCH_DATA, Context.MODE_PRIVATE).getString("search", "").equals("text")) {
textToSpeech = adapter.problems.get(0).getProblemCode();
}
}
adapter.notifyDataSetChanged();
}
}
Для связи с активностью используйте интерфэйс.
В адаптере:
private SendText sendText;
public interface SendText{
public void getText(String yourText);
}
public ProblemNameFilter(List<GetProblemListResponse.Problems> filterList,
ProblemNameAdapter adapter, Context context) {
sendText = (SendText) context;
...
}
И, где нужно:
sendText.getText(yourText);
В активности:
MyActivity... implements ProblemNameFilter.SendText
@Override
public void getText(String text){
...
}
Во всех примерах которые обычно приводят Filter делают как inner class к Adapter и он таким образом выставляет переменную, в вашем случае textToSpeech. В вашем случае ИМХО вам надо в добавить в publishResults перед adapter.notifyDataSetChanged(); вызов запуска диктовки (с проверкой что старый старт еще не закончился). Т.е. у вас должно быть что-то Activity - стартует процесс диктовки
Intent checkIntent = new Intent();
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);
Далее в Activity вы получите разрешение и инициализируете mTs внутри активити:
private TextToSpeech mTts;
protected void onActivityResult(
int requestCode, int resultCode, Intent data) {
if (requestCode == MY_DATA_CHECK_CODE) {
if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
// success, create the TTS instance
mTts = new TextToSpeech(this, this);
} else {
// missing data, install it
Intent installIntent = new Intent();
installIntent.setAction(
TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
startActivity(installIntent);
}
}
}
Далее в адаптере вы инициализируете filter и в коде filter вместо context лучше протащить mts. Вот эту конструкцию лучше также протащить в инициализации ontext.getSharedPreferences(SEARCH_DATA, Context.MODE_PRIVATE).getString("search", "code") (она же не бдует меняться пока работает адаптер)?
Соответственно делаете так
@Override
public void publishResults(CharSequence constraint, FilterResults results) {
adapter.problems = (List<GetProblemListResponse.Problems>) results.values;
if (adapter.problems.size() == 1) {
if (search_string.equals("code")) {
textToSpeech = adapter.problems.get(0).getProblemName();
} else if (search_string.equals("text")) {
textToSpeech = adapter.problems.get(0).getProblemCode();
}
}
mTts.speak(textToSpeech , TextToSpeech.QUEUE_FLUSH, null);
adapter.notifyDataSetChanged();
}
Обычная передача экстра-данных через Intent
Intent intent = ....;
intent.putExtra("textToSpeech", textToSpeech);
startActivity(intent);
В принимающей активности:
String textToSpeech = getIntent().getString("textToSpeech", null);
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Я знаю он возвращает ссылку на текущий объект, и с его помощью можно разрешить конфликт локальных и глобальных имен, например в конструктореНо...
В FullComparator не работает сортировка по нескольким полям (channelName, DateCreated (в обратном порядке) и Fingerprint)Сортирует только по первому
Как получить из этой строки 2018-07-11T09:54:40660 +0000 обьект Date?
Тестирую отправку сообщений с помощью JavaMailSender, который запускается из ExecutorService с помощью submit, все работает отлично, но в тестах GreenMail не получает...