Android’de Content Provider Kavramı ve Kullanımı #2
(Konu anlatımının ilk yazısını okumadıysanız önce onu okumanızı tavsiye ederim.)
Belki benim gibi sizin bu yazı dizisini okurken fark ettiğiniz,birazcık sinir eden bir kısım var. Bu kısım anlattığım projeyi adım adım/işlem işlem değilde her class’ı ayrı ayrı anlatıyor olmam. Maalesef anlatılan olayın yükü biraz fazla olunca her adım ve devamındaki etkilerini bu yazı dizisinde göstermem sizler için daha fazla işlerin Arap saçına dönmesine sebep olacağını düşündüğümden böyle yazmanın daha mantıklı olacağı kanısına vardım. Tabi siz projenin kodlarına github üzerinden bakarak ve bir yandan bu yazıları okuyarak daha iyi anlayabilirsiniz. Buradan projenin tamamına erişebilirsiniz. ve aynı zamanda bir hatam olursa beni bilgilendirmenizden de mutlu olurum.
Girizgahımız bittiğine göre en son nerede kaldığımızı önce hatırlayalım. AppProvider ve içinde inner class olan DBHelper class’larını yazmayı bitirmiştik. Az buçuk yaptığımız işin mantığını da anlamıştık. Her şey yolundaysa artık projeyi ayağa kaldırmanın vakti gelmiş demektir.
İlk olarak AndroidManifest’in içine telefonun rehberinden veri okumamız için gerekli olan izinleri alalım.
<uses-permission android:name="android.permission.READ_CONTACTS" />
Bu aldığımız izin bize yetmeyecektir. Çünkü buradaki yazıda görebileceğiniz gibi dangerous tipinde bir erişim iznidir. Şimdilik aldığımız bu izin yeter diyerek yolumuza devam ederim.
Öncelikle MainActivity.java ve AppProvider.java’larımızın yanına yeni bir Empty Activity ve onunla birlikte otomatik bir Layout File oluşturuyoruz. Bendeki ismi default olarak atanan Main2Activity’dir.
Konumuzdan çokta sapmamak adına activity_main.xml in kaynak kodlarını sizlere vermekteyim. Zaten karmaşık ve bilmeyeceğiniz bir kısım olduğunu pek zannetmiyorum. Sadece ListView’ın içindeki background kısmını silebilir yada projenin linkinden drawable klasörünün içinde border.xml’i kendi projenizin drawable klasörüne atabilirsiniz.
<?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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:background="@android:color/darker_gray">
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="442dp"
android:paddingTop="5dp"
android:paddingStart="10dp"
android:paddingBottom="5dp"
android:background="@drawable/border" />
<Button
android:id="@+id/buttonFamily"
android:background="#80CBC4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentBottom="true"
android:layout_marginStart="26dp"
android:layout_marginBottom="90dp"
android:onClick="listFamily"
android:text="Aile" />
<Button
android:id="@+id/buttonImportant"
android:background="#EF9A9A"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="90dp"
android:onClick="listImportant"
android:text="ACİL!!" />
<Button
android:id="@+id/buttonFriend"
android:background="#B39DDB"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true"
android:layout_marginEnd="33dp"
android:layout_marginBottom="90dp"
android:onClick="listFriends"
android:text="Arkadaş" />
<Button
android:background="#E6EE9C"
android:id="@+id/buttonAll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="19dp"
android:onClick="listAll"
android:text="Hepsi" />
</RelativeLayout>
Aslında şuandan itibaren zihninizde uygulamanın kullanıcı ile etkileşiminin nasıl olacağı konusunda ufakta olsa bir çerçeve oluşmuş olabilir.
Uygulamamız MainActivity içerisinde bir ListView ile telefonun rehberinde var olan kendimizin seçeceği kayıtları veya kendimiz manuel girdi olarak eklenen kayıtları göstermekte. Button’larımız ise ListView’daki verilerin kayıt edilirken seçtiğimiz kategorisine göre listelenmesini sağlanmakta. Main2Activity ise manuel girdi olarak eklenen kayıtların ve rehbere erişimi sağlayan activity dir. Bu activity farklı iki senaryoya göre iki işlem barındırmaktadır. İlk senaryo yukarıda da bahsedilen kayıt ekleme senaryosudur. Geriye kalan ise ListView içerisinden seçilen kayıt üzerinde düzenlemeler yapabildiğimiz veya o girdiyi silebilme işlemini yaptığımız senaryodur.
Bu bölümümüzün geçen bölümün yanında daha kolay kalması sebebi ile kodları tek tek anlatmak yerine direk class’ımızı burada bir bütün olarak paylaşarak üstünden anlatacağım. Zaten geçen bölümü anladıysanız bu bölümü açıklama yazılarını okumadan da kendiniz inceleyerek çok kolay bir şekilde kavrayabilirsiniz.
Öncelikle kayıtlarımızı listelemek için bir ListView ve kayıtlarımızı Cursor üzerinden okurken bu okunan kayıtları almak için üç farklı ArrayList oluşturuyoruz. String selection
ve String [] selectionArgs
ise Cursor hangi column’ların hangi değerlerini okumalıdır mantığında bir işlem yapmamızı sağlayacaklardır.
onResume içinde ilk başta oluşturduğumuz ArrayList’lerimizin içini boşaltıyoruz, bunun sebebi her onResume başlatıldığında eski değerlerini de içlerinde tutan ArrayListlerin ListView içinde veri tekrarı yapmasını engellemektir.
Cursor oluşturuyoruz ve fark ettiyseniz default olarak onResume içindeki selection ve selectionArgs değerleri null olacağından her hangi bir filtreleme olmayacak ve tüm kayıtlar önümüze getirilecektir.
Burada yapılan işlemlerimiz AppProvider classı’nda anlattığımız işlemler ile bağlanan işlemlerimiz olduğunu fark etmişsinizdir. Burada AppProvider içinde yaptığımız işlemlere bağlanıyoruz veya onlara belirli değerler yada null değerler göndererek bir sonuç/cevap alıyoruz. En son olarak da ArrayList’ler ile static olarak kayıt ettiğimiz veritabanı tablosunda bulunan sütunlara girilmiş değerleri elimizde tutup listelemek adına alıyoruz.
Bundan sonra yapacağımız iş ise bir ArrayAdapter oluşturmak,oluşturulan listede görüntülenmesini istediğimiz ArrayList eklemesini yapmak ve bunların listelenmesini sağlamak, en son olarak da herhangi bir liste ögesine tıklandığında bu ögenin diğer bilgileri ile birlikte Main2Activity içinde gözükmesi . Bu kısımlar pek bizim konumuz ile alakalı olmadığı için hızlı geçiyorum. Siz isterseniz bu kavramları bu derse ara verip araştırabilirsiniz.
Toolbar’ımıza Main2Activity de ekleme işlemi yapabilmemiz için bir OptionsMenu oluşturacağız. Bunun için res içine bir menu klasörü oluşturup, içinde Menu Resource File oluşturmalıyız.
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:icon="@android:drawable/ic_menu_add"
android:title="Kişi ekle"
android:iconTint="@android:color/black"
android:id="@+id/add"
app:showAsAction="always">
</item>
</menu>
Oluşturduğumuz xml içine bunları yazabilir veya kendinize göre özelleştirmeler yapabilirsiniz.
En son olarak da MainActivity içinde OptionsMenu için tanımlamalar yaparak
projemize eklemiş oluyoruz.
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater menuInflater=getMenuInflater();
menuInflater.inflate(R.menu.add_menu,menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if(item.getItemId()==R.id.add)
{
Intent intent= new Intent(MainActivity.this,Main2Activity.class);
intent.putExtra("info","new");
startActivity(intent);
}
return super.onOptionsItemSelected(item);
}
Son olarak da Button’ların onClick nitelikleri (attribute) için dört adet metot oluşturuyoruz. Bu Button lar içinde onResume içinde değeleri null dönen selection
ve selectionArgs
için değerler atayacağız ve tıklama işlemi gerçekleştiğinde listelenen ögeler filtrelenmiş olarak bizlere gelecektir.
public class MainActivity extends AppCompatActivity {
ListView listView;
ArrayList<String> nameArray = new ArrayList<String>();
ArrayList<String> numberArray= new ArrayList<String>();
ArrayList<String> titleArray = new ArrayList<String>();
ArrayList<String>idArray=new ArrayList<String>();
ArrayAdapter arrayAdapter;
String selection= null;
String [] selectionArgs=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView=findViewById(R.id.listView);
}
@Override
protected void onResume() {
super.onResume();
nameArray.clear();
numberArray.clear();
titleArray.clear();
idArray.clear();
ContentResolver contentResolver=getContentResolver();
Cursor cursor=contentResolver.query(AppProvider.CONTENT_URI,null,selection,selectionArgs,null);
if(cursor!=null)
{
while(cursor.moveToNext())
{
numberArray.add(cursor.getString(cursor.getColumnIndex(AppProvider.NUMBER)));
titleArray.add(cursor.getString(cursor.getColumnIndex(AppProvider.TITLE)));
nameArray.add(cursor.getString(cursor.getColumnIndex(AppProvider.NAME)));
idArray.add(cursor.getString(cursor.getColumnIndex(AppProvider.ID)));
}
cursor.close();
arrayAdapter= new ArrayAdapter(getApplicationContext(),android.R.layout.simple_list_item_1,android.R.id.text1,nameArray);
listView.setAdapter(arrayAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Intent intent= new Intent(MainActivity.this,Main2Activity.class);
intent.putExtra("info","old");
intent.putExtra("name",nameArray.get(i));
intent.putExtra("number",numberArray.get(i));
intent.putExtra("title",titleArray.get(i));
intent.putExtra("id",idArray.get(i));
startActivity(intent);
}
});
}
}
public void listAll(View view )
{
selection=null;
selectionArgs= null;
nameArray.clear();
numberArray.clear();
titleArray.clear();
idArray.clear();
onResume();
}
public void listFamily(View view)
{
nameArray.clear();
numberArray.clear();
titleArray.clear();
idArray.clear();
selection="title=?";
selectionArgs= new String[]{"Aile"};
onResume();
}
public void listFriends(View view)
{
nameArray.clear();
numberArray.clear();
titleArray.clear();
idArray.clear();
selection="title=?";
selectionArgs= new String[]{"Arkadas"};
onResume();
}
public void listImportant(View view)
{
nameArray.clear();
numberArray.clear();
titleArray.clear();
idArray.clear();
selection="title=?";
selectionArgs= new String[]{"Acil"};
onResume();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater menuInflater=getMenuInflater();
menuInflater.inflate(R.menu.add_menu,menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if(item.getItemId()==R.id.add)
{
Intent intent= new Intent(MainActivity.this,Main2Activity.class);
intent.putExtra("info","new");
startActivity(intent);
}
return super.onOptionsItemSelected(item);
}
}
Yazımızın son bölümüne aşağıdan ulaşabilirsiniz.