@SimpleName

Как реализовать пересоздание списка ArrayList для навигации в глубину по ReyclerView?

Пытаюсь построить навигацию на основе ArrayList. Логика достаточно простая - если parent_id равен 0, то эти элементы высвечиваются сразу при переходе на фрагмент с RecyclerView. За это отвечает вот этот запрос из Dao.
@Query("SELECT * from word_table WHERE parent_id = 0")
LiveData<List<Word>> getAlphabetizedWords();

После нажатия на элемент из начального списка ArrayList должен полностью очиститься и заполниться теми элементами, чей parent_id , для примера, равен 1
@Query("SELECT * FROM word_table WHERE parent_id = :id")
LiveData<List<Word>> getAlphabetizedWords(final int id);

Это должно продолжать до тех пор, пока у всех элементов из вновь созданного списка не выполнится условие has_products = true. Так как в sql нет true, то требуется получить 1. Для этого можно попробовать вот этот запрос dao (наверное)
@Query("SELECT has_products FROM WORD_TABLE WHERE has_products = 1")
boolean hasProduct();

Есть ли идеи по поводу того, как прописать код для всего этого?.
Вот пример базы данных
5dac90f8d707a769713350.jpeg
Вот коды
WordRoomDatabase

@Database(entities = {Word.class}, version = 6, exportSchema = false)
public abstract class WordRoomDatabase extends RoomDatabase {

    public abstract WordDao wordDao();

    // marking the instance as volatile to ensure atomic access to the variable
    private static volatile WordRoomDatabase INSTANCE;

    static WordRoomDatabase getDatabase(final Context context) {
        if (INSTANCE == null) {
            synchronized (WordRoomDatabase.class) {
                if (INSTANCE == null) {
                    INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                            WordRoomDatabase.class, "word_database")
                            .fallbackToDestructiveMigration()
                            .addCallback(sRoomDatabaseCallback)
                            .build();
                }
            }
        }
        return INSTANCE;
    }

    /**
     * Override the onOpen method to populate the database.
     * For this sample, we clear the database every time it is created or opened.
     *
     * If you want to populate the database only when the database is created for the 1st time,
     * override RoomDatabase.Callback()#onCreate
     */
    private static RoomDatabase.Callback sRoomDatabaseCallback = new RoomDatabase.Callback() {

        @Override
        public void onOpen(@NonNull SupportSQLiteDatabase db) {
            super.onOpen(db);
            // If you want to keep the data through app restarts,
            // comment out the following line.
            new PopulateDbAsync(INSTANCE).execute();
        }
    };

    /**
     * Populate the database in the background.
     * If you want to start with more words, just add them.
     */
    private static class PopulateDbAsync extends AsyncTask<Void, Void, Void> {

        private final WordDao mDao;

        PopulateDbAsync(WordRoomDatabase db) {
            mDao = db.wordDao();
        }

        @Override
        protected Void doInBackground(final Void... params) {
            // Start the app with a clean database every time.
            // Not needed if you only populate on creation.
            mDao.deleteAll();

            Word word = new Word(
                    1,
                    0,
                    "Category 1",
                    "http://185.83.242.116/media/photo_2018-08-20_12-55-11.jpg",false);
            mDao.insert(word);
            word = new Word(
                    2,
                    0,
                    "Category 2",
                    "http://185.83.242.116/media/photo_2018-08-20_12-55-11.jpg",false);
            mDao.insert(word);
            word = new Word(
                    3,
                    0,
                    "Category 3",
                    "http://185.83.242.116/media/photo_2018-08-20_12-55-11.jpg",false);
            mDao.insert(word);
            word = new Word(
                    4,
                    0,
                    "Category 4",
                    "http://185.83.242.116/media/photo_2018-08-20_12-55-11.jpg",false);
            mDao.insert(word);
            word = new Word(
                    5,
                    1,
                    "Subcategory 1.1",
                    "http://185.83.242.116/media/photo_2018-08-20_12-55-11.jpg",true);
            mDao.insert(word);
            word = new Word(
                    6,
                    1,
                    "Subcategory 1.2",
                    "http://185.83.242.116/media/photo_2018-08-20_12-55-11.jpg",true);
            mDao.insert(word);
            word = new Word(
                    7,
                    1,
                    "Subcategory 1.3",
                    "http://185.83.242.116/media/photo_2018-08-20_12-55-11.jpg",true);
            mDao.insert(word);
            word = new Word(
                    8,
                    2,
                    "Subcategory 2.1",
                    "http://185.83.242.116/media/photo_2018-08-20_12-55-11.jpg",true);
            mDao.insert(word);
            word = new Word(
                    9,
                    2,
                    "Subcategory 2.2",
                    "http://185.83.242.116/media/photo_2018-08-20_12-55-11.jpg",true);
            mDao.insert(word);
            word = new Word(
                    10,
                    3,
                    "Subcategory 3.1",
                    "http://185.83.242.116/media/photo_2018-08-20_12-55-11.jpg",true);
            mDao.insert(word);
            return null;
        }
    }
}


MainActivity

public class MainActivity extends AppCompatActivity {

    public static final int NEW_WORD_ACTIVITY_REQUEST_CODE = 1;
    private int parentId;
    private ArrayList<MenuPosition> ourMenuItems;
    private ArrayList<Word> list;

    private WordViewModel mWordViewModel;

    public MainActivity() {
        this.ourMenuItems = new ArrayList<>();
    }

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

        RecyclerView recyclerView = findViewById(R.id.recyclerview);
        final WordListAdapter adapter = new WordListAdapter(this);
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        adapter.setOnItemClickListener(new WordListAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(Word word) {
                //Toast toast = Toast.makeText(getApplicationContext(), "Products",Toast.LENGTH_SHORT);
                //toast.show();
                UpdateData();
            }
        });


        // Get a new or existing ViewModel from the ViewModelProvider.
        mWordViewModel = new ViewModelProvider(this).get(WordViewModel.class);

        mWordViewModel.getAllWords().observe(this, new Observer<List<Word>>() {
            @Override
            public void onChanged(@Nullable final List<Word> words) {
                // Update the cached copy of the words in the adapter.
                adapter.setWords(words);
            }
        });
    }

}


WorldListAdapter

public class WordListAdapter extends RecyclerView.Adapter<WordListAdapter.WordViewHolder> {


    class WordViewHolder extends RecyclerView.ViewHolder{
        private final TextView wordItemView;
        private final ImageView imageView;

        private WordViewHolder(View itemView) {
            super(itemView);
            wordItemView = itemView.findViewById(R.id.textView);
            imageView = itemView.findViewById(R.id.imageView);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int position = getAdapterPosition();
                    if (listener != null && position != RecyclerView.NO_POSITION){
                        listener.onItemClick(mWords.get(position));
                    }
                }
            });
        }
    }

    private final LayoutInflater mInflater;
    private List<Word> mWords; // Cached copy of words
    private OnItemClickListener listener;

    WordListAdapter(Context context) {
        mInflater = LayoutInflater.from(context);
    }

    @Override
    public WordViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = mInflater.inflate(R.layout.recyclerview_item, parent, false);
        return new WordViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(WordViewHolder holder, int position) {
        if (mWords != null) {
            Word current = mWords.get(position);
            holder.wordItemView.setText(current.getWord());
            Picasso.get().load(current.getImage()).into(holder.imageView);
        } else {
            // Covers the case of data not being ready yet.
            holder.wordItemView.setText("No Word");
        }
    }

    void setWords(List<Word> words) {
        mWords = words;
        notifyDataSetChanged();
    }

    // getItemCount() is called many times, and when it is first called,
    // mWords has not been updated (means initially, it's null, and we can't return null).
    @Override
    public int getItemCount() {
        if (mWords != null)
            return mWords.size();
        else return 0;
    }

    public interface OnItemClickListener {
        void onItemClick(Word word);
    }

    public void setOnItemClickListener(OnItemClickListener listener){
        this.listener=listener;
    }
}

  • Вопрос задан
  • 57 просмотров
Пригласить эксперта
Ответы на вопрос 1
onepavel
@onepavel
Консультация и разработка мобильных приложений
Я бы сам arrayList не трогал.
Вижу три варианта:
1. в ресайклер сетить новый list c данными и вызывать рефреш данных
2. в ресайклер передавать новый адаптер со списком данных и рефрешить
3. сделать на фрагментах, как делают файловые менеджеры для навигации по папкам
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
05 авг. 2020, в 01:56
15000 руб./за проект
05 авг. 2020, в 01:12
10000 руб./за проект
05 авг. 2020, в 00:27
5000 руб./за проект