首页 > 解决方案 > 使用改造检索数据时如何修复回收站视图不会附加适配器

问题描述

我正在创建一个可以从我自己的数据库中检索数据的应用程序。我正在使用 Retrofit 连接我的 API。我正在创建一个底部导航活动,所以我可以向它添加一些片段。我正在使用 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);
    }

}

标签: androidandroid-recyclerview

解决方案


首先,初始化模型类和适配器并附加到recyclerview,然后在检索数据后放入notifydatasetchanged()或notifydatainserted()方法获取数据,我认为它应该可以工作,


推荐阅读