@natan_89

Кнопки не реагируют на вызов. В чем может быть ошибка?

Добрый день!
Подскажите, пож-ста.
Создаю приложение типа "тест".
У меня на главной странице меню.
Создал тесты и пытаюсь подключить их к меню.
Т.е. жмешь на кнопку и переходишь в тест.
Но приложение не переходит.
Ошибок также андроид не показывает.
Просто не работает переход и все.
Может кто-то подскажет в чем может быть дело.
Вот мой MainActivity
@Override
    public void onBackPressed() {
        if (drawer != null && drawer.isDrawerOpen()) {
            drawer.closeDrawer();
        } else {
            AppUtilities.tapPromtToExit(this);
        }
    }

    private void loadData() {
        showLoader();
        loadJson();

    }

    private void loadJson() {
        StringBuffer sb=new StringBuffer();
        BufferedReader br=null;
        try {
            br=new BufferedReader(new InputStreamReader(getAssets().open(AppConstants.CONTENT_FILE)));
            String temp;
            while ((temp=br.readLine()) != null) sb.append(temp);

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                br.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        parseJson(sb.toString());
    }

    private void parseJson(String jsonData) {
        try {
            JSONObject jsonObject=new JSONObject(jsonData);
            JSONArray jsonArray=jsonObject.getJSONArray(AppConstants.JSON_KEY_ITEMS);

            for (int i=0; i < jsonArray.length(); i++) {
                JSONObject object=jsonArray.getJSONObject(i);

                String categoryId=object.getString(AppConstants.JSON_KEY_CATEGORY_ID);
                String categoryName=object.getString(AppConstants.JSON_KEY_CATEGORY_NAME);

                categoryList.add(new CategoryModel(categoryId, categoryName));
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        hideLoader();
        adapter.notifyDataSetChanged();
    }

    private void initListener() {

        // recycler list item click listener
        adapter.setItemClickListener(new ListItemClickListener() {
            @Override
            public void onItemClick(int position, View view) {

                CategoryModel model=categoryList.get(position);
                ActivityUtilities.getInstance().invokeCommonQuizActivity(activity, QuizPromptActivity.class, model.getCategoryId(), true);
            }
        });
    }
}
  • Вопрос задан
  • 107 просмотров
Пригласить эксперта
Ответы на вопрос 1
akaish
@akaish
Стек Java\Android
Код дайте по нормальному. В андроиде помимо RecyclerView и RecyclerViewAdapter есть еще и ListView, который также в паре с адаптером используется.

Дальше, может я чего-то не понимаю (до сих пор по привычке и в целях совместимости на ListView списки делаю, RecyclerView не трогал по нормальному, так как задач с большими списками не было), но каким макаром вешается onItemClickListener() на адаптер? Или у вас собственная реализация адаптера, через метод которого Вы назначаете на целевой RecyclerView анонимную реализацию класса ListItemClickListener, унаследованную от RecyclerTouchListener????

Я не поленился, и нагуглил ListItemClickListener в блоге какого-то глубокоуважаемого индуса: ListItemClickListener
Вы оттуда копипастили? А откуда Вы скопипастили тогда "гениальное" решение назначать обработку событий не на View, а на адаптер? Это же в корне противоречит MVC архитектуре dataset-adapter-view. И ладно, что в блоге с примером ListItemClickListener используется просто дурацкая схема именования класса, которая сбивает с толку. Тут то архитектурная ошибка на уровне шаблонов проектирования.

Резюмируя, предоставленного кода недостаточно, на лицо ошибки проектирования и совершенно дурацкое наименование классов потомков. Также, я не понимаю, зачем наследоваться от регулярного потомка абстрактного RecyclerView.OnItemTouchListener в анонимном то классе. Что это вообще за дичь?

Искать ошибки не имеет смысла. Недостаточно предоставленного кода и дичь какая-то с конкретной реализацией адаптера и RecyclerView.OnItemTouchListener. Вот туториал, я его прочитал, по нему можно сделать правильно: https://www.androidhive.info/2016/01/android-worki...

По текущему коду, связанному с RecyclerView - можно оставить только лэйауты. И всё. Остальное переписать. В этом коде я вижу малоосмысленного Франкенштейна из копипасты. Надеюсь, Вы только учитесь. Если это коммерческий проект какой-то фирмы, дайте, пожалуйста, в личку, её название. Буду обходить её продукты стороной, просто если это планируется в качестве реального кода, с таким "х@@к, х@@к и в продакшен" продуктом иметь дел не хочется, как, впрочем, и работать с такими людьми.

UPD.1 Еще раз пробежался по коду глазами. Что это за дичь?
private void loadData() {
        showLoader();
        loadJson();
}

И
hideLoader();
adapter.notifyDataSetChanged();

метода parseJson(String jsonData)??? Как бы продолжительные операции делаются вне GUI потока, иначе можно ANR получить. Реализуется через AssyncTask (простой способ).

UPD.2
@Override
    public void onBackPressed() {
        if (drawer != null && drawer.isDrawerOpen()) {
            drawer.closeDrawer();
        } else {
            AppUtilities.tapPromtToExit(this);
        }
    }

Вот не надо тащить из дикого веба диалоги "А Вы точно хотите выйти?". На андроиде подтверждение выхода из приложения принято делать двойным тапом на back кнопку с Toast после первого тапа. Диалог следует вешать только в тех случаях, когда при случайном выходите возможна потеря пользовательских данных (к примеру, набора текста). И то, если правильно подходить к разработке Android приложений, таких ситуаций возникать не должно в принципе. В догонку: Understand the Activity Lifecycle

UPD.3 Ну и хоть бы код форматировали. В Android Studio хоткей по умолчанию CTRL-SHIFT-ALT-L.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы