Как сделать динамический фильтр?Android SDK Java - PullRequest
0 голосов
/ 30 марта 2019

Помогите реализовать идею с приложением.Приложение получает JSON с сайта и отображает информацию на экране (например, игры (изображение, название игры, создатели, год выпуска и описание)).Это все разделено, получено данные через модернизацию и вывод их через recycleview.С этим проблем нет, но я не могу думать о реализации фильтра.Фильтр должен быть динамическим, например, создатели и год выпуска.Активация открывается, когда список СОЗДАТЕЛЕЙ падает, а флажки с названием студии снижаются, а ГОД ПРОБЛЕМЫ и флажки с годом выпуска также идут после него (только создатели и год должны получать информацию из данных, которые ониполучил от сервера через Джейсона).Идея состоит в том, чтобы иметь первый стандартный флажок типа all, который позволяет сразу выводить все, что находится в самом начале приложения, а затем нажать кнопку фильтра и выбрать именно то, что вас интересует.И должна быть кнопка, которая все это обновляет и возвращает с конкретными параметрами.И я увидел, что есть кнопка в виде креста в правом верхнем углу (вверху на панели действий), которая, возможно, отменяет все и возвращает ее в исходное положение (только для всех флажков).Я очень надеюсь на ваши советы и советы о том, как реализовать это приложение.Спасибо всем

Вот хороший пример фильтра (он мне нужен) https://pp.userapi.com/c851332/v851332451/e7308/hhiO3IOHPsg.jpg

фактически отдельное действие, которое динамически заполняется флажками на результатах, полученных изJSON (имя, год и т. Д.)

Значение класса POJO:

открытый класс Значение {

@SerializedName("title")
@Expose
private String title;
@SerializedName("year")
@Expose
private String year;
@SerializedName("genre")
@Expose
private List<String> genre;
@SerializedName("director")
@Expose
private String director;
@SerializedName("desription")
@Expose
private String desription;
@SerializedName("image")
@Expose
private String image;

public String getTitle() {
    return title;
}

public String getYear() {
    return year;
}

public List<String> getGenre() {
    return genre;
}

public String getDirector() {
    return director;
}

public String getDesription() {
    return desription;
}

public String getImage() {
    return image;
}

}

Класс POJO длязначение списка:

открытый класс Пример {

@SerializedName("values")
@Expose
private List<Value> values = null;

public List<Value> getValues() {
    return values;
}

}

MainActivity:

открытый класс MainActivity extends Activity {

private static final String TAG = "MoviesApp";

RecyclerView recyclerView;

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu, menu);
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.filters:
            Intent intent = new Intent(this, FiltersActivity.class);
            startActivity(intent);
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    recyclerView = findViewById(R.id.rc_movies);

    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(linearLayoutManager);
    recyclerView.setHasFixedSize(true);

    JSONPlaceHolderApi service = NetworkService.getJSONApi();
    Call <Example> call = service.getValues();
    call.enqueue(new Callback<Example>() {
        @Override
        public void onResponse(Call<Example> call, Response<Example> response) {
            Example data = response.body();

            if(response.isSuccessful()) {
                if(data != null) {
                    MoviesAdapter moviesAdapter = new MoviesAdapter(MainActivity.this, data);
                    recyclerView.setAdapter(moviesAdapter);

                    Log.i(TAG, "Response call");
                }else{
                    Log.i(TAG, "Data is null");
                }
            }else{
                Log.i(TAG, "Response does not successful");
            }
        }

        @Override
        public void onFailure(Call<Example> call, Throwable t) {
            Log.i(TAG, "Failure call");
        }
    });
}

}

И я не могу сделать FiltersActivity так, чтобы он работал в соответствии с условием

Извините за плохой английский: C

1 Ответ

0 голосов
/ 30 марта 2019

...

Привет, Даниил, использование второго действия для фильтра, на мой взгляд, неплохая идея. Проблема заключается в обновлении списка каждый раз, когда вы применяете новый фильтр, потому что вам нужно где-то хранить значения фильтров, а затем обновлять список после применения.

Я предлагаю вам попробовать использовать общий класс между действиями (возможно, ViewModel), и если вы хотите разрешить генерацию фильтров, вы можете динамически построить интерфейс второго действия во время вашего сетевого вызова, используя значения, которые у вас есть. получил.

Все значения фильтров могут быть сохранены внутри модели представления в соответствующий объект во время сетевого вызова (используя фоновую операцию, чтобы не заморозить интерфейс).

Когда вы вызываете второе действие, общий класс будет опрошен для получения фильтров, а в методе onCreate вы можете программно сгенерировать соответствующие представления из данных, которые вы получили после опроса.

Кроме того, чтобы убедиться, что событие «Применить фильтр» будет перехвачено первым действием, вы можете использовать библиотеку шины событий, объект LiveData или шаблон наблюдателя (прослушиватель) в соответствии с теми, которые лучше всего соответствуют вашей архитектуре. Когда первое действие получает событие, вы можете принудительно отключить операцию фильтрации ваших данных и обновить RecyclerView с помощью notifyDataSetChange ().

Другой архитектурный подход состоит в том, чтобы использовать одно действие и два фрагмента, но он требует больше кода, несмотря на свою гибкость. Этот подход лучше всего подходит для Viewmodels и Livedata и позволяет вам управлять только одним жизненным циклом действия (не беспокоясь об уничтожении несфокусированные действия системы).

Надеюсь, что это даст вам некоторые подсказки / помощь.

Приветствия

...