31 Ocak 2019 Perşembe

REST SERVICE

Herkese merhaba, Bu yazimda Rest nedir / Rest istegi nasil atilir / istek nasil karsilanir bu gibi sorulara cevap vermeye
calisacagim.
Rest server ile client arasinda hizli ve basit iletisimi saglayan bir servistir. Servis yonelimli mimarilerde veri transferini
saglar. Http protocollerini kullanir ve minimum veriyi tasidigi icin digerlerine gore daha hizlidir. RestFul servisler ise
reste uygun yazilan servislerdir.

Rest stateless dir. Yani bilgi saklamaz. (All requests are standalone, no knowledge of previous requests)

Rest te Crud islemleri icin 4 http request tipi kullanilir.
 Create icin POST, read icin GET, update icin PUT, delete icin DELETE request methodlar kullanilir.

Rest requestleri gondermek ve response almak icin Postman kullanacagiz. Postman, http request gondermemizi saglayan bir http
client tir.
Postman in uygun versiyonunu bilgisayariniza gore asagidaki linkten indirebilirsiniz.

https://www.getpostman.com/downloads/

Rest istegi atabilmek icin tek ihtiyacimiz olan URL dir. Oncelikle URL ile URI farkina bakalim.


Resimde de gordugumuz gibi adresin tamami URL oluyor. Bu url uygulamanin ilk 50 kullanicisini cekmek icindir.

GET te parametreler request e query param olarak eklenebilirken POST ta eklenemez. Request body icinde gider.

Traditional yontemlerde kullanici bilgisini cekmek icin

GET /getUserDetailsServlet?userId=1

seklinde bir istek atariz. User id 1 olan kullanicinin bilgilerini getirir. Geleneksel yontemlerde fiil kullanilir. get... seklinde

Rest ile ise :

GET /users/1

Burada sadece nereden cekecegini isim olarak veririz.

Traditional yontemlerde kullanici update etmek icin

POST /updateUserDetailsServlet{
"firstName" :"gamze",
"lastName" : "sen",
"userId" : "1"
}

seklinde bir istek atariz. User id 1 olan kullanicinin bilgilerini istekteki degerlerle gunceller.

Rest ile ise :

PUT /users/1 {
"firstName" :"gamze",
"lastName" : "sen",
}

seklinde yapariz.

HTTP METHODS

RestFul

POST : create user /users/1
GET : read user details /users/1
PUT : update user details /users/1
DELETE : delete user details /users/1

gordugumuz gibi 4 request te birbirine benziyor. O halde bunlari nasil ayirt ediyorsak dersek Http methoduna gore deriz.
Istekte hangi method oldugu da gonderilir.

Rest i java ile kullanmak icin Spring Tools 4 for Eclipse indirelim. http://spring.io/tools

pom.xml : Dependency leri eklemek icin kullanilan dosya. Ornegin mysql db kullanacaksak pom.xml e mysql dependency eklemeliyiz.

application.properties : db accessi burada configure edebiliriz.

Olusturulan classin uzerine @RestController annotion yazarak gelen Rest requestleri yakalamasini saglariz.

@RequestMapping: Http requestler belli bir url e gonderilir demistik. O url de ilgili islemler yapilir.

@RequestMapping("users") yazmamiz o request in url ni su hale getirir: http://localhost:8080/users

Anlamindan da cikarabiliriz. Gelen request i maplemis oluyoruz.

Get icin Ornek bir controller su sekilde olabilir.

@RestController
@RequestMapping("kullanicilar") //http://localhost:8080/kullanicilar
public class UserController {

@GetMapping
public String getUser() {
return "get user cagrildi";
}

}





Postman den resimdeki gibi GET requesti gonderdigimizde response umuzu aliriz.
Simdi gercekteki GET requestini dusunelim. Bir userId verilir ve o user a ait bilgiler cekilir.Yani request su sekilde
olmali.

http://localhost:8080/kullanicilar/1

Buradaki 1 userId dir ve Path e eklenmistir. path="/{userId}" demeliyiz. UserId parametre olarak gonderilmistir.O yuzden
PathVariable diyerek alabiliriz.

@GetMapping(path="/{userId}")
public String getUser(@PathVariable String userId) {
return "get user cagrildi userID: "+ userId;
}



Simdi ise suna bakalim : Path e id ekledigimizde o id li kaydi donuyor, eger bir sey eklemezsek tum kayitlari doner. Ama
eger cok fazla kayi varsa sorun olabilir. O yuzden belli bir limit koyalim. Page 1 icin 50 kayit donsun. Bu durumda
requestimiz su sekilde olmali,

http://localhost:8080/kullanicilar?page=1&limit=50

Parametreler ? den sonra eklenir ve aralarina & konur.

Bu durumda Get methodumuz su sekilde olmali.

@GetMapping
public String getUser(@RequestParam(value="page") int page,
@RequestParam(value="limit") int limit) {
return "get user cagrildi page: "+ page+ " limit: "+ limit;
}



Path de bir deger gelmedigi icin path i kaldirdik. RequestParam olarak gelen parametreleri yakaladik.

Peki bu degerlerden biri gonderilmezse nasil bir response donecegiz? Kullandigimiz degerler bos geldigi icin islemlerimizi
yapamayacagiz ve 400 Bad Request donecegiz. Bu gibi durumlara dusmemek icin her bir parametreye default bir deger atayalim ve eger
degerler bos gelirse o default degeri kullansin.

@GetMapping
public String getUser(@RequestParam(value="page", defaultValue="8") int page,
@RequestParam(value="limit", defaultValue="6") int limit) {
return "get user cagrildi page: "+ page+ " limit: "+ limit;
}

Diger bir yontem ise parametreyi optional yapmaktir(required=false) eklemek. Ancak bu yontem primitive data type lar icin sorun yaratir, operationda
o degeri kullanmaya calisirsak null pointer alabilir ve 500 Internal Server Error verebiliriz.

Get ile yapilan islem normalde sudur. Cekilmesi gereken kullanicinin userId si input olarak gecilir ve o id li user in
bilgisi cekilir. O zaman bu metodun return tipi User tipinde bir obje olmalidir. Yani User modeline ihtiyacimiz var.

@GetMapping(path="/{userId}")
public User getUser(@PathVariable String userId){
User u = new User();
u.setFirstName("gamze");
u.setEmail("gamzesen@gmail.com");
u.setLastName("sen");
u.setUserId(userId);
return u;
}




Bize donen response u json olarak yakaladik. XML e donusturmeye calisip hata alabiliriz. Cunku datanin tipi uygun olmayabilir.
Response un hangi tiplerde donecegini methoda produces parametresi ekleyerek ayarlayabiliriz. Ornegin hem json hem xml
tipinde response uretmesi icin su sekilde olmali:

@GetMapping(path="/{userId}", produces = {MediaType.APPLICATION_JSON_VALUE,
MediaType.APPLICATION_XML_VALUE})
public User getUser(@PathVariable String userId){
User u = new User();
u.setFirstName("gamze");
u.setEmail("gamzesen@gmail.com");
u.setLastName("sen");
u.setUserId(userId);
return u;
}

Sadece belli tipteki datalari request olarak kabul etmesini saglabiliriz. Onu da consumes yazarak saglayabiliriz.

@GetMapping(path="/{userId}", produces = {MediaType.APPLICATION_JSON_VALUE,
MediaType.APPLICATION_XML_VALUE}, consumes = {MediaType.APPLICATION_JSON_VALUE,
MediaType.APPLICATION_XML_VALUE})



Ancak response umuz hala XML tipine uygun olmayabilir. Bunun icin projemiz xml desteklemesi icin pom.xml e xml dependency
eklemeliyiz. Bunun icin https://mvnrepository.com/artifact/com.fasterxml.jackson.dataformat/jackson-dataformat-xml/2.9.8
bu linkten jackson data formatini aciyoruz. En son surumu secip Maven tabindan ilgili kodu pom.xml e ekliyoruz. Artik
response umuz XML tipinde donebilir.

Put ile update islemleri yapiyoruz. Hangi kullaniciyi update edecegimiz bilgisini parametre olarak user id ile gonderiyoruz.
Ayrica update edilecek bilgileri de requestin body sinde gondermeliyiz. Bu yuzden RequestBody tipinde bir parametre daha
ekleyecegiz. Girilen bilgilerin validation ini yapacagiz. O yuzden basina @Valid annotation ekleyelim.
RequestBody olarak kullanacagimiz model icinse yeni bir model olusturalim.


Simdi ise Post isteginebakalim. Post requesti create icin kullanilir. Request te yeni bir kullanici olusturacagiz. O kullanicinin
bilgilerini request body de gondeririz. Oncelikle bu request body de gelen kullanici bilgilerini modele setleriz. Daha sonra da
olusturdugumuz kullaniciyi donelim. O yuzden methodumuzun return tipi ResponseEntity<Model> seklinde olmali.

Map<String, User> users;
@PostMapping(produces = {MediaType.APPLICATION_JSON_VALUE,
MediaType.APPLICATION_XML_VALUE}, consumes = {MediaType.APPLICATION_JSON_VALUE,
MediaType.APPLICATION_XML_VALUE})
public ResponseEntity<User> createUser(@RequestBody UserRequest userReq){
User u = new User();
u.setFirstName(userReq.getFirstName());
u.setLastName(userReq.getLastName());
u.setEmail(userReq.getEmail());
u.setUserId(UUID.randomUUID().toString());

if(users == null) {
users = new HashMap<>();
users.put(u.getUserId(), u);
}
return new ResponseEntity<User>(u, HttpStatus.OK);


Simdi de DELETE requestine bakalim. Silme islemi icin silinecek kullanicinin id sini gonderecegiz. Herhangi bir response body
gondermedigimiz veya sonuc beklemedigimiz icin Accept ve Content-Type header kullanmamiza gerek yok. Methodumuz su sekilde
olacak.

@DeleteMapping(path="/{userId}")
public ResponseEntity<Void> deleteUser(@PathVariable String userId){
users.remove(userId);

return ResponseEntity.noContent().build();
}

Bu sekilde users listesinden ilgili user silinecek ve no content response muz donecek.

Bunun icin once post requestiyle bir user olusturalim. Sonra get ile o user in id sini alalim. Ve delete requestde o user i
silelim. Islemimiz bu kadar basit.


Simdi ise Exception Handling isine bakalim. Eger uygulamamizda herhangi bir exception cikarsa zaten bunu otomatik handle eder.
500 internal server hatasini dondurur, ama biz bu isi custom olarak yapalim.
Ornegin getUser methodumuzda String firtname= null; yapip int length = firstName.length();
dersek null pointer exception aliriz. Bu durumu AppExeptionHandler adinda bir class yazarak biz handle edelim.
Eger yazdigimiz classin ustune @ControllerAdvice annotation eklersek uygulamanin herhangi bir yerinde olusan hatayi yakalamamizi
saglar.

methodumuzun uzerine ekleyecegimiz @ExceptionHandler annotation ise icine ne tarz exceptionlari yakalamak istiyorsak onu yazariz.
Tum exceptionlari yakalamak icin sadece Exception yazacagiz.


@ControllerAdvice
public class AppExeptionHandler extends ResponseEntityExceptionHandler{

@ExceptionHandler(value ={Exception.class})
public ResponseEntity<Object> handleAnyException(Exception ex, WebRequest req){ //Object yazdik cunku hata responseunu biz olusturacagiz.
return ResponseEntity<>(ex , new HttpHeaders(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}

get request calistirip null pointer exception alacagiz ve bu methodumuz calisacak.


Dependency Injection : Uygulama gelistirirken bir class icinde diger classdaki ozelliklere erismemiz gerekebilir. Bu gibi durumlarda
nesne olustururuz. Classlar arasi bagimliliklari en aza indirmek ve bu bagimliliklari yonetmek amaciyla kullanilir. Belli bir
islevi yapan bir uygulama yazildiginda daha sonra baska bir sekilde degistirilmesi istenirse her yerde degisiklik yapmak yerine
en az degisiklikle yeni hale getirmek icin Dependency Injection kullanilir. new ile class a ait nesne olusturmak (direct instance)
daha zorludur. Bunun yerine bir interface yazilir. Daha sonra bir implementation yazilir. Direkt olarak classi degistirmektense
interface leri degistirmek daha az maliyetlidir. Ornegin bir yapay zekamiz olsun. Bulunulan dosya icinde arama yapma ozelligi
olsun.

public class YapayZeka{
public String aramaYap(){
return "Dosya icinde arama yapildi";
}
}

public class Uygulama{
public static void main(String[] args){
YapayZeka yapayZeka = new YapayZeka();
yapayZeka.aramaYap();
}
}

Uygulamamiz bu sekilde sorunsuz calisir ancak ilerde aramanin sadece dosya icinde degilde tum dosyalarda aramasi gerektigi
soylenirse bu YapayZeka classini degistirmek anlamina gelir. Ancak dependency injection kullanirsak bu degisikligi en aza
indiririz.

public interface YapayZeka{
public String aramaYap();
}

2 tane implementation yazalim.

public class DosyaAramasi implements YapayZeka{
@Override
public String aramaYap(){
return "Dosya icinde arama yapildi";
}
}


public class GenisArama implements YapayZeka{
@Override
public String aramaYap(){
return "Tum dosyalar icinde arama yapildi";
}
}

Uygulama ise su sekilde olmali.


public class Uygulama{
public static void main(String[] args){
DosyaAramasi dosyaAra = new DosyaAramasi();
dosyaAra.aramaYap();

GenisArama genisAra = new GenisArama();
genisAra.aramaYap();
}
}

Dependency Injection ile java class larimiz birbirinden bagimsiz olmali. Bu sayede hem bu classlari baska uygulamalarda
kullanabiliriz hem de test etmemiz daha kolaylasir.

Bu Dependency Injection meselesini bizim uygulamamiz acisindan inceleyelim. createUser methodunun business logic kismini baska bir
class icinde yazarsak ilerde bu islem database kullanmamiz geretiginde veya baska islemler yapmamiz gerektiginde bu isler
daha kolaylasir.

UserService adinda bir interface olsuturalim.

public interface UserService {
UserRest createUser(UserDetailsRequestModel userDetails);
}

Simdi de implementation olsuturalim. Ve createUser icindeki buradaki implementation a kopyalalim.

public class UserServiceImpl implements UserService {
Map<String, UserRest> users;

@Override
public UserRest createUser(UserDetailsRequestModel userDetails) {
UserRest user = new UserRest();
user.setEmail(userDetails.geteMail());
user.setFirstName(userDetails.getFirstName());
user.setLastName(userDetails.getLastName());

String userId = UUID.randomUUID().toString();
user.setUserId(userId);
if(users == null) {
users = new HashMap<>();
users.put(userId, user);
}
return user;
}

}

Simdide bunu createUser methodunda su sekilde cagirabiliriz.

UserRest user = new UserServiceImpl().createUser();

Bu sekilde kullanmak direct dependency olur. Ve bu sekilde cok verimli olmaz. Dependency fazla olur. Bunun yerine UserService i
inject edecegiz. En ustte

@Autowired
UserService userService;

Autowired annotation ile Spring framework bizim adimiza o classin otomatik olarak instance ini olusturur.

Artik createUser icinde

UserRest user = userService.createUser(); seklinde kullanabiliriz. Ama daha bitmedi. Framework un UserServiceImpl i gormesi
ve autowired etmesi icin UserServiceImpl i Service olarak tanimlamaliyiz. Bunun icin en ustune @Service annotation eklemeliyiz.
Framework tum projeyi scan eder ve Service annotation gorurse ancak userService den instance olusturur.
Post request atip yazdiklarimizi deneyelim.

Simdi de constructor based Dependency Injection a bakalim:

UserServiceImpl in userId uretmek icin Utils adinda bir classa dependent oldugunu dusunelim. Bu Util i de inject etmek icin
constructor kullanalim. Bunun icin UserServiceImpl icin 2 constructor olusturalim. Ve Utils olan constructor i Autowired ile
annotate edelim ki Utils icin otomatik olarak instance olsutursun.

Utils utils;

public ServiceImpl(){}

@Autowired
public UserServiceImpl(Utils utils){
this.utils = utils;
}

Bunun icin Utils classimizi olusturalim.  Ve class imizi @Service annotation ile isaretleyelim.

@Service
public class Utils{
public String generateUserId(){
return UUID.randomUUID().toString();
}
}

ServiceImpl icinde createUser da userId kismini Utils den alalim.

String userId = utils.generateUserId(); seklinde.

Yaptiklarimizi post req atarak deneyelim.

26 Ocak 2019 Cumartesi

RecyclerView “cannot resolve symbol” error - hatasi - Android Studio

Merhaba,
Android Studio da RecyclerView kullanmak istedigimizde su sekilde bir hata alabiliyoruz.
Bu hatanin cozumu icin app seviyesindeki build.gradle dosyamiza alttaki kodu ekledigimizde basarili bir sekilde import edip hatamizi cozebiliriz.

compile 'com.android.support:design:26.0.0-alpha1'

13 Ocak 2019 Pazar

GELISTIRICI SECENEKLERI NASIL ACILIR? ANDROID

Merhaba,

Bu yazimda Android cihazlarda gelistirici secenekleri nasil acilir onu anlatacagim.

Android uygulamalari gelistirirken uygulamalarimizi bir emulator uzerinde calistiririz. Bu emulator genelde bize android studio nun saglamis oldugu emulator olabilir. Ancak bu emulatorler genelde cok yavas calisir ve istedigimiz performansi vermeyebilir. Bu durumda kendi android cihazlarimiz uzerinde de yazdigimiz uygulamayi test edebiliriz. Bunun icin Android cihazimizin oncelikle usb kablosuyla bilgisayarimiza bagli olmali ve android cihazimizin Gelistirici secenekleri acik olmalidir. Bu ozellik normalde kapalidir ve bizim aktif etmemiz gerekir.
Peki bu ozellik nasil acilir onu anlatalim:

Oncelikle AYARLAR -> CIHAZ HAKKINDA -> YAZILIM BILGISI ekranini acalim. Acilan ekranda YAPIM NUMARASI secenegini 4 5 kez ard arda tikladigimizda bu ozellik acilir. Ayarlar menusune geri dondugumuzde GELISTIRICI SECENEKLERI butonunun yer aldigini goruruz.

Gelistirici Secenekleri ekranindan USB HATA AYIKLAMA secenegini aktif hale getirelim.

Artik bu ozellik aktif hale gelmistir. Android Studio da projeyi run ederken cihaz sectigimiz ekranda artik bizim cihazimizda gorunur hale gelmistir.

Iyi calismalar.

Genymotion'a Play Store Yukleme

Merhaba,

Bu yazimda Genymotion a Google Play Store nasil yuklenir bunu gosterecegim.

Bunun icin oncelikle emulatorle uyumlu zip dosyasini buradan indirelim.

Daha sonra bu zipi cikartmadan Genymotion device miza surukle birak yapalim.

Ekrana gelen uyariya OK diyelim.

Daha sonra islem tamamlaninca device i yeniden baslatmamizi isteyecek. Yeniden baslatalim.

Cihaz acildiginda herhangi bir google service ine tiklayarak login olalim.

Ben Gmail uzerinden login oldum.

Verilen hatalari simdilik onemsemeyelim. Cunku basarili bir sekilde login olunduktan sonra google play icin update etmemizi isteyecek ve hatalarimiz orada cozulecek.

 Login olunduktan sonra Google service lerini Play Store uzerinden update edelim.

Sorunumuz cozulmus olacaktir.

Iyi calismalar.

Kaynak : https://medium.com/@eferhatg/genymotiona-google-play-store-yukleme-2-cab6b2ee65a2

6 Ocak 2019 Pazar

Android Studio Hizlandirmak Icin

Merhaba bu yazimda Android Studio yu nasil hizlandirabilecegimizi anlatacagim.
Bunu internette arastirirken stackowerflow da buldum. Ve gercekten ise yaradi. Performansta gozle gorulur artis oldu. Sizde deneyebilirsiniz.

Tips to make android studio fast:
Enable Offline Work:
  1. Click File -> Settings. Search for "gradle" and click in Offline work box.
  2. Go to Compiler (in same settings dialog just below Gradle) and add --offline to Command-line Options text box.
Improve Gradle Performance
gradle can be optimized too. The easy way is to modify the settings in global gradle.properties(create it if not exists in the following folders: Windows - C:\users\your_name\.gradle\; Linux- /home/<username>/.gradle/; Mac- /Users/<username>/.gradle/; ) and in that file, add these two lines:
org.gradle.daemon=true
org.gradle.parallel=true
Linki de asagiya birakiyorum.

https://stackoverflow.com/questions/30817871/android-studio-is-slow-how-to-speed-up

3 Ocak 2019 Perşembe

Android Firebase Kullanimi

Merhaba,
Bu yazimda Firebase ile proje gelistirmeye giris asamasini anlatacagim. Firebase in bir cok ozelligi bulunuyor : Authentication,
Storage, Database gibi. Oncelikle Authentication ozelligini kullanarak uygulama gelistirecegiz.
Bunun icin once Android studio dan yeni bir proje olusturuyoruz, activity olarak ise LoginActivity seciyoruz.

Daha sonra Firebase Consol da bir proje olusturuyoruz.
Simdi Android Studio ya geri donelim. Tools -> Firebase seciyoruz.
Resimdeki Asistan kismi aciliyor.

Once 1. Connect your app to Firebase altindan Connect to Firebase i seciyoruz.
Acilan ekrandan Firebase Consol da olusturdugumuz projeyi seciyoruz.

Buradan Authentication secip "Add Firebase Authentication to your app" e tikliyoruz.Acilan
ekranda bize gradle a firebase authentication icin gerekli kodlari ekleyecegim diyor, biz de tamam diyoruz ve kodlar gradle a
ekleniyor.

Bu sekilde artik gerekli kodlarimiz gradle a eklenmis oluyor.

Kodlarimizi yazdiktan sonra Firebase consoldan oturum acma yontemi olarak Eposta/Sifre kismini etkinlestiriyoruz.


Oncelikle FirebaseAuth classindan bir nesne olusturuyoruz. Girilen mail adresi kayitli bir mail adresi mi diye kontrol ediyoruz. Daha sonra eger kayitli ise login olmasi icin signInWithEmailAndPassword methodunu cagiriyoruz.

Eger kayitli degilse kayit olmasi icin de createUserWithEmailAndPassword methodunu cagiriyoruz.

Bu methodlarin yanlarina nokta koyup islemin tamamlanip tamamlanmadigi kontrolunu yapmak icin
addOnCompleteListener yazarak Complete Listener ekliyoruz.

Daha sonra login olurken firebaseAuth dan getCurrentUser diyerek useri aliyoruz, daha sonra mail adresi verify edildi mi kontrol ediyoruz. Eger edildiyse kullaniciyi login etmeliyiz. Degilse hata vermeliyiz.

Kayit olurken ise currentUser a verification maili gonderiyoruz.

LoginActivity.java

firebaseAuth.fetchProvidersForEmail(mEmail).addOnCompleteListener(new OnCompleteListener() {
                @Override
                public void onComplete(@NonNull Task task) {
                    if(task.isSuccessful()){

                        boolean isMailExist = !task.getResult().getProviders().isEmpty();
                        if(isMailExist){

                            firebaseAuth.signInWithEmailAndPassword(mEmail, mPassword).addOnCompleteListener(new OnCompleteListener() {
                                @Override
                                public void onComplete(@NonNull Task task) {
                                    if(task.isSuccessful()){

                                        FirebaseUser user = firebaseAuth.getCurrentUser();
                                        if(user.isEmailVerified()){
                                            // kullaniciyi anasayfaya yonlendir.
                                        }else {
                                            mPasswordView.setError("Mail dogrulanmayi bekliyor!!!");
                                        }
                                    }

                                }
                            });
                        } else{

                            firebaseAuth.createUserWithEmailAndPassword(mEmail, mPassword).addOnCompleteListener(new OnCompleteListener() {
                                @Override
                                public void onComplete(@NonNull Task task) {
                                    if(task.isSuccessful()){
                                        FirebaseUser useer = firebaseAuth.getCurrentUser();
                                        useer.sendEmailVerification().addOnCompleteListener(new OnCompleteListener() {
                                            @Override
                                            public void onComplete(@NonNull Task task) {
                                                if(task.isSuccessful()){
                                                    tw.setText("Email gonderildi");
                                                }
                                            }
                                        });
                                    }
                                }
                            });
                        }
                    }
                }
            });


Ilk once tum mailler icin create metoduna dusecektir ve kullaniciya dogrulama maili gonderecektir. Daha sonra ilgili kullanici mail adresini onaylarsa bu defa da sign in metoduna dusecektir.


Kullanici login oldugunda gidecegi sayfa icin yeni bir activity olusturuyoruz, olsutururken NavigationDrawerActivity seciyoruz.

Burada ise oturumu acilan kullanicinin mail adresini cekip soldaki acilir menude resmin altina yazmaya calisalim.

Oncelikle

private FirebaseAuth firebaseAuth;

olusturalim. Daha sonra onCreate icinde firebaseAuth a deger atayalim.

firebaseAuth = FirebaseAuth.getInstance();

Simdi de oturumu acilmis kullaniciyi alalim.

FirebaseUser fUser = firebaseAuth.getCurrentUser();

// Eger user null degilse soldaki text view a yazalim.
Bunun icin once soldaki text view i alalim.activity layout icindeki navigation view da yer alan header layout a gidiyoruz. Oraya bir text view ekliyoruz. Id si userMail olsun.

View view = navigationView.getHeaderView(0);

TextView tw = view.findViewById(R.id.userMail);

if(fUser != null){
    tw.setText(fUser.getEmail());
}


Simdi ise sol menuye cikis yap butonu ekleyelim. Ve o butona basildiginda giris yaptigi ekrana tekrar donsun. Butonun id si logOut olsun.

else if(id == R.id.logOut){
    firebaseAuth.signOut();
    Intent i = new Intent(getApplicationContext(), LoginActivity.class);
    startActivity(i);
    finish(); // geriye tiklandiginda geri donmemesi icin
}


LoginActivity tum kodlari asagida yer aliyor,

package gykizmir.com.newproject;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.annotation.TargetApi;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.support.annotation.NonNull;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.app.LoaderManager.LoaderCallbacks;

import android.content.CursorLoader;
import android.content.Loader;
import android.database.Cursor;
import android.net.Uri;
import android.os.AsyncTask;

import android.os.Build;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.inputmethod.EditorInfo;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.auth.ProviderQueryResult;

import java.util.ArrayList;
import java.util.List;

import static android.Manifest.permission.READ_CONTACTS;

/**
 * A login screen that offers login via email/password.
 */
public class LoginActivity extends AppCompatActivity implements LoaderCallbacks {

    /**
     * Id to identity READ_CONTACTS permission request.
     */
    private static final int REQUEST_READ_CONTACTS = 0;

    /**
     * A dummy authentication store containing known user names and passwords.
     * TODO: remove after connecting to a real authentication system.
     */
    private static final String[] DUMMY_CREDENTIALS = new String[]{
            "foo@example.com:hello", "bar@example.com:world"
    };
    /**
     * Keep track of the login task to ensure we can cancel it if requested.
     */
    private UserLoginTask mAuthTask = null;

    // UI references.
    private AutoCompleteTextView mEmailView;
    private EditText mPasswordView;
    private View mProgressView;
    private View mLoginFormView;
    private FirebaseAuth firebaseAuth;
    public final static String TAG= "GYKIZMIR";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        // Set up the login form.
        mEmailView = (AutoCompleteTextView) findViewById(R.id.email);
        //   populateAutoComplete();

        mPasswordView = (EditText) findViewById(R.id.password);
        mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) {
                if (id == R.id.login || id == EditorInfo.IME_NULL) {
                    attemptLogin();
                    return true;
                }
                return false;
            }
        });

        Button mEmailSignInButton = (Button) findViewById(R.id.email_sign_in_button);
        mEmailSignInButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                attemptLogin();
            }
        });

        mLoginFormView = findViewById(R.id.login_form);
        mProgressView = findViewById(R.id.login_progress);

        firebaseAuth = FirebaseAuth.getInstance();

    }

    private void populateAutoComplete() {
        if (!mayRequestContacts()) {
            return;
        }

        getLoaderManager().initLoader(0, null, this);
    }

    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)) {
            Snackbar.make(mEmailView, R.string.permission_rationale, Snackbar.LENGTH_INDEFINITE)
                    .setAction(android.R.string.ok, new View.OnClickListener() {
                        @Override
                        @TargetApi(Build.VERSION_CODES.M)
                        public void onClick(View v) {
                            requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS);
                        }
                    });
        } else {
            requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS);
        }
        return false;
    }

    /**
     * Callback received when a permissions request has been completed.
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                           @NonNull int[] grantResults) {
        if (requestCode == REQUEST_READ_CONTACTS) {
            if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                populateAutoComplete();
            }
        }
    }


    /**
     * Attempts to sign in or register the account specified by the login form.
     * If there are form errors (invalid email, missing fields, etc.), the
     * errors are presented and no actual login attempt is made.
     */
    private void attemptLogin() {
        if (mAuthTask != null) {
            return;
        }

        // Reset errors.
        mEmailView.setError(null);
        mPasswordView.setError(null);

        // Store values at the time of the login attempt.
        String email = mEmailView.getText().toString();
        String password = mPasswordView.getText().toString();

        boolean cancel = false;
        View focusView = null;

        // Check for a valid password, if the user entered one.
        if (!TextUtils.isEmpty(password) && !isPasswordValid(password)) {
            mPasswordView.setError(getString(R.string.error_invalid_password));
            focusView = mPasswordView;
            cancel = true;
        }

        // Check for a valid email address.
        if (TextUtils.isEmpty(email)) {
            mEmailView.setError(getString(R.string.error_field_required));
            focusView = mEmailView;
            cancel = true;
        } else if (!isEmailValid(email)) {
            mEmailView.setError(getString(R.string.error_invalid_email));
            focusView = mEmailView;
            cancel = true;
        }

        if (cancel) {
            // There was an error; don't attempt login and focus the first
            // form field with an error.
            focusView.requestFocus();
        } else {
            // Show a progress spinner, and kick off a background task to
            // perform the user login attempt.
            showProgress(true);
            mAuthTask = new UserLoginTask(email, password);
            mAuthTask.execute((Void) null);
        }
    }

    private boolean isEmailValid(String email) {
        //TODO: Replace this with your own logic
        return email.contains("@");
    }

    private boolean isPasswordValid(String password) {
        //TODO: Replace this with your own logic
        return password.length() > 4;
    }

    /**
     * Shows the progress UI and hides the login form.
     */
    @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
    private void showProgress(final boolean show) {
        // On Honeycomb MR2 we have the ViewPropertyAnimator APIs, which allow
        // for very easy animations. If available, use these APIs to fade-in
        // the progress spinner.
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
            int shortAnimTime = getResources().getInteger(android.R.integer.config_shortAnimTime);

            mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE);
            mLoginFormView.animate().setDuration(shortAnimTime).alpha(
                    show ? 0 : 1).setListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE);
                }
            });

            mProgressView.setVisibility(show ? View.VISIBLE : View.GONE);
            mProgressView.animate().setDuration(shortAnimTime).alpha(
                    show ? 1 : 0).setListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    mProgressView.setVisibility(show ? View.VISIBLE : View.GONE);
                }
            });
        } else {
            // The ViewPropertyAnimator APIs are not available, so simply show
            // and hide the relevant UI components.
            mProgressView.setVisibility(show ? View.VISIBLE : View.GONE);
            mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE);
        }
    }

    @Override
    public Loader onCreateLoader(int i, Bundle bundle) {
        return new CursorLoader(this,
                // Retrieve data rows for the device user's 'profile' contact.
                Uri.withAppendedPath(ContactsContract.Profile.CONTENT_URI,
                        ContactsContract.Contacts.Data.CONTENT_DIRECTORY), ProfileQuery.PROJECTION,

                // Select only email addresses.
                ContactsContract.Contacts.Data.MIMETYPE +
                        " = ?", new String[]{ContactsContract.CommonDataKinds.Email
                .CONTENT_ITEM_TYPE},

                // Show primary email addresses first. Note that there won't be
                // a primary email address if the user hasn't specified one.
                ContactsContract.Contacts.Data.IS_PRIMARY + " DESC");
    }

    @Override
    public void onLoadFinished(Loader cursorLoader, Cursor cursor) {
        List emails = new ArrayList<>();
        cursor.moveToFirst();
        while (!cursor.isAfterLast()) {
            emails.add(cursor.getString(ProfileQuery.ADDRESS));
            cursor.moveToNext();
        }

        addEmailsToAutoComplete(emails);
    }

    @Override
    public void onLoaderReset(Loader cursorLoader) {

    }

    private void addEmailsToAutoComplete(List emailAddressCollection) {
        //Create adapter to tell the AutoCompleteTextView what to show in its dropdown list.
        ArrayAdapter adapter =
                new ArrayAdapter<>(LoginActivity.this,
                        android.R.layout.simple_dropdown_item_1line, emailAddressCollection);

        mEmailView.setAdapter(adapter);
    }


    private interface ProfileQuery {
        String[] PROJECTION = {
                ContactsContract.CommonDataKinds.Email.ADDRESS,
                ContactsContract.CommonDataKinds.Email.IS_PRIMARY,
        };

        int ADDRESS = 0;
        int IS_PRIMARY = 1;
    }

    /**
     * Represents an asynchronous login/registration task used to authenticate
     * the user.
     */
    public class UserLoginTask extends AsyncTask {

        private final String mEmail;
        private final String mPassword;

        UserLoginTask(String email, String password) {
            mEmail = email;
            mPassword = password;
        }

        @Override
        protected Boolean doInBackground(Void... params) {
            // TODO: attempt authentication against a network service.

            try {
                // Simulate network access.
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                return false;
            }

            firebaseAuth.fetchProvidersForEmail(mEmail).addOnCompleteListener(new OnCompleteListener() {
                @Override
                public void onComplete(@NonNull Task task) {
                    if(task.isSuccessful()){

                        boolean isMailExist = !task.getResult().getProviders().isEmpty();
                        if(isMailExist){

                            firebaseAuth.signInWithEmailAndPassword(mEmail, mPassword).addOnCompleteListener(new OnCompleteListener() {
                                @Override
                                public void onComplete(@NonNull Task task) {
                                    if(task.isSuccessful()){

                                        FirebaseUser user = firebaseAuth.getCurrentUser();
                                        if(user.isEmailVerified()){
                                            Toast.makeText(LoginActivity.this, "Email verify edildi", Toast.LENGTH_LONG).show();
                                            Intent i = new Intent(LoginActivity.this, MainActivity.class);
                                            startActivity(i);
                                        }else {
                                            mPasswordView.setError("Mail dogrulanmayi bekliyor!!!");
                                            Toast.makeText(LoginActivity.this, "Mail dogrulanmayi bekliyor!!!", Toast.LENGTH_LONG).show();
                                        }
                                    }

                                }
                            });
                        } else{

                            firebaseAuth.createUserWithEmailAndPassword(mEmail, mPassword).addOnCompleteListener(new OnCompleteListener() {
                                @Override
                                public void onComplete(@NonNull Task task) {
                                    if(task.isSuccessful()){
                                        FirebaseUser useer = firebaseAuth.getCurrentUser();
                                        useer.sendEmailVerification().addOnCompleteListener(new OnCompleteListener() {
                                            @Override
                                            public void onComplete(@NonNull Task task) {
                                                if(task.isSuccessful()){
                                                  //  tw.setText("Email gonderildi");
                                                    Toast.makeText(LoginActivity.this, "Email gonderildi", Toast.LENGTH_LONG).show();
                                                }
                                            }
                                        });
                                    }
                                }
                            });
                        }
                    }
                }
            });




            return true;
        }

        @Override
        protected void onPostExecute(final Boolean success) {
            mAuthTask = null;
            showProgress(false);

            if (success) {
                // finish();
            } else {
                mPasswordView.setError(getString(R.string.error_incorrect_password));
                mPasswordView.requestFocus();
            }
        }

        @Override
        protected void onCancelled() {
            mAuthTask = null;
            showProgress(false);
        }
    }

    private void setPwError(Exception exception) {
        Log.e(TAG, "Mail dogrulanmadi... ", exception);
        mPasswordView.setError(exception.toString());
    }
}




activity_login.xml



User.java

package gykizmir.com.newproject;

public class User {
    private String name;

    public String getName() {
        return name;
    }

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

UserAdapter.java



package gykizmir.com.newproject;

import android.content.Context;
import android.content.DialogInterface;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Gamze on 1/13/2019.
 */

public class UserAdapter extends RecyclerView.Adapter {
    private Context context;
    private List userList;
    private LayoutInflater inflater;


    public UserAdapter(Context context, List list) {
        this.context = context;
        this.userList = list;
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v =  LayoutInflater.from(context).inflate(R.layout.user_item, parent, false);
        return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {

        User user = userList.get(position);
        holder.isim.setText(user.getName());
    }

    @Override
    public int getItemCount() {
        return userList.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder{

        public TextView isim;
        public ImageView resim;
        private DatabaseReference dbRef;

        public ViewHolder(View view){
            super(view);
            isim = (TextView) view.findViewById(R.id.userName);
            resim = (ImageView) view.findViewById(R.id.userImg);

            view.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int position = getAdapterPosition();
                    if(position != RecyclerView.NO_POSITION){
                        final User selectedUser = userList.get(position);
                        Toast.makeText(context, "Secilen kullanici: "+ selectedUser.getName(), Toast.LENGTH_LONG).show();

                        AlertDialog.Builder alertDialog = new AlertDialog.Builder(context);
                        alertDialog.setTitle("Degistir");
                        alertDialog.setMessage("Yeni degeri girin");
                        final EditText input = new EditText(context);
                        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
                                LinearLayout.LayoutParams.MATCH_PARENT,
                                LinearLayout.LayoutParams.MATCH_PARENT);
                        input.setLayoutParams(lp);
                        alertDialog.setView(input);

                        alertDialog.setPositiveButton("Onayla",
                                new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int which) {

// value su o toast icinde gosterilen deger olanin key i ni bul. onun valuesunu girilen degeri setle

                                        dbRef = FirebaseDatabase.getInstance().getReference("users");

                                        dbRef.addValueEventListener(new ValueEventListener() {
                                            @Override
                                            public void onDataChange(DataSnapshot dataSnapshot) {

                                                for(DataSnapshot dataSnapshot1: dataSnapshot.getChildren()){
                                                    User u = dataSnapshot1.getValue(User.class);
                                                    if(u.getName().equals(selectedUser.getName())){
                                                             dbRef.child(dataSnapshot1.getKey()).child("name").setValue(input.getText().toString());

                                                    }
                                                }
                                            }

                                            @Override
                                            public void onCancelled(DatabaseError databaseError) {

                                            }
                                        });

                                    }
                                });

                        alertDialog.setNegativeButton("Iptal",
                                new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int which) {
                                        dialog.cancel();
                                    }
                                });

                        alertDialog.show();

                        FirebaseDatabase.getInstance().getReference("users").child("gamze").child("name").setValue("Gamzecik");

                    }
                }
            });
        }

    }
}

MainActivity.java



package gykizmir.com.newproject;

import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;

import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {

    private TextView username;
    private TextView usermail;
    private FirebaseAuth firebaseAuth;
    private RecyclerView recyclerView;
    private DatabaseReference databaseReference;
    private UserAdapter userAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);

        View view = navigationView.getHeaderView(0);
       // username = (TextView) findViewById(R.id.uname);
        usermail = view.findViewById(R.id.uMail);

        firebaseAuth = FirebaseAuth.getInstance();
        FirebaseUser firebaseUser = firebaseAuth.getCurrentUser();
        usermail.setText(firebaseUser.getEmail());

        recyclerView = (RecyclerView) findViewById(R.id.rc_view);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this,
                LinearLayoutManager.VERTICAL, false);
        recyclerView.setLayoutManager(linearLayoutManager);


        databaseReference = FirebaseDatabase.getInstance().getReference("users");
        databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                List userList = new ArrayList();
                for(DataSnapshot dataSnapshot1: dataSnapshot.getChildren()){
                    // Ekranda gosterecegimiz datalari listeye ekliyoruz.
                    User u = dataSnapshot1.getValue(User.class);
                    userList.add(u);
                }
                loadUsers(userList);
// Bu metodla olusturdugumuz listedeki elemanlari ekranda gosterecegiz.
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });


    }

    private void loadUsers(List userList){
        userAdapter = new UserAdapter(this, userList);
        recyclerView.setAdapter(userAdapter);
    }

    @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(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

        if (id == R.id.nav_camera) {
            // Handle the camera action
        } else if (id == R.id.nav_gallery) {
            Intent i = new Intent(MainActivity.this, StorageActivity.class);
            startActivity(i);

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

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

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

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

        } else if (id == R.id.nav_signout){
            firebaseAuth.signOut();
            Intent intent = new Intent(MainActivity.this, LoginActivity.class);
            startActivity(intent);
            finish();
        }

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


Simdi ise veritabaninda bir tablo olusturalim ve ona bir deger ekleyelim.

Veritabani yapimiz su sekilde olsun:

users:
    gamze
        name
            Gamze Sen
    mary
        name
            Mary Hopkins
     ....

Bu islemi yapacak satirimiz su sekildedir.

FirebaseDatabase.getInstance().getReference().child("users").child("gamze").child("name").setValue("Gamze Sen");

FirebaseDatabase.getInstance().getReference().child("users").child("mary").child("name").setValue("Mary Hopkins");

seklinde.

simdi ise gamze sen degerini alip onu header layout ta bir textview olusturup orada gostermek isteyelim.

databaseReference = FirebaseDatabase.getInstance().getReference("users/gamze/name");

databaseReference.addValueEventListener(new ValueEventListener(
     @Override
     public void onDataChange(DataSnapshot dataSnapshot) {
                userName.setText(dataSnapshot.toString());
            }
            @Override
            public void onCancelled(DatabaseError databaseError) {

            }

)); 

Simdi ise database e eklenen tum degerleri ekranda liste halinde gosterelim. Eleman her biri User modelinin birer ozelligi.
O yuzden oncelikle User adinda bir model olusturalim. isim ve resim parametreleri olsun.
Ve her bir user item ini gosterecegimiz bir view item olusturalim. Solda resim yaninda da isimleri olsun. Database den cekilsin
bu degerler.

Bu degerleri setlemek icin bir adapter yazmamiz gerekir. Daha once de bahsettigimiz gibi adapter verileri bizim kullanabilecegimiz
sekle donusturur, donusturucu islevi gorur. Bu adapter imiz verileri alicak, ekrandaki view lara degerlerini setleyecek.

Ekranda bir textview ve bir imageview yer alsin.
Oncelikle UserAdapter imizi olusturalim. Custom olarak olusturacagimiz ViewHolder classimizi extend etsin.
ViewHolder in yapacagi su : ViewHolder constructor i icinde ekranda yer alacak textview ve imageview i findviewbyid ile setlemek.

public class ViewHolder extends RecyclerView.ViewHolder{

        public TextView isim;
        public ImageView resim;

        public ViewHolder(View view){
            super(view);
            isim = (TextView) view.findViewById(R.id.isim);
            resim = (ImageView) view.findViewById(R.id.userImage);
        }

    }

Simdi ise UserAdapter a bakalim. Adapter in 3 metodu implement etmesi gerekir. Bu metodlar:
onCreateViewHolder, onBindViewHolder ve getItemCount metodlaridir.

onCreateViewHolder metodu viewholder olusturmamizi saglar. Layout inflater ile each user icin layoutumuzu veririz.

 public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v =  LayoutInflater.from(context).inflate(R.layout.user_item, parent, false);
        return new ViewHolder(v);
    }

onBindViewHolder metodu ise parameterlere degerleri setlememizi saglar. Bir user objesi olustururuz. userListesinden o
pozisyondaki user i bulup viewholder in isim alanina o userin adini setleriz.

public void onBindViewHolder(ViewHolder holder, int position) {
        User user = userList.get(position);
        holder.isim.setText(user.getName());
    }
getItemCount methodu ise userList in size ini dondurur.

public int getItemCount() {
    return userList.size();
    }


Adapterimizi bu sekilde olsuturduktan sonra main ekranimiza bu adapterimizi vermeliyiz ki degerlerimiz main ekranda gorunsun.

Uygulamamiz ilk acildiginda degerlerimizin gosterilmesini istiyoruz, O yuzden oncreate methoduna gidelim.
Gosterecegimiz u degerler users tablosundan gelecek. Oncelikle bir referansimiz olsuturalim.


databaseReference = FirebaseDatabase.getInstance().getReference("users");
databaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
   List<User> userList = new ArrayList<User>();
   for(DataSnapshot dataSnapshot1: dataSnapshot.getChildren()){
    // Ekranda gosterecegimiz datalari listeye ekliyoruz.
    User u = dataSnapshot1.getValue(User.class);
    userList.add(u);
   }
   loadUsers(userList);
// Bu metodla olusturdugumuz listedeki elemanlari ekranda gosterecegiz.
}}


Simdi ise bu methodumuzu yazalim.

private void loadUsers(List<User> userList){
        userAdapter = new UserAdapter(this, userList);
        recyclerView.setAdapter(userAdapter);
    }

Buradaki recyclerView i ise su sekilde tanimliyoruz.


 recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
 LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, 
LinearLayoutManager.VERTICAL, false);
 recyclerView.setLayoutManager(linearLayoutManager);


Ekrana datalarimizi gosterdik. Simdi de o listedeki elemanlara tiklayip degerlerini gorme islemine bakalim. Recycler View kullanmistik.

Tiklanma algilama islemini UserAdapter da yazdigimiz custome viewholder icinde, constructor da yapacagiz.

 public ViewHolder(View view) {
            super(view);
            view.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                  int position = getAdapterPosition();
                  if(position != RecyclerView.NO_POSITION){
                     User clickedUser = userList.get(position);
                     Log.d("Tiklanan user : ", " adi : "+ clickedUser.getName());
                   }
                }
            });

    }


Simdi ise firebase in storage ozelligini kullanmayi ogrenelim. Bunun icin telefondan bir resim yukleyelim ve bu resmi firebase e yukleyelim. Yuklerken de ne kadar yuklendigini yuzde oraninda gostermek icin ProgressBar kullanalim.

Bu islemler icin layoutumuz olarak resim sec ve yukle butonu olacak. Altta ise yuklenen resmi imageview da gosterelim.





package gykizmir.com.newproject;

import android.app.ProgressDialog;
import android.content.Intent;
import android.graphics.Bitmap;
import android.media.Image;
import android.net.Uri;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.annotation.VisibleForTesting;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.OnProgressListener;
import com.google.firebase.storage.StorageReference;
import com.google.firebase.storage.UploadTask;

import java.io.IOException;
import java.util.UUID;

public class StorageActivity extends AppCompatActivity {

    private Button uploadBtn, selectImgBtn;
    private ImageView uploadedImg;
    private StorageReference databaseReference;
    private final int IMG_REQUEST_CODE = 82;
    private Uri selectedData;

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

        selectImgBtn = (Button) findViewById(R.id.secBtn);
        uploadBtn = (Button) findViewById(R.id.yukleBtn);
        uploadedImg = (ImageView) findViewById(R.id.image);

        databaseReference = FirebaseStorage.getInstance().getReference();

        selectImgBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                resmiSec();
            }
        });

        uploadBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                resmiYukle();
            }
        });

    }

    public void resmiSec(){
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType("image/*");
        startActivityForResult(Intent.createChooser(intent, "Yuklenecek resmi sec"), IMG_REQUEST_CODE);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if(requestCode == IMG_REQUEST_CODE && resultCode == RESULT_OK && data != null && data.getData() != null){
            selectedData = data.getData();

            try{
                Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), selectedData);
                uploadedImg.setImageBitmap(bitmap);

            } catch (Exception e){
                e.printStackTrace();
            }

        }
    }

    public void resmiYukle(){
        if(selectedData != null){
            final ProgressDialog progressDialog = new ProgressDialog(this);
            progressDialog.setTitle("Yukleniyor...");
            progressDialog.show();

            StorageReference storageReference = databaseReference.child(UUID.randomUUID().toString());
            storageReference.putFile(selectedData)
                    .addOnSuccessListener(new OnSuccessListener() {
                        @Override
                        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                            Toast.makeText(getApplicationContext(), "Yukleme Tamamlandi", Toast.LENGTH_LONG).show();
                            progressDialog.dismiss();
                        }
                    })
                    .addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            Toast.makeText(getApplicationContext(), "Yukleme sirasinda hata olustu", Toast.LENGTH_LONG).show();
                            progressDialog.dismiss();
                        }
                    }).addOnProgressListener(new OnProgressListener() {
                        @Override
                        public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
                            @SuppressWarnings("VisibleForTests")
                            double yuklenmeOrani = (100 * taskSnapshot.getBytesTransferred() / taskSnapshot.getTotalByteCount());
                            progressDialog.setMessage("Yuklenen : %" + (int) yuklenmeOrani);
                        }
            });

        }

    }
}

Yukleme ekranimiz alttaki sekilde gorunuyor.