Как исправить представление переработчика не будет подключать адаптер при получении данных с дооснащением - PullRequest
0 голосов
/ 11 апреля 2019

Я создаю приложение, которое может извлекать данные из моей собственной базы данных. Я использую Retrofit для соединения с моим API. Я создаю Bottom Navigation Activity, чтобы я мог добавить к нему несколько фрагментов. Я использую Recycler View, чтобы показать список, но он не позволяет мне подключить адаптер, когда я получаю данные, он всегда показывает эту ошибку в журнале:

04-11 14:29:19.461 1912-1912/com.siscaproject.sisca E/RecyclerView: No adapter attached; skipping layout

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

public class SearchAssetFragment extends Fragment {
    private static final String TAG = "SearchAssetFragment";

    @BindView(R.id.search_view) SearchView searchView;
    @BindView(R.id.swprefresh) SwipeRefreshLayout refresh;
    @BindView(R.id.rv_list_asset) RecyclerView recyclerView;
    @BindView(R.id.progress_bar) ProgressBar progressBar;

    private MaterialDialog createDialog;

    private AssetsAdapter adapter;

    private ArrayList<Asset> listData = new ArrayList<>();

    private UserService userService;

    private OnFragmentInteractionListener mListener;

    private AssetsAdapter.OnButtonClickListener listener = new AssetsAdapter.OnButtonClickListener() {
        @Override
        public void showDeleteDialog(int id) {
            // TODO: Complete showDeleteDialog()
        }

        @Override
        public void showEditDialog(Asset asset) {
            // TODO: Complete showEditDialog()
        }
    };

    public SearchAssetFragment() {
        // Required empty public constructor
    }

    public static SearchAssetFragment newInstance() {
        SearchAssetFragment fragment = new SearchAssetFragment();
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_search_asset, container, false);

        ButterKnife.bind(this, view);
        userService = APIProperties.getUserService();

        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

        // The method to retrieve the data from the DB and set the recycler view adapter
        getAsset();

        refresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                getAsset();
            }
        });


        return view;
    }

    private void showCreateDialog(){
        // creating a dialog
    }

    private void showProgressBar(){
        // showing a progress bar
    }

    private void hideProgressBar(){
        // hiding a progress bar
    }

    // The method to retrieve the data from the DB and set the recycler view adapter
    private void getAsset(){
        showProgressBar();
        Call<ResponseIndex<Asset>> call = userService.indexFixed(Header.auth, Header.accept);
        call.enqueue(new Callback<ResponseIndex<Asset>>() {
            @Override
            public void onResponse(Call<ResponseIndex<Asset>> call, Response<ResponseIndex<Asset>> response) {
                if(response.isSuccessful()){
                    int total = response.body().getTotal();
                    Log.i(TAG, "onResponse: total " + total);

                    // Initializing the adapter and set it to the recycler view
                    ArrayList<Asset> rows = response.body().getRows();
                    adapter = new AssetsAdapter(rows, getActivity(), userService, listener);
                    recyclerView.setAdapter(adapter);

                }
                else{
                    Log.i(TAG, "onResponse: else");
                }
                hideProgressBar();
                refresh.setRefreshing(false);
            }

            @Override
            public void onFailure(Call<ResponseIndex<Asset>> call, Throwable t) {
                Log.e(TAG, "onFailure: " + t.getMessage() );
            }
        });
    }
}

Я не уверен, что я сделал неправильно или как это исправить, любой ответ будет оценен. Спасибо.

- Правка-- Класс AssetsAdapter:

public class AssetsAdapter extends RecyclerView.Adapter<AssetsAdapter.ItemHolder> implements Filterable{
    private static final String TAG = "AssetsAdapter";

    private OnButtonClickListener listener;

    private ArrayList<Asset> listData;
    private ArrayList<Asset> listDataFull;
    private Context activityContext;
    private UserService userService;

    private MaterialDialog dialog;

    public AssetsAdapter(ArrayList<Asset> listData, Context activityContext, UserService userService, OnButtonClickListener listener) {
        this.listData = listData;
        listDataFull = new ArrayList<>(listData);
        this.activityContext = activityContext;
        this.userService = userService;
        this.listener = listener;
    }

    public AssetsAdapter(Context activityContext) {
        this.activityContext = activityContext;
    }

    public void setListData(ArrayList<Asset> listData) {
        this.listData = listData;
        notifyDataSetChanged();
    }

    @NonNull
    @Override
    public ItemHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.layout_item_assets, parent, false);
        return new ItemHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ItemHolder holder, final int position) {
        // holder.iv_asset.setImageDrawable(); On progress

        holder.tv_name.setText(listData.get(position).getName());
        holder.tv_manufacturer.setText(listData.get(position).getAsset_id());
        holder.tv_quantity.setText(listData.get(position).getPurchase_cost());
        //holder.tv_status.setText(listData.get(position).getModel_no()); // Still on Progress

        holder.btn_delete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                listener.showDeleteDialog(listData.get(position).getId());
            }
        });

        holder.btn_edit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //Toast.makeText(activityContext, "Edit", Toast.LENGTH_SHORT).show();
                listener.showEditDialog(listData.get(position));
            }
        });
    }

    @Override
    public int getItemCount() {
        if(listData.isEmpty()) return 0;
        else return listData.size();
    }

    @Override
    public Filter getFilter() {
        return dataFilter;
    }

    private Filter dataFilter = new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence charSequence) {
            ArrayList<Asset> filteredList = new ArrayList<>();

            if(charSequence == null || charSequence.length() == 0){
                filteredList.addAll(listDataFull);
            }
            else{
                String filterPattern = charSequence.toString().toLowerCase().trim();

                for(Asset item : listDataFull){
                    if(item.getName().toLowerCase().contains(filterPattern)){
                        filteredList.add(item);
                    }
                }
            }

            FilterResults results = new FilterResults();
            results.values = filteredList;

            return results;
        }

        @Override
        protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
            listData.clear();
            listData.addAll((List) filterResults.values);
            notifyDataSetChanged();
        }
    };

    public class ItemHolder extends RecyclerView.ViewHolder{
        private ImageView iv_asset;

        private TextView tv_name;
        private TextView tv_manufacturer;
        private TextView tv_quantity;
        private TextView tv_status;

        private ImageButton btn_edit;
        private ImageButton btn_delete;

        public ItemHolder(View itemView) {
            super(itemView);

            iv_asset = itemView.findViewById(R.id.iv_asset);

            tv_name = itemView.findViewById(R.id.tv_name);
            tv_manufacturer = itemView.findViewById(R.id.tv_manufacturer);
            tv_quantity = itemView.findViewById(R.id.tv_quantity);
            tv_status = itemView.findViewById(R.id.tv_status);

            btn_edit = itemView.findViewById(R.id.btn_edit);
            btn_delete = itemView.findViewById(R.id.btn_delete);
        }
    }

    public interface OnButtonClickListener {
        void showDeleteDialog(final int id);
        void showEditDialog(Asset asset);
    }

}

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019

Во-первых, инициализируйте класс модели и адаптер и подключите его к программе восстановления, а затем получите данные после получения данных, поместите методы notifydatasetchanged () или notifydatainserted (), я думаю, что это должно работать,

0 голосов
/ 11 апреля 2019

пожалуйста, инициализируйте адаптер в методе oncreateview фрагмента и установите адаптер в recycleview

adapter = new AssetsAdapter(rows, getActivity(), userService, listener);
                    recyclerView.setAdapter(adapter);
  recyclerView.setAdapter(adapter);

после получения ответа от API вы можете обновить адаптер.пожалуйста, укажите
этот вопрос

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...