获取错误没有连接适配器;跳过布局

时间:2018-04-24 04:04:55

标签: android android-recyclerview recycler-adapter

我正在聊天应用程序上使用firebase创建一个片段,但是在片段中我收到此错误

04-24 09:26:44.602 3554-3554/snowfox.nightshades E/RecyclerView: No adapter attached; skipping layout
04-24 09:26:44.655 3554-3554/snowfox.nightshades I/Choreographer: Skipped 32 frames!  The application may be doing too much work on its main thread.
04-24 09:26:44.825 3554-3554/snowfox.nightshades W/art: Before Android 4.1, method int android.support.v7.widget.DropDownListView.lookForSelectablePosition(int, boolean) would have incorrectly overridden the package-private method in android.widget.ListView
04-24 09:26:44.915 3554-3554/snowfox.nightshades E/RecyclerView: No adapter attached; skipping layout

并且在recyclerview中没有显示任何内容。我无法理解为什么即使在使用“chatList_rv.setAdapter(adapter);”

之后我也会收到此错误

这是我的代码

public class fragment_chat extends Fragment {

    ArrayList<Chats_class> chatList;
    RecyclerView chatList_rv;
    LinearLayoutManager layoutManager;
    RecyclerView.Adapter adapter;
    DatabaseReference databaseRef, rootRef;
    SharedPreferences prefs,prefs_database;

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

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

    }

    @Override
    public void onResume() {
        super.onResume();

    }

    @Override
    public View onCreateView(
            @NonNull LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view      = inflater.inflate(R.layout.fragment_chat_home, container, false);
        chatList       = new ArrayList<>();
        chatList_rv    = view.findViewById(R.id.chat_list);
        layoutManager  = new LinearLayoutManager(this.getActivity());
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        adapter        = new Chat_Messages_Adapter(chatList, this.getContext());
        chatList_rv.setLayoutManager(layoutManager);
        chatList_rv.setAdapter(adapter);
        prefs          = getContext().getSharedPreferences(getString(R.string.USER_DATA), MODE_PRIVATE);
        prefs_database = getContext().getSharedPreferences(getString(R.string.USER_CHAT_DATA), MODE_PRIVATE);
        rootRef        = FirebaseDatabase.getInstance().getReference();
        databaseRef    = rootRef.child("CHAT_LISTS").child(prefs.getString("uid", "error"));
        chatList       = getList();
        databaseRef.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                String info = dataSnapshot.getValue(String.class);
                String last_c = info.substring(info.indexOf("#") + 1);
                int time;
                try {
                    time = Integer.parseInt(info.substring(0, info.indexOf("#")));
                }
                catch (Exception ignore) {
                    time = 0;
                }
                getUserInfo_andSaveItToArrayList(dataSnapshot.getKey(),last_c,time);

            }

            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {

            }

            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {

            }

            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
        return view;
    }

    private ArrayList<Chats_class> getList() {
        Gson gson = new Gson();
        ArrayList<Chats_class> productFromShared;
        String jsonPreferences = prefs_database.getString(getString(R.string.USER_CHAT_HISTORY_ARRAY_LIST), "");

        Type type = new TypeToken<ArrayList<Chats_class>>() {}.getType();
        productFromShared = gson.fromJson(jsonPreferences, type);

        return productFromShared;

    }

    void getUserInfo_andSaveItToArrayList(final String uid, final String lastMsg, final int time) {
        rootRef.child("USERS").child(uid).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                UserData ud = dataSnapshot.getValue(UserData.class);
                Chats_class c = new Chats_class(ud.getIconID(),ud.getHasPic(),ud.getName(),lastMsg, uid, time);
                sync_database(c);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }
    void sync_database(Chats_class chats) {
        if(chatList != null) {
            boolean found = false;
            for (int i = 0; i < chatList.size(); i++) {
                if (chatList.get(i).getUid().equals(chats.getUid()))
                    if (chatList.get(i).equals(chats)) {
                        chatList.add(i, chats);
                        adapter.notifyItemChanged(i);
                        found = true;
                        break;
                    }
            }
            if(!found) {
                chatList.add(chats);
                adapter.notifyItemInserted(chatList.size() -1);
            }
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        SharedPreferences.Editor prefsEditor = prefs_database.edit();
        Gson gson = new Gson();
        String json = gson.toJson(chatList);
        prefsEditor.putString(getString(R.string.USER_CHAT_HISTORY_ARRAY_LIST), json);
        prefsEditor.apply();
    }
}

我的布局文件

<?xml version="1.0" encoding="utf-8"?>

<android.support.v7.widget.RecyclerView android:padding="16dp"
    android:id="@+id/chat_list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android">

</android.support.v7.widget.RecyclerView>

任何人都可以帮我找到导致此错误的原因吗?

2 个答案:

答案 0 :(得分:0)

如果您在此处查看RecycleView的源代码:

https://android.googlesource.com/platform/frameworks/support/+/247185b98675b09c5e98c87448dd24aef4dffc9d/v7/recyclerview/src/android/support/v7/widget/RecyclerView.java

“错误”消息只是意味着当父级调用视图的onLayout方法时(通常在充气一段时间后),它没有适配器。这不是一个真正的问题

我怀疑你根本没有数据。您确定要显示正确的数据吗?

还要确保在操作RecycleView适配器时您处于UI线程中,因此您也可以检查它。

答案 1 :(得分:0)

试试这个

Java类

在此之前创建如下:

   private RecyclerView recycler_view;
    HomeAdapter adapter;

放入onCreate方法,如下所示:

recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
adapter = new HomeAdapter ( artists , R.layout.list_item ,getApplicationContext());
recyclerView.setAdapter(adapter);

xml布局

<android.support.v7.widget.RecyclerView
        android:id="@+id/RecyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

适配器类

public class HomeAdapter extends BaseAdapter {
private Context mContext;
private final String[] web;
private final int[] Imageid;

public HomeAdapter(Context c,String[] web,int[] Imageid ) {
    mContext = c;
    this.Imageid = Imageid;
    this.web = web;
}

@Override
public int getCount() {
    // TODO Auto-generated method stub
    return web.length;
}

@Override
public Object getItem(int position) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    View grid;
    LayoutInflater inflater = (LayoutInflater) mContext
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    if (convertView == null) {

        grid = new View(mContext);
        grid = inflater.inflate(R.layout.recyclerview_home_layout, null);
        TextView textView = (TextView) grid.findViewById(R.id.company_name);
        ImageView imageView = (ImageView)grid.findViewById(R.id.company_img);
        textView.setText(web[position]);

        imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent in =new Intent(mContext, ServiceActivity.class);
           //                in.putExtra("prop",new Gson().toJson(list.get(position)));
                mContext.startActivity(in);
            }
        });
        imageView.setImageResource(Imageid[position]);
    } else {
        grid = (View) convertView;
    }

    return grid;
}

它可以帮助你试试这个