E / RecyclerView: адаптер не подключен; пропускающий макет (MainActivity to HomeFragment) - PullRequest
0 голосов
/ 15 января 2020

Как я могу переместить эти действия из MainActivity в HomeFragment? Могу ли я перейти путем создания нового класса во фрагменте Home?

Я пытался перейти путем создания нового класса HomeFragment2, как показано ниже

package com.domachita.jsdict.ui.home;

import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.RecyclerView;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.support.annotation.Nullable;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.arch.lifecycle.Observer;
import android.arch.lifecycle.ViewModelProviders;

import com.domachita.jsdict.Adapter.SearchAdapter;
import com.domachita.jsdict.Database.Database;
import com.domachita.jsdict.R;
import com.mancj.materialsearchbar.MaterialSearchBar;

import java.util.ArrayList;
import java.util.List;

public class HomeFragment extends Fragment{

    private HomeViewModel homeViewModel;

    @Override
    public View onCreateView(LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
        homeViewModel =
                ViewModelProviders.of(this).get(HomeViewModel.class);
        View root = inflater.inflate(R.layout.fragment_home, container, false);
        final TextView textView = root.findViewById(R.id.text_home);
        homeViewModel.getText().observe(this, new Observer<String>() {
            @Override
            public void onChanged(@Nullable String s) {
                textView.setText(s);
            }
        });
        return root;
    }
}

class HomeFragment2 extends AppCompatActivity {


    RecyclerView recyclerView;
    RecyclerView.LayoutManager layoutManager;
    SearchAdapter adapter;

    MaterialSearchBar materialSearchBar;
    List<String> suggestList = new ArrayList<>();

    Database database;

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

        //init view
        recyclerView = (RecyclerView)findViewById(R.id.recycler_search);
        layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setHasFixedSize(true);

        materialSearchBar = (MaterialSearchBar)findViewById(R.id.search_bar);

        //init DB
        database = new Database(this);

        //Setup search bar
        materialSearchBar.setHint("検索したい語句を入力");

        materialSearchBar.addTextChangeListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

                List<String> suggest = new ArrayList<>();
                for (String search:suggestList)
                {
                    if (search.toLowerCase().contains(materialSearchBar.getText().toLowerCase()))
                        suggest.add(search);
                }
                materialSearchBar.setLastSuggestions(suggest);

            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });
        materialSearchBar.setOnSearchActionListener(new MaterialSearchBar.OnSearchActionListener() {
            @Override
            public void onSearchStateChanged(boolean enabled) {
                if (enabled)
                    recyclerView.setAdapter(adapter);
            }

            @Override
            public void onSearchConfirmed(CharSequence text) {
                startSearch(text.toString());
            }

            @Override
            public void onButtonClicked(int buttonCode) {

            }
        });


        //Init Adapter default set all result
        adapter = new SearchAdapter(this,database.getDicts());
        recyclerView.setAdapter(adapter);

    }

    private void startSearch(String text) {

        adapter = new SearchAdapter(this,database.getDictByJapanese(text));
        recyclerView.setAdapter(adapter);
    }


}

Список не отображается, и у меня появляется эта ошибка

E/RecyclerView: No adapter attached; skipping layout

Я много изменил, но не могу решить эту проблему.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 15 января 2020

Я думаю, что вы запускаете database.getDicts() в главном потоке и, как только он получает результаты, вы устанавливаете адаптер. Попробуйте проверить, сколько времени занимает ваш database.getDicts().

Лучший способ получить данные из БД - это сделать это асинхронно.

0 голосов
/ 15 января 2020

Добавьте эту строку в oncreate () или выше ваших методов:

   adapter = new SearchAdapter(this,database.getDicts());
    recyclerView.setAdapter(adapter)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...