1

データベースとしてfirebaseを使用しています。アクティビティが最初に読み込まれると、私のrecyclerviewは生成されませんが、時には複数のバックプレスでバックプレスアクションの後に生成されます。RecyclerViewアクティビティが読み込まれたときにリストビューが生成されないが、バックボタン(複数のバックプレス上で)を押したときに値が入力される

HomeActivity.java

public class HomeActivity extends AppCompatActivity 
    implements NavigationView.OnNavigationItemSelectedListener { 

//Recycler Contact list variables 
private RecyclerView mContactList; 

//Firebase Variables 

private DatabaseReference rDatabase; 
private FirebaseAuth mAuth; 
private StorageReference mStorageRef; 
private FirebaseAuth.AuthStateListener mAuthListener; 
FirebaseUser user; 
FirebaseRecyclerAdapter<ContactList,ContactListViewHolder> firebaseRecyclerAdapter; 

//Request Contact Constant 
private static final int REQUEST_READ_CONTACTS = 0; 

private Long contactId; 
private Uri downloadUrl = null; 


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


    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    if (Build.VERSION.SDK_INT >= 23) { 
     //do your check here 
     mayRequestContacts(); 
    } 

    //initialize Recycler view 
    mContactList = (RecyclerView) findViewById(R.id.contact_list); 
    mContactList.setHasFixedSize(true); 
    mContactList.setLayoutManager(new LinearLayoutManager(this)); 

    //initialize UI elements 
    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
    View headView = navigationView.getHeaderView(0); 
    TextView uName = (TextView)headView.findViewById(R.id.userName); 
    ImageView dPhoto = (ImageView)headView.findViewById(R.id.imageView); 
    TextView mEmail = (TextView)headView.findViewById(R.id.uEmail); 

    //initialize Firebase variables 
    mStorageRef = FirebaseStorage.getInstance().getReference(); 
    user = FirebaseAuth.getInstance().getCurrentUser(); 
    rDatabase = FirebaseDatabase.getInstance().getReference().child("users").child(user.getUid()).child(user.getDisplayName()).child("contacts"); 
    mAuth = FirebaseAuth.getInstance(); 
    mAuthListener = new FirebaseAuth.AuthStateListener() { 
     @Override 
     public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
      FirebaseUser user = firebaseAuth.getCurrentUser(); 
      if (user == null) { 
       // user auth state is changed - user is null 
       // launch login activity 
       startActivity(new Intent(HomeActivity.this, LoginActivity.class)); 
       finish(); 
      } 
     } 
    }; 

    if (user != null) { 
     // Name, email address, and profile photo Url 
     String name = user.getDisplayName(); 
     String email = user.getEmail(); 
     Uri photoUrl = user.getPhotoUrl(); 
     System.out.println(name); 
     if(name!=null) { 
      uName.setText(name); 
      mEmail.setText(email); 
     } 
     if(photoUrl!=null){ 


      Picasso.with(this) 
        .load(photoUrl) 
        .into(dPhoto); 
     } 

     // The user's ID, unique to the Firebase project. Do NOT use this value to 
     // authenticate with your backend server, if you have one. Use 
     // FirebaseUser.getToken() instead. 

    } 

    //initialize FirebaseRecyclerAdapter 
    firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<ContactList, ContactListViewHolder>(

      ContactList.class, 
      R.layout.contact_list_row, 
      ContactListViewHolder.class, 
      rDatabase 

    ) { 
     @Override 
     protected void populateViewHolder(ContactListViewHolder viewHolder, ContactList model, int position) { 

      viewHolder.setName(model.getName()); 
      viewHolder.setPhone(model.getPhone()); 

     } 

    }; 

    mContactList.setAdapter(firebaseRecyclerAdapter);  //set adapter for recycler view 

    setSupportActionBar(toolbar); //instantiate toolbar 

    //initialize floating action button 
    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Snackbar.make(view, "Replace with add contact or agenda", Snackbar.LENGTH_LONG) 
        .setAction("Action", null).show(); 
     } 
    }); 

    //initialize navigation drawer 
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle(
      this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
    drawer.addDrawerListener(mDrawerToggle); 
    mDrawerToggle.syncState(); 


    navigationView.setNavigationItemSelectedListener(this); //listen if any item selected 




} 

@Override 
public void onBackPressed() { 
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    if (drawer.isDrawerOpen(GravityCompat.START)) { 
     drawer.closeDrawer(GravityCompat.START); 
    } else { 
     super.onBackPressed(); 
    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 

    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 


    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 



    return super.onOptionsItemSelected(item); 
} 

@SuppressWarnings("StatementWithEmptyBody") 
@Override 
public boolean onNavigationItemSelected(@NonNull MenuItem item) { 
    // Handle navigation view item clicks here. 
    int id = item.getItemId(); 

    if (id == R.id.nav_importContacts) { 
     // Handle the Import Contacts Action 

     final ProgressDialog ringProgressDialog = ProgressDialog.show(HomeActivity.this, "Please Wait", "Importing Contacts", true); 

     ringProgressDialog.setCancelable(true); 

     new Thread(new Runnable() { 

      @Override 

      public void run() { 

       try { 


        //user = FirebaseAuth.getInstance().getCurrentUser(); //Get the currently logged in user information 
        //Uid = user.getUid(); //Get User ID 
        //UName = user.getDisplayName(); 

        //Initialize cursor to import contacts 
        ContentResolver cr = getContentResolver(); 
        Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, 
          null, null, null, null); 

        assert cur != null; 
        if (cur.getCount() > 0) { 
         while (cur.moveToNext()) { 

          //Get current Contact ID 
          contactId=cur.getLong(cur.getColumnIndex(ContactsContract.Contacts._ID)); 

          //Get current Contact Name 
          String cName = cur.getString(cur.getColumnIndex(
            ContactsContract.Contacts.DISPLAY_NAME)); 

          //Get Current Contact URI 
          Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactId); 

          //Get Current Contact Photo Uri 
          Uri displayPhotoUri=null; 
          if(Uri.withAppendedPath(contactUri, ContactsContract.Contacts.Photo.DISPLAY_PHOTO)!=null){ 
           displayPhotoUri = Uri.withAppendedPath(contactUri, ContactsContract.Contacts.Photo.DISPLAY_PHOTO); 

          } 
          try { 
           AssetFileDescriptor fd = 
             getContentResolver().openAssetFileDescriptor(displayPhotoUri, "r"); 

          } catch (IOException e) { 
           // return null; 
          } 

          if(contactId!=null && cName!=null && displayPhotoUri!=null){ 

           boolean flag = true; 

           Cursor emailCursor = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, 
             null, 
             ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", new String[] {contactId.toString()}, null); 

           if(cur.getInt(cur.getColumnIndex(
             ContactsContract.Contacts.HAS_PHONE_NUMBER)) <=0){ 
            flag = false; 
           } 
           else{ 

            //Import Contact Photo 

            StorageReference filepath = mStorageRef.child("users/"+user.getUid()+"/"+contactId+"/contactPhoto").child(displayPhotoUri.getLastPathSegment()); 
            filepath.putFile(displayPhotoUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() { 


             @Override 
             public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { 

              // System.out.println(photoUri.toString()); //debug point 

              downloadUrl = taskSnapshot.getDownloadUrl(); 
              rDatabase.child(contactId.toString()).child("photoUrl").setValue(downloadUrl.toString()); 


             } 
            }).addOnFailureListener(new OnFailureListener() { 
             @Override 
             public void onFailure(@NonNull Exception e) { 

             } 
            }); 

            //Import Contact Email ID if Any 
            assert emailCursor != null; 
            while (emailCursor.moveToNext()) 
            { 
             String cEmail = emailCursor.getString(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); 
             int type = emailCursor.getInt(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); 
             rDatabase.child(contactId.toString()).child("email").setValue(cEmail); 
            } 
            emailCursor.close(); 

            Cursor pCur = cr.query(
             ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
             null, 
             ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", 
             new String[]{contactId.toString()}, null); 
            while (pCur.moveToNext()) { 
            String phoneNo = pCur.getString(pCur.getColumnIndex(
              ContactsContract.CommonDataKinds.Phone.NUMBER)); 
            //Import Contact Phone No. 
            rDatabase.child(contactId.toString()).child("phone").setValue(phoneNo); 
            //Import Contact Name 
             rDatabase.child(contactId.toString()).child("name").setValue(cName); 

            } 
           pCur.close(); 

          }} 

         } 
        } cur.close(); 

        Thread.sleep(10000); 

       } catch (Exception e) { 

        return; 

       } 

       ringProgressDialog.dismiss(); 

      } 

     }).start(); 




    } else if (id == R.id.nav_logout) { 

     mAuth.signOut(); //Log out user method 

    } else if (id == R.id.nav_send) { 

    } 

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    drawer.closeDrawer(GravityCompat.START); 
    return true; 
} 

//Method to request contacts (Required for API 23 and greater) 
private boolean mayRequestContacts() { 
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { 
     return true; 
    } 
    if (checkSelfPermission(READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) { 
     return true; 
    } 
    if (shouldShowRequestPermissionRationale(READ_CONTACTS)) { 
     if (checkSelfPermission(Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) { 
      Toast.makeText(HomeActivity.this, "Permission Granted", 
        Toast.LENGTH_LONG).show(); 
      //File write logic here 
      return true; 
     } 
    } else { 

     requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS); 
    } 
    return false; 
} 

public void onStart() { 
    super.onStart(); 
    mAuth.addAuthStateListener(mAuthListener); //Listen to current user Login status 

    mContactList.setAdapter(firebaseRecyclerAdapter); //Set adapter for contact list recycler view 

} 

@Override 
public void onStop() { 
    super.onStop(); 
    if (mAuthListener != null) { 
     mAuth.removeAuthStateListener(mAuthListener); 
    } 
} 

//ViewHolder for ContactList Recycler View 
public static class ContactListViewHolder extends RecyclerView.ViewHolder{ 

    View mView; 
    TextView contact_Name; 
    TextView contact_Phone; 

    public ContactListViewHolder(View itemView) { 
     super(itemView); 

     mView = itemView; 
    } 

    public void setName(String name){ 

     contact_Name = (TextView) itemView.findViewById(R.id.ContactName); 
     contact_Name.setText(name); 
    } 

    public void setPhone(String phone){ 

     contact_Phone = (TextView) itemView.findViewById(R.id.ContactPhone); 
     contact_Phone.setText(phone); 
    } 
} 

}

アダプタクラス

public class ContactList { 

private String name; 
private String phone; 

public ContactList(){} 

public ContactList(String name, String phone) { 
    this.name = name; 
    this.phone = phone; 
} 

public String getPhone() { 
    return phone; 
} 

public void setPhone(String phone) { 
    this.phone = phone; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

}

content_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/content_main" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
app:layout_behavior="@string/appbar_scrolling_view_behavior" 
tools:context="neeti.contactapp.HomeActivity" 
tools:showIn="@layout/activity_main"> 

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

</RelativeLayout> 

contact_list_row.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:focusable="true" 
android:paddingLeft="16dp" 
android:paddingRight="16dp" 
android:paddingTop="10dp" 
android:paddingBottom="10dp" 
android:clickable="true" 
android:background="?android:attr/selectableItemBackground" 
android:orientation="vertical"> 

<TextView 
    android:id="@+id/ContactName" 
    android:textColor="@color/ContactName" 
    android:textSize="16dp" 
    android:textStyle="bold" 
    android:layout_alignParentTop="true" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" /> 

<TextView 
    android:id="@+id/ContactPhone" 
    android:layout_below="@id/ContactName" 
    android:textColor="@color/ContactPhone" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" /> 


</RelativeLayout> 

答えて

0

あなたはfirebaseRecyclerAdapter.notifyDataSetChanged(); を逃し、その後としてアダプタを設定している:あなたの提案のための

mContactList.setAdapter(firebaseRecyclerAdapter); 
+1

ありがとう! –

関連する問題