Bu makalede Android Studio ortamında Hürriyet API kullanımına değineceğim. Başlamadan önce Hürriyet Developers API sayfasından dökümantasyonu okumanızı öneririm. Hürriyet Api kullanmak için Hürriyet Developer üzerinden kayıt olup, Api Key almamız gerekiyor. İşlem basamakları aşağıda verilmiştir.
Giriş yaptıktan sonra Dashboard kısmından Api Key’i alıyoruz. Projemiz içinde bu Key’i kullanacağız.
Projenin bitmiş halinin dallanması bu şekilde oluyor. Model klasörünün içinde NewMO , Adapter klasörünün içinde ListAdapterNews, Fragment klasörünün içinde Tab2Haberler bulunuyor. Hürriyet Api projenin sadece bu kısmında kullanılmış oluyor.
Öncelikle Fragmentımızı aşağıdaki kodlarla oluşturuyoruz ve içine haberleri çekeceğimiz ListView’i ekliyoruz.
1 2 3 4 5 6 7 8 9 10 |
<?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"> <ListView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/listviewHaberler"/> </LinearLayout> |
Yukarıda eklemiş olduğumuz ListView itemleri için ImageView ve iki adet TextView ekleyerek CustomLayout’umuzu oluşturuyoruz. Haber resmi için ImageView, haber başlığı ve içeriği için ise TextView kullanıyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<?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="match_parent" android:background="#FFFFFF"> <ImageView android:paddingTop="5dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/haberResim"/> <TextView android:paddingLeft="10dp" android:paddingRight="10dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="20sp" android:layout_below="@+id/haberResim" android:id="@+id/haberBaslik"/> <TextView android:paddingLeft="10dp" android:paddingRight="10dp" android:paddingBottom="5dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/haberIcerik" android:textSize="15sp" android:layout_below="@+id/haberBaslik"/> </RelativeLayout> |
Api’den gelen verileri tutmak için kullanacağımız modeli oluşturuyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
package Model; public class NewsMO { String Id; //Haberin id'si String CreatedDate; //Haberin oluşturulma tarihi String Description; //Haberin içeriği String ImgUrl; //Haberin resmi String Title; //Haberin başlığı String Url; //Haberin url'i public String getCreatedDate() { return CreatedDate; } public void setCreatedDate(String createdDate) { CreatedDate = createdDate; } public String getDescription() { return Description; } public void setDescription(String description) { Description = description; } public String getImgUrl() { return ImgUrl; } public void setImgUrl(String imgUrl) { ImgUrl = imgUrl; } public String getTitle() { return Title; } public void setTitle(String title) { Title = title; } public String getUrl() { return Url; } public void setUrl(String url) { Url = url; } public String getId() { return Id; } public void setId(String id) { Id = id; } } |
ListView’in içini doldurmak için gerekli olan class’ı oluşturuyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
package com.example.scorpion.kitaplar.Adapter; import android.content.Context; import android.support.design.widget.Snackbar; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.TextView; import com.example.scorpion.kitaplar.R; import com.squareup.picasso.Picasso; import java.util.ArrayList; import Model.NewsMO; public class ListAdapterNews extends ArrayAdapter<NewsMO> implements View.OnClickListener{ private ArrayList<NewsMO> haberler; //Modelden oluşturulan haberleri tutan listeyi oluşturduk Context context; private static class ViewHolder{ //CustomLayout'ta kullanılan nesneleri tanımladık ImageView haberResim; TextView haberBaslik; TextView haberIcerik; } public ListAdapterNews(ArrayList<NewsMO> haberler, Context context){ //Class'ımız ilk çalıştığında çalışacak super(context, R.layout.list_layout_haberler, haberler); // olan metod. this.haberler = haberler; //Burada metod içine gelen haberler this.context = context; // listemizi clasın içinde kullanabilmek için } // Classtaki değişkene atıyoruz. @Override public void onClick(View v) { //İtem için Clik Event'i ekliyoruz. int position = (Integer) v.getTag(); Object object = getItem(position); NewsMO haberler = (NewsMO)object; switch (v.getId()){ case R.id.haberIcerik: Snackbar.make(v, "Haber Baslıgı: "+ haberler.getTitle().toString(), Snackbar.LENGTH_LONG).setAction("No Action", null).show(); break; } } private int lastPosition = -1; @Override public View getView(int position, View convertView, ViewGroup parent){ try { NewsMO haberler = getItem(position); //Gelen listemizin içindeki verilerden şuan oluşturacağımız ViewHolder viewHolder; // haberin verilerini haberler değişkenine atıyoruz. final View result; if (convertView == null) { //Yeni itemi oluşturmak için kullandığımız kısım viewHolder = new ViewHolder(); LayoutInflater inflater = LayoutInflater.from(getContext()); convertView = inflater.inflate(R.layout.list_layout_haberler, parent, false); viewHolder.haberResim = (ImageView) convertView.findViewById(R.id.haberResim); viewHolder.haberBaslik = (TextView) convertView.findViewById(R.id.haberBaslik); viewHolder.haberIcerik = (TextView) convertView.findViewById(R.id.haberIcerik); result = convertView; convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); result = convertView; } viewHolder.haberBaslik.setText(haberler.getTitle()); //Haberler değişkeni içinde bulunan başlığı ve açıklamayı viewHolder.haberIcerik.setText(haberler.getDescription()); // oluşturduğumuz item'in içindeki TextView'lere atıyoruz. if (haberler.getImgUrl()==""){ Picasso.with(context).load("http://www.bos.com/wp-content/uploads/2015/09/BOS_Logo_Red_Large.jpg").into(viewHolder.haberResim); } //Haberlerin resimleri boşsa linkteki resmi çekiyoruz. else { Log.d("resim url : ",haberler.getImgUrl()); Picasso.with(context).load(haberler.getImgUrl()).into(viewHolder.haberResim); } //Picasso kütüphanesinden yararlanarak haberlerin resimlerini çekiyoruz ve itemdeki ImageView'e atıyoruz. viewHolder.haberResim.setOnClickListener(this); viewHolder.haberResim.setTag(position); return convertView; } catch (Exception e){ e.printStackTrace(); } return convertView; } } |
Fragment ilk oluştuğu ve API’den verileri çektiğimiz class’ı yazıyoruz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.Fragment; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ListView; import com.example.scorpion.kitaplar.Adapter.ListAdapterNews; import com.example.scorpion.kitaplar.R; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import Model.NewsMO; public class Tab2Haberler extends Fragment { private static ListAdapterNews adapter; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceBundle){ View rootView = inflater.inflate(R.layout.tab2_haberler, container, false); try { ConnectivityManager manager = (ConnectivityManager) getContext().getSystemService(rootView.getContext().CONNECTIVITY_SERVICE); ProgressBar progressBar = (ProgressBar) rootView.findViewById(R.id.progressBar); if(manager.getActiveNetworkInfo() != null) { CheckNews news = new CheckNews(); //CheckNews AsyncTask ile çalışan class. news.execute(); //CheckNews class'ını çalıştırıp API'den verileri çekiyoruz. } return rootView; } catch (Exception e) { e.printStackTrace(); } return rootView; } class CheckNews extends AsyncTask<Object, Object, ArrayList<NewsMO>> { @Override protected ArrayList<NewsMO> doInBackground(Object... params) { //AsyncTask'in arkaplanında çalışan kısmı. try { ArrayList<NewsMO> modelList = new ArrayList<NewsMO>(); String line = ""; HttpClient httpClient = new DefaultHttpClient(); //Request için client oluşturuyoruz. HttpGet httpGet = new HttpGet("https://api.hurriyet.com.tr/v1/articles?$top=20"); //Hurriyet apiden kendi istediğiniz haberlere göre Request oluşturuyoruz buna Hurriyet API'nin dökümantasyonundan //bakabilirsiniz, biz son yayınlanan 20 haberi istedik. Request'i bu şekilde yapılandırıyoruz. httpGet.setHeader("accept", "application/json"); //Headerları ekliyoruz. httpGet.setHeader("apikey", "**************************"); //API Key'i buraya kopyalıyoruz. HttpResponse httpResponse = httpClient.execute(httpGet); //Get isteğini çalıştırıp response alıyoruz. InputStream is = httpResponse.getEntity().getContent(); //Gelen veriyi okumak için is nesnesine atıyoruz. InputStreamReader isr = new InputStreamReader(is); BufferedReader bf = new BufferedReader(isr); StringBuilder sb = new StringBuilder(); while ((line = bf.readLine()) != null) { //Veriyi satır satır okuyoruz. sb.append(line).append("\n"); //Veriyi satır satır sb'ye ekliyoruz. } isr.close(); String toString = sb.toString(); JSONArray haberler = new JSONArray(toString); //Gelen JSON haberler dizisini değişkene atıyoruz. for (int i = 0; i < haberler.length(); i++) { //JSON verilerini modelList dizisine aktarıyoruz. NewsMO model = new NewsMO(); JSONObject haber = haberler.getJSONObject(i); model.setId(haber.getString("Id")); model.setDescription(haber.getString("Description")); model.setTitle(haber.getString("Title")); model.setUrl(haber.getString("Url")); JSONArray resimler = haber.getJSONArray("Files"); if(resimler.length() == 0){ model.setImgUrl(null); } else { JSONObject resim = resimler.getJSONObject(0); model.setImgUrl(resim.getString("FileUrl")); } modelList.add(model); } return modelList; //modelList dizisini onPostExecute metoduna gönderiyor. } catch (IOException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } return null; } @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected void onPostExecute(ArrayList<NewsMO> result ) { //modelList'i alıyor, ListView'i oluşturuyor. super.onPostExecute(result); adapter = new ListAdapterNews(result, getActivity()); ListView listView = (ListView) getActivity().findViewById(R.id.listviewHaberler); listView.setAdapter(adapter); //Oluşan Adapter'ı ListView'in içine aktarıyoruz. } } } |
Projenin gradle kısmına picasso ve httpClient kütüphaneleri eklenmelidir. Ayrıca manifest dosyasına internet izni ve ACCESS_NETWORK_STATE verilmesi gerekmektedir.
Ayrıca projenin çalışır haline github üzerinden ulaşabilirsiniz.
Projemizde Hürriyet API’yi bu şekilde kullanıyoruz. Soru ve görüşleriniz için yorum bırakabilirsiniz.
2 comments
Hoş olmuş 🙂
Teşekkürler 🙂