@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;
    }
}

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

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

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