我正在聊天应用程序上使用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>
任何人都可以帮我找到导致此错误的原因吗?
答案 0 :(得分:0)
如果您在此处查看RecycleView的源代码:
“错误”消息只是意味着当父级调用视图的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;
}
它可以帮助你试试这个