Я могу получать данные из Firebase, но не отображаются в RecyclerView и CardView. Вот выкладываю код. Я хочу вывести список телефонных номеров в RecyclerView. Когда я нажимаю кнопку, чтобы отобразить список телефонных номеров, он ничего не отображает, и приложение останавливается.
Здесь исключение происходит в logcat:
10-09 17:52:37.542 20803-20803/com.jk.login E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.jk.login, PID: 20803
android.view.InflateException: Binary XML file line #21: Error inflating class de.hdodenhof.circleimageview.CircleImageView
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:757)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:809)
at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
at com.jk.login.MembersAdaptor.onCreateViewHolder(MembersAdaptor.java:38)
at com.jk.login.MembersAdaptor.onCreateViewHolder(MembersAdaptor.java:19)
at android.support.v7.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:6794)
at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5975)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5858)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5854)
at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2230)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1557)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1517)
at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:612)
at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3924)
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3641)
at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:4194)
at android.view.View.layout(View.java:15779)
at android.view.ViewGroup.layout(ViewGroup.java:5069)
at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1077)
at android.view.View.layout(View.java:15779)
at android.view.ViewGroup.layout(ViewGroup.java:5069)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
at android.view.View.layout(View.java:15779)
at android.view.ViewGroup.layout(ViewGroup.java:5069)
at android.support.v7.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:444)
at android.view.View.layout(View.java:15779)
at android.view.ViewGroup.layout(ViewGroup.java:5069)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
at android.view.View.layout(View.java:15779)
at android.view.ViewGroup.layout(ViewGroup.java:5069)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1705)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1559)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1468)
at android.view.View.layout(View.java:15779)
at android.view.ViewGroup.layout(ViewGroup.java:5069)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
at android.view.View.layout(View.java:15779)
at android.view.ViewGroup.layout(ViewGroup.java:5069)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2166)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1916)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1117)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6184)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:773)
at android.view.Choreographer.doCallbacks(Choreographer.java:586)
at android.view.Choreographer.doFrame(Choreographer.java:556)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:759)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5422)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.
MyCircle.java
public class MyCircle extends AppCompatActivity {
RecyclerView recyclerView;
RecyclerView.Adapter adapter
RecyclerView.LayoutManager layoutManager;
FirebaseAuth mAuth;
FirebaseUser user;
ArrayList<Phone> nameList;
String circlememberid;
DatabaseReference userReference;
Phone phone;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate( savedInstanceState );
setContentView( R.layout.activity_my_circle );
recyclerView = findViewById( R.id.recyclerView );
mAuth = FirebaseAuth.getInstance();
user = mAuth.getCurrentUser();
nameList = new ArrayList<>( );
layoutManager = new LinearLayoutManager( this );
recyclerView.setHasFixedSize( true );
recyclerView.setLayoutManager( layoutManager );
userReference = FirebaseDatabase.getInstance().getReference().child("Users");
DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Users").child( user.getPhoneNumber() ).child( "CircleMembers" );
reference.addValueEventListener( new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
nameList.clear();
if (dataSnapshot.exists()) {
for(DataSnapshot dss:dataSnapshot.getChildren()) {
circlememberid = dss.child( "circlememberid" ).getValue(String.class);
userReference.child( circlememberid ).addListenerForSingleValueEvent( new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
phone = dataSnapshot.getValue( Phone.class );
nameList.add( phone );
adapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
} );
adapter = new MembersAdaptor(nameList,getApplicationContext());
recyclerView.setAdapter( adapter );
adapter.notifyDataSetChanged();
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
} );
MembersAdapter.java
public class MembersAdaptor extends RecyclerView.Adapter<MembersAdaptor.MemberViewHolder>{
ArrayList<Phone> nameList;
Context context;
MembersAdaptor(ArrayList<Phone> nameList, Context context){
this.nameList = nameList;
this.context = context;
}
@Override
public int getItemCount() {
return nameList.size();
}
@NonNull
@Override
public MemberViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from( viewGroup.getContext() ).inflate( R.layout.card_layout,viewGroup,false );
MemberViewHolder memberViewHolder = new MemberViewHolder(view,context,nameList );
return memberViewHolder;
}
@Override
public void onBindViewHolder(@NonNull MemberViewHolder memberViewHolder, int i) {
Phone currentUserObj = nameList.get( i );
memberViewHolder.txtName.setText( currentUserObj.phonenumber);
}
public static class MemberViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
TextView txtName;
View view;
Context context;
ArrayList<Phone> nameArrayList;
FirebaseAuth mAuth;
FirebaseUser user;
public MemberViewHolder(@NonNull View itemView, Context context, ArrayList<Phone> nameArrayList) {
super( itemView );
this.context = context;
this.nameArrayList = nameArrayList;
itemView.setOnClickListener( this );
mAuth = FirebaseAuth.getInstance();
user = mAuth.getCurrentUser();
txtName = itemView.findViewById( R.id.item_title ); //want to show circlememberid in this this textview in cardlayout
public void onClick(View v){
Toast.makeText(context,"You have clicked this user",Toast.LENGTH_LONG ).show();
}
}
}
}
}
Phone.java
public class Phone {
public String phonenumber;
public Phone(String phonenumber) {
this.phonenumber = phonenumber;
}
public Phone(){
}
public String getPhonenumber() {
return phonenumber;
}
public void setPhonenumber(String phonenumber) {
this.phonenumber = phonenumber;
}
}
card_layout.xml
<?xml version = "1.0" encoding = "utf-8"?>
<android.support.v7.widget.CardView xmlns:android = "http://schemas.android.com/apk/res/android"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
xmlns:app = "http://schemas.android.com/apk/res-auto"
xmlns:cardview = "http://schemas.android.com/tools"
android:layout_margin = "6dp"
cardview:cardElevation = "3dp"
cardview:cardCornerRadius = "12dp"
cardview:contentPadding = "4dp"
android:foreground = "?selectableItemBackground"
>
<LinearLayout
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:orientation = "vertical"
android:padding = "14dp">
</LinearLayout>
<LinearLayout
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:weightSum = "10"
android:orientation = "horizontal">
<de.hdodenhof.circleimageview.CircleImageView
android:id = "@+id/circleImageView1"
android:layout_width = "0dp"
android:layout_height = "50dp"
android:layout_weight = "2"
android:src = "@drawable/defaultpicture" />
<TextView
android:id = "@+id/item_title"
android:layout_width = "0dp"
android:layout_height = "wrap_content"
android:layout_weight = "7"
android:textStyle = "bold"
android:textSize = "22sp"
android:text = "My User"/>
<ImageView
android:layout_width = "0dp"
android:layout_height = "40dp"
android:layout_weight = "1"
android:src = "@drawable/red_offline"/>
</LinearLayout>
</android.support.v7.widget.CardView>
В этом случае добавьте структуру своей базы данных.
@AlexMamo Я добавил то, что отображается в logcat
В какой именно строке кода возникает эта ошибка? Но это определенно не проблема Firebase.
Когда я пытаюсь показать roundView с помощью textView, появляется эта ошибка. В противном случае теперь отображается список телефонных номеров (с использованием только textview).
покажите пожалуйста свой xml. Похоже, вы использовали стороннюю библиотеку для изображения круга и не предоставили ей правильные параметры
Пожалуйста, также добавьте ваш .XML файл и ответьте с помощью @.
Ошибка возникает, когда я хочу отображать roundImageView и ImageView в cardLayout вместе с textview, в противном случае все работает нормально
@AlexMamo Я добавил card_layout.xml, пожалуйста, посмотрите
@UmarHussain Я добавил xml
вы дали 0 ширину для просмотра изображения круга. попробуйте с некоторым значением, отличным от 0dp
Я не знаю, как работает этот класс CircleImageView, но, как я вижу в вашем коде, он вызывает у вас проблемы. Самый простой способ, который я могу придумать, - использовать Библиотека скольжения для Android.
Поэтому вместо того, чтобы использовать этот пользовательский CircleImageView, просто используйте ImageView, добавьте следующую зависимость:
implementation 'com.github.bumptech.glide:glide:4.7.1'
найдите представление изображения в своей деятельности и используйте следующую строку кода для установки изображения:
Glide.with(context)
.load(yourImage)
.apply(RequestOptions.circleCropTransform())
.into(imageView);
Вот и все!
Что вы имеете в виду под «остановкой приложения»? Если приложение вылетает, есть трассировка стека. Посмотрите это в logcat и добавьте к своему вопросу.