2017-12-14 8 views
2

, 각 행 표시 4 문자열에서 일부 사용자 정보를 나열하려고합니다.사용자 지정 어댑터 ListView 오류

문자열의 길이는 Firebase입니다.

나는 항상 약간의 오류가 발생합니다. 오류의 원인이나 다른 해결책에 대해 알고 싶습니다.

내 코드입니다 :

MainActivity

public class SearchActivity extends AppCompatActivity { 

    private ListView mListView; 
    //public ArrayList<String> mUser = new ArrayList<>(); 
    private String userID; 
    private String Lat; 
    private String Lng; 
    private Button mRefresh; 
    private String Name; 
    private String Birthday; 
    private String Gender; 
    private String Email; 

    private FirebaseAuth mAuth = FirebaseAuth.getInstance(); 
    private FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance(); 
    private DatabaseReference DatabaseReference = firebaseDatabase.getReference(); 

    //private DatabaseReference DatabaseReference = firebaseDatabase.getReference().child("Users/"); 
    //private DatabaseReference CoordenateReference = firebaseDatabase.getReference().child("Coordenate/"); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_search); 


     mListView = findViewById(R.id.listViewSearch); 

     FirebaseUser user = mAuth.getCurrentUser(); 
     userID = user.getUid(); 
     mRefresh = findViewById(R.id.buttonRefresh); 


     mRefresh.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       DatabaseReference.addValueEventListener(new ValueEventListener() { 
        @Override 
        public void onDataChange(DataSnapshot dataSnapshot) { 
         listClean(); 
         FirebaseUser user = mAuth.getCurrentUser(); 
         userID = user.getUid(); 
         Lat = dataSnapshot.child("Users").child(userID).child("Coordenates/Rute/Lat").getValue(String.class); 
         Lng = dataSnapshot.child("Users").child(userID).child("Coordenates/Rute/Lng").getValue(String.class); 
         DataSnapshot dS = dataSnapshot.child("Coordenate").child(Lat).child(Lng); 

         for(DataSnapshot Ds : dS.getChildren()) { 
          Object key = Ds.getKey(); 
          String StringKey = String.valueOf(key); 
          getname(StringKey); 
          //mUser.add(getName(StringKey)); 
          //mUser.add(Name); 
         } 

        } 

        @Override 
        public void onCancelled(DatabaseError databaseError) { 
         Toast.makeText(SearchActivity.this,"Error 404",Toast.LENGTH_SHORT).show(); 

        } 
       }); 
      } 
     }); 



    } 
    private void getname(String ID){ 


     final String IDfinal = ID; 
     Toast.makeText(SearchActivity.this,ID,Toast.LENGTH_SHORT).show(); 
     DatabaseReference.addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       Name = dataSnapshot.child("Users").child(IDfinal).child("name").getValue(String.class); 
       Email = dataSnapshot.child("Users").child(IDfinal).child("email").getValue(String.class); 
       Gender = dataSnapshot.child("Users").child(IDfinal).child("gender").getValue(String.class); 
       Birthday = dataSnapshot.child("Users").child(IDfinal).child("data_birth").getValue(String.class); 

       list(); 


       Toast.makeText(SearchActivity.this,Name,Toast.LENGTH_SHORT).show(); 

      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
       Toast.makeText(SearchActivity.this,"Error 404",Toast.LENGTH_SHORT).show(); 

      } 
     }); 
    } 

    private void list(){ 
     //final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mUser); 
     //mListView.setAdapter(new customAdapter(this,new String[]{Name})); 
     //mUser.add(Name); 
     //arrayAdapter.notifyDataSetChanged(); 
     setContentView(R.layout.activity_search); 
     List<UserInformation> userInformationsList = new ArrayList<>(); 
     UserInformation userInformation = new UserInformation(Name,Email,Gender,Birthday); 
     userInformationsList.add(userInformation); 
     customAdapter customAdapterIntent= new customAdapter((ValueEventListener) this,R.layout.userslist,userInformationsList); 
     mListView.setAdapter(customAdapterIntent); 
    } 
} 

이 userslist.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <TextView 
     android:id="@+id/textNameList" 
     android:textSize="25dp" 
     android:textAlignment="textStart" 
     android:text="Name" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:gravity="start" 
     android:layout_margin="10dp"/> 

    <TextView 
     android:id="@+id/textEmailList" 
     android:textSize="15dp" 
     android:textAlignment="textStart" 
     android:text="Age" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:gravity="start" 
     android:layout_margin="10dp"/> 

    <TextView 
     android:id="@+id/textBirthdayList" 
     android:textSize="15dp" 
     android:textAlignment="textStart" 
     android:text="Birthday" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:gravity="start" 
     android:layout_margin="10dp"/> 

    <TextView 
     android:id="@+id/textGenderList" 
     android:textSize="15dp" 
     android:textAlignment="textStart" 
     android:text="gender" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:gravity="start" 
     android:layout_margin="10dp"/> 

인이

01 Userinformation.java입니다
public class UserInformation { 


    private static String Name; 
    private static String Gender; 
    private static String Email; 
    private static String Birthday; 

    public UserInformation(String Name,String Gender,String Email,String Birthday){ 
     this.Birthday=Birthday; 
     this.Email=Email; 
     this.Gender=Gender; 
     this.Name=Name; 
    } 

    public static String getName(){return Name;} 
    public static String getEmail(){return Email;} 
    public static String getGender(){return Gender;} 
    public static String getBirthday(){return Birthday;} 

} 

이 23,516,이것은

E/AndroidRuntime: FATAL EXCEPTION: main 
       Process: com.example.enrik.afrodita, PID: 2629 
       java.lang.ClassCastException: 
com.example.enrik.afrodita.SearchActivity cannot be cast to 
com.google.firebase.database.ValueEventListener 
        at 
com.example.enrik.afrodita.SearchActivity.list(SearchActivity.java:130) 
        at 

com.example.enrik.afodita.SearchActivity.access$1100(SearchActivity.java:24) 
        at 

com.example.enrik.adita.Searchivity$2.onDataChange(SearchActivity.java:106) 
        at com.google.android.gms.internal.zzdtn.zza(Unknown Source) 
        at com.google.android.gms.internal.zzdvi.zzbur(Unknown Source) 
        at com.google.android.gms.internal.zzdvo.run(Unknown Source) 
        at android.os.Handler.handleCallback(Handler.java:751) 
        at android.os.Handler.dispatchMessage(Handler.java:95) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.app.ActivityThread.main(ActivityThread.java:6119) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 
+0

왜 당신은 너무 많은 ValueEventListener' –

답변

3

당신은 ContextValueEventListener 그렇게

public customAdapter(/*ValueEventListener*/ Context context, int layoutResource, 
List<UserInformation> userInformationsList) { 
    super(context, layoutResource, userInformationsList); 

} 

으로 어댑터를 변경하지 통과로 캐스트를 제거해야 오류를입니다

public class customAdapter extends ArrayAdapter<UserInformation> { 




    public customAdapter(ValueEventListener context, int layoutResource, 
    List<UserInformation> userInformationsList) { 
     super((Context) context, layoutResource, userInformationsList); 

    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     View view = convertView; 

     if (view == null) { 
      LayoutInflater layoutInflater = LayoutInflater.from(getContext()); 
      view = layoutInflater.inflate(R.layout.userslist, null); 
     } 

     UserInformation userInformation = getItem(position); 

     if (userInformation != null) { 
      TextView Name = (TextView) view.findViewById(R.id.textNameList); 
      //name.setText(name[position]); 
      TextView email = (TextView) view.findViewById(R.id.textEmailList); 
      //email.setText(Email[position]); 
      TextView gender = (TextView) view.findViewById(R.id.textGenderList); 
      //gender.setText(Gender[position]); 
      TextView birthday = (TextView) view.findViewById(R.id.textBirthdayList); 
      //birthday.setText(Birthday[position]); 

      if (Name != null) { 
       Name.setText(UserInformation.getName()); 
      } 
      if (email != null) { 
       email.setText(UserInformation.getEmail()); 
      } 
      if (gender != null) { 
       gender.setText(UserInformation.getGender()); 
      } 
      if (birthday != null) { 
       birthday.setText(UserInformation.getBirthday()); 
      } 
     } 

     return view; 
    } 
} 

어댑터입니다 잘

01 23,516,
customAdapter customAdapterIntent= new customAdapter(/*(ValueEventListener)*/ this,R.layout.userslist,userInformationsList); 
context 당신이, 당신은 두 번을하고 list 방법에서 setContentView(R.layout.activity_search);을 제거 또한 getContext()

과를 호출 할 때 리소스에 액세스 할 수 layoutinflater 또는 어댑터에 필요한

, 그래서 필요가 없습니다


Thank so much, I did as you said and It works but it only list the last user's information

모든 사용자를 가져와에 추가해야합니다.현재 최종 사용자의 정보를 문자열 값으로 저장하고이 값을 사용하여 단일 사용자 객체 목록을 만들기 때문에.

// outside onCreate 
List<UserInformation> users = new ArrayList<>(); 


mRefresh.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 

     DatabaseReference.addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       listClean(); 
       FirebaseUser user = mAuth.getCurrentUser(); 
       userID = user.getUid(); 
       Lat = dataSnapshot.child("Users").child(userID).child("Coordenates/Rute/Lat").getValue(String.class); 
       Lng = dataSnapshot.child("Users").child(userID).child("Coordenates/Rute/Lng").getValue(String.class); 
       DataSnapshot dS = dataSnapshot.child("Coordenate").child(Lat).child(Lng); 

       for(DataSnapshot Ds : dS.getChildren()) { 
        Object key = Ds.getKey(); 
        String StringKey = String.valueOf(key); 

        // fetch the user Object based on key and add it to list 
        users.add(lidataSnapshot.child("Users").child(StringKey).getValue(UserInformation.class)); 
       } 
       // now display list with all user information 
       customAdapter customAdapterIntent= new customAdapter(SearchActivity.this, 
                     R.layout.userslist, 
                     users); 
       mListView.setAdapter(customAdapterIntent); 

      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
       Toast.makeText(SearchActivity.this,"Error 404",Toast.LENGTH_SHORT).show(); 

      } 
     }); 
    } 
}); 
+0

감사합니다'에'context' 변환하려는 당신이 말한대로 나는했고 그것은 작동하지만 당신이 이름을 얻을 호출하기 때문에 그것은 단지 EnriqueRamosMuñoz @ 마지막으로 사용자의 정보 –

+0

목록 루프 및 매번 getName에서 단일 사용자 값을 사용하여 새 어댑터를 만들고 있습니다. 응답을 업데이트 한 다음 –

+0

@ EnriqueRamosMuñoz 구현을주의 깊게 읽으십시오. 업데이트를 체크 아웃하면 작동하지 않을 수 있습니다 (메모장 코드). 문제는 당신과 함께 할 수 있습니다. –