Нужно передать String из SearchViewAdapter'a в активность

162
31 августа 2018, 11:50

Имеется адаптер, в котором на основе запроса формируется строка 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();
    }

}
Answer 1

Для связи с активностью используйте интерфэйс.

В адаптере:

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){
    ...
}
Answer 2

Во всех примерах которые обычно приводят 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();
}
Answer 3

Обычная передача экстра-данных через Intent

Intent intent = ....;
intent.putExtra("textToSpeech", textToSpeech);
startActivity(intent);

В принимающей активности:

String textToSpeech = getIntent().getString("textToSpeech", null);
READ ALSO
Какие есть применения у this в Java?

Какие есть применения у this в Java?

Я знаю он возвращает ссылку на текущий объект, и с его помощью можно разрешить конфликт локальных и глобальных имен, например в конструктореНо...

182
Не работает Comparator по нескольким полям

Не работает Comparator по нескольким полям

В FullComparator не работает сортировка по нескольким полям (channelName, DateCreated (в обратном порядке) и Fingerprint)Сортирует только по первому

180
Как форматировать дату с таймзоной в просто дату?

Как форматировать дату с таймзоной в просто дату?

Как получить из этой строки 2018-07-11T09:54:40660 +0000 обьект Date?

153
ExecutorService+GreenMail

ExecutorService+GreenMail

Тестирую отправку сообщений с помощью JavaMailSender, который запускается из ExecutorService с помощью submit, все работает отлично, но в тестах GreenMail не получает...

153