Android Projesi - RSS / ListView / PARSE

FireMonkey ve Mobil uygulama (iOS, Android, Windows Phone) ile ilgili sorularınızı bu foruma sorabilirsiniz.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4715
Kayıt: 09 Ara 2003 08:13
Konum: Ankara
İletişim:

Android Projesi - RSS / ListView / PARSE

Mesaj gönderen mrmarman » 12 Oca 2014 02:17

Merhaba.

- Sizlere tam bir proje hazırladım. Diğer sitede sorulan bir soru üzerine bunu tam bir proje halinde sunarak Android konusundaki kaynak kodu sıkıntısına bir nebze faydamız dokunsun istedik. :idea:

* Kendim de bazı şeyler denemek istedim. Mesela WEB'den getirdiğim JPG'yi Bitmap'e nasıl atarım diye düşünüyordum, Android altında sürpriz bir şekilde Bitmap yapı JPEG'i direkt kabul etti. :bravo:

* Ekran süsüne dikkat etmiyorum. Son (1) saatlik bir çalışma sonuçta. Sadece bu başlığı okuyanlara method hakkında fikir vermek için hazırladım.

* Amaç bu projeyi herkes incelesin, Android'den artık korkmasın. Web'de dolaşıyorum allahın kulu herhangi bir konuda tek bir örnek kaynak kod bile koymamış ... Amerika'yı yeniden keşfetmek zorunda kalıyoruz.

* Sistem
(1) IdHttp ile RSS linkinden XML veriyi alıyor,
(2) PARSE ediyor,
(3) ListView'e Item açıyor,
(4) Item altında Text alanlar oluşturuyor (birden fazla)
(5) Veriyi basıyor.
(6) Bir Image nesnesi açıyor
(7) Bu arada Parse edilen Description alanındaki SRC ile JPEG Image linki çekiliyor.
(8) IdHttp ile bu link MemoryStream'e download ediliyor.
(9) Image nesnesine Stream üzerinden aktarılıyor. (fiziksel dosya kullanılmadan)
(10) Bu arada ProgressBar var aşağıda o %100 oluyor ve gizleniyor.

(11) Herhangi bir ITEM üzerine tek tık dokunulduğunda o link Cihazın Browserinde açılıyor.

Kısa zamanda çok iş yaptırdık... :bravo:

Kod: Tümünü seç

procedure RSS_Parse( ListView:TListView; IdHttp:TIdHttp; Progress:TProgressBar );
  Procedure ObjectOlustur( AItem:TListViewItem; LItem: TListItemText; strRefKod, strText:String; iOffsetX, iOffsetY, iWidth,iHeight, iFontSize:Integer; iFontColor: LongInt );
  begin
    LItem                := TListItemText.Create(AItem);
    LItem.Name           := strRefKod;
    LItem.Font.Size      := iFontSize;
    LItem.TextColor      := iFontColor;
    LItem.Align          := TListItemAlign.Leading; // En Sol
    LItem.VertAlign      := TListItemAlign.Leading; // En Üst
    LItem.PlaceOffset.X  := iOffsetX;
    LItem.PlaceOffset.Y  := iOffsetY;
    LItem.TextAlign      := TTextAlign.taLeading;
    LItem.Trimming       := TTextTrimming.ttCharacter;
    LItem.IsDetailText   := True;
    LItem.Width          := iWidth;
    LItem.Height         := iHeight;
    LItem.Text           := strText;
  end;

Const
  URL = 'http://www.turkanime.tv/rss.xml';
Type tBilgi = Record
  strTitle,
  strLink,
  strDescription,
  strPubDate,
  strAuthor,
  strGuid : String;
end;
Var
  strIcerik,
  strAra,
  strGecici,
  strBlok : String;
  Bilgi   : tBilgi;
  AItem   : TListViewItem;
  LImage  : TListItemImage;
  LData1,  LData2,  LData3,  LData4,
  LLabel1, LLabel2, LLabel3  : TListItemText;
  MS : TMemoryStream;
  iSayac : Integer;
begin
  ListView.ClearItems;
  strIcerik := IdHttp.Get( URL );

  // Sadece Kaç Başık var onu sayıcaz. Progressbar için ön çalışma...
  strGecici := strIcerik;
  iSayac    := 0;
  strAra := '<item>';
  while Pos(strAra, strGecici) > 0 do
  begin
    System.Delete( strGecici, 1, Pos(strAra, strGecici) + Length(strAra)-1 );
    inc(iSayac);
  end;
  if Progress <> nil then
  begin
    Progress.Min := 0;
    Progress.Max := iSayac;
    Progress.Visible := True;
  end;
  iSayac := 0;
  while Pos('<item>', strIcerik) > 0 do
  begin
    Application.ProcessMessages;
    inc(iSayac);
    if Progress <> nil then Progress.Value := iSayac;

    strAra := '<item>';
    System.Delete( strIcerik, 1, Pos(strAra, strIcerik) + Length(strAra)-1 );
    strAra := '</item>';

    // strBlok içerisinde bir başlık ve bilgileri olacaktır...
    strBlok := Copy(strIcerik, 1, Pos( strAra, strIcerik ) + Length(strAra)-1 );

    FillChar( Bilgi, sizeOf(Bilgi), 0 );
    strAra := '<title>';
    if Pos( strAra, strBlok ) > 0 then
    begin
      strGecici := strBlok;
      System.Delete(strGecici, 1, Pos(strAra, strGecici) + Length(strAra)-1 );
      Bilgi.strTitle := Trim(Copy(strGecici, 1, Pos('<', strGecici)-1 ));
    end;

    strAra := '<link>';
    if Pos( strAra, strBlok ) > 0 then
    begin
      strGecici := strBlok;
      System.Delete(strGecici, 1, Pos(strAra, strGecici) + Length(strAra)-1 );
      Bilgi.strLink := Trim(Copy(strGecici, 1, Pos('<', strGecici)-1 ));
    end;

    strAra := '<description>';
    if Pos( strAra, strBlok ) > 0 then
    begin
      strGecici := strBlok;
      System.Delete(strGecici, 1, Pos(strAra, strGecici) + Length(strAra)-1 );
      strAra := 'src="';
      System.Delete(strGecici, 1, Pos(strAra, strGecici) + Length(strAra)-1 );
      Bilgi.strDescription := Trim(Copy(strGecici, 1, Pos('"', strGecici)-1 ));
    end;

    strAra := '<pubDate>';
    if Pos( strAra, strBlok ) > 0 then
    begin
      strGecici := strBlok;
      System.Delete(strGecici, 1, Pos(strAra, strGecici) + Length(strAra)-1 );
      Bilgi.strPubDate := Trim(Copy(strGecici, 1, Pos('<', strGecici)-1 ));
    end;

    strAra := '<author>';
    if Pos( strAra, strBlok ) > 0 then
    begin
      strGecici := strBlok;
      System.Delete(strGecici, 1, Pos(strAra, strGecici) + Length(strAra)-1 );
      Bilgi.strAuthor := Trim(Copy(strGecici, 1, Pos('<', strGecici)-1 ));
    end;

    strAra := '<guid>';
    if Pos( strAra, strBlok ) > 0 then
    begin
      strGecici := strBlok;
      System.Delete(strGecici, 1, Pos(strAra, strGecici) + Length(strAra)-1 );
      Bilgi.strGuid := Trim(Copy(strGecici, 1, Pos('<', strGecici)-1 ));
    end;

    if Bilgi.strTitle <> '' then
    begin
      AItem := ListView.Items.Add;
      AItem.Height := 132;
      AItem.Text   := '';

      LImage                  := TListItemImage.Create(AItem);
      LImage.Name             := 'Resim';
      LImage.Align            := TListItemAlign.Trailing; // En Sağ
      LImage.VertAlign        := TListItemAlign.Center;   // Orta
      LImage.PlaceOffset.Y    := 2;
      LImage.PlaceOffset.X    := 0;
      LImage.Width            := 90;
      LImage.Height           := 128;
      LImage.OwnsBitmap       := True;
      LImage.Bitmap           := TBitmap.Create(0, 0);
      MS := TMemoryStream.Create;
        IdHttp.Get(Bilgi.strDescription, MS);
        MS.Seek(0,soFromBeginning);
        LImage.Bitmap.LoadFromStream(MS);
      MS.Free;

      // Başlıklar
      // -----------------------------------------------------------------------------
        ObjectOlustur( AItem, LLabel1, 'Bas1', 'Title:', 4, 20, 500, 20, 8, TAlphaColorRec.Maroon );
        ObjectOlustur( AItem, LLabel2, 'Bas2', 'PubDt:', 4, 40, 500, 20, 8, TAlphaColorRec.Black );
        ObjectOlustur( AItem, LLabel3, 'Bas3', 'Auth.:', 4, 60, 500, 20, 8, TAlphaColorRec.Black );
      // Veri Alanları
      // -----------------------------------------------------------------------------
        ObjectOlustur( AItem, LData1, 'Data1', Bilgi.strTitle,       54,  20, 500, 20, 8, TAlphaColorRec.Maroon );
        ObjectOlustur( AItem, LData2, 'Data2', Bilgi.strPubDate,     54,  40, 500, 20, 8, TAlphaColorRec.Black );
        ObjectOlustur( AItem, LData3, 'Data3', Bilgi.strAuthor,      54,  60, 500, 20, 8, TAlphaColorRec.Black );
        ObjectOlustur( AItem, LData4, 'Data4', Bilgi.strLink,        04, 100, 500, 20, 8, TAlphaColorRec.Black );
     end;
  end; // While
  if Progress <> Nil then Progress.Visible := False;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  AniIndicator1.Visible := True;
  RSS_Parse( ListView1, IdHTTP1, ProgressBar1 );
  AniIndicator1.Visible := False;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  IdHttp1.Disconnect;
  // Bizim Close()'un Android karşılığı...
  // USES FMX.Platform.Android
  // MainActivity.Finish();
  FMX.Platform.Android.MainActivity.finish();
end;

procedure TForm1.ListView1ItemClick(const Sender: TObject;
  const AItem: TListViewItem);
var
  Intent : JIntent; // Androidapi.JNI.GraphicsContentViewText
  strURL : String;
begin
  Intent := TJIntent.Create;
  Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
  strURL := (AItem.Objects.FindObject('Data4') as TListItemText).Text;
  Intent.setData(StrToJURI( strURL ));
  SharedActivity.startActivity(Intent);
end;
Resim

Kaynak kodları ile proje bu linkte... :idea:
Resim Resim

mehmetantalya
Üye
Mesajlar: 172
Kayıt: 30 Eyl 2013 09:17

Re: Android Projesi - RSS / ListView / PARSE

Mesaj gönderen mehmetantalya » 12 Oca 2014 03:56

Allah razi olsun.

hakanoguzer
Üye
Mesajlar: 43
Kayıt: 15 Kas 2013 10:22

Re: Android Projesi - RSS / ListView / PARSE

Mesaj gönderen hakanoguzer » 12 Oca 2014 08:35

hocam senin uygulamadaki

ObjectOlustur( AItem, LData1, 'Data1', Bilgi.strTitle, 54, 20, 500, 20, 8, TAlphaColorRec.Maroon );

kodu ile sqlite e bağlamak ve field den veri çekmek mümkün mü?

böylelikle listview de bir den fazla alanı alt atla göstermek istiyorum da.

mesela

select musterikodu,adi,tel,cep,adres,email from cari

bunu
_____________________________________
Müşteri Adı:
Müşteri Adı:
Tel:
Cep:
Adres:
Email:
_____________________________________

şeklimde listview de göstermek istiyorum.


Bilgi.strTitle yerine fbquery1.fieldbyname('adres').asstring koymak yeterli mi acaba?

Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4715
Kayıt: 09 Ara 2003 08:13
Konum: Ankara
İletişim:

Re: Android Projesi - RSS / ListView / PARSE

Mesaj gönderen mrmarman » 12 Oca 2014 09:03

Tabii ki mümkün. :idea:

- SQL'den veriyi BindSourceDB/BindingsList metodu ile mi ListView'e yansıtıyorsun yoksa bu örnekteki gibi bir döngü içerisinde ITEM ekleyerek mi ?

- Item ekleyerek yapıyorsan bu örnekteki yapıyı aynen kullanıyorsun. Her veri kaydı için if Bilgi.strTitle <> '' then begin ile başlayan bloğun içerisindekileri kullanıyorsun.

- Eğer BindingsList ile otomatik yükleme yapıyorsan o zaman ListView'in OnFilledListItem eventinde yani her bir item'in oluştuğu anda yapıyorsun. Uygun zamanda BindingsList için de bir örnek yayınlarım. Elimdeki projeler daha komplike olduğundan ayıklamaktansa yeni proje oluşturmak daha kolay.

- Şimdi diğer forumda GPS/Net/Mobil Ağ ile elde edilen tam lokasyon bilgisini WSDL üzerinden Delphi desktop uygulamasına direkt besleyen bir soru geldi onu örnekleyip yayınlıyayacağım. Nöbette olduğum dönemlerde saat başı haberleri hariç çok boş vaktim oluyor. Tümüyle bir projeye ayıracak bir vaktim olamazken, böyle küçük projeler için 23:00 - 04:00 arası vaktim oluyor, böyle değerlendiriyorum.
Resim Resim

hakanoguzer
Üye
Mesajlar: 43
Kayıt: 15 Kas 2013 10:22

Re: Android Projesi - RSS / ListView / PARSE

Mesaj gönderen hakanoguzer » 12 Oca 2014 09:15

cok iyi olur.
cünkü
item.text e bind visually kullanarak field bağlıyorum.
ama listview de yanlızca bir item.text var, başka ekleyemiyorum.

Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4715
Kayıt: 09 Ara 2003 08:13
Konum: Ankara
İletişim:

Re: Android Projesi - RSS / ListView / PARSE

Mesaj gönderen mrmarman » 12 Oca 2014 09:38

Şimdi şunu deneyin,
:idea: (1) ListView'in OnUpdateObjects EVENT'ine gidin.
:idea: (2) Sonra da orada AItem.Height := 100; komutunu girin. Bakın neler oluyor. ITEM'i kendi istediğiniz şekilde genişlettiniz.
:idea: (3) Sonra bu başlıkta verdiğim ObjectOlustur procedure örneğini kullanacağınız eventtir yine burasıdır. Burada ITEM'i şekillendiriyoruz, alanlar ekliyoruz, labellar ekliyoruz vs. :idea:
:idea: (4) BindSourceDB'den beslenen her verinin eklendiği yer olan; yukarıda bahsettiğim OnFilledListItem eventine gidip, bu eklediğini veri alanlarına bilgileri dolduruyorsunuz.

- Örnek yayınlayana kadar size temrin olsun diye yazıyorum bunları. Maksat işiniz görülsün. :bravo:
Resim Resim

hakanoguzer
Üye
Mesajlar: 43
Kayıt: 15 Kas 2013 10:22

Re: Android Projesi - RSS / ListView / PARSE

Mesaj gönderen hakanoguzer » 15 Oca 2014 12:35

hocam listview bildsource (veritabanından) cekip bahsettiğiniz şekilde daha fazla bilginin itemtext alanlarında görüntüllemesini yaparsanız çok harıka olacak.

bir müşteri kartı yada stok kartı üzerinden de olabilir.

Hashirama
Üye
Mesajlar: 81
Kayıt: 26 Kas 2013 03:42

Re: Android Projesi - RSS / ListView / PARSE

Mesaj gönderen Hashirama » 25 May 2014 10:25

Merhaba
mrmarman hocam listview içindeki yazıları nasıl renklendirebiliriz ?

Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4715
Kayıt: 09 Ara 2003 08:13
Konum: Ankara
İletişim:

Re: Android Projesi - RSS / ListView / PARSE

Mesaj gönderen mrmarman » 25 May 2014 10:58

Daha önce arada kaynamış söylemeyi unutmuşum tabii... Kodlarını hiç değiştirmeden verdiğim şekilde ObjectOlustur procedure kullanabilirsin. Zaten renkler oraya iFontColor üzerinden geliyor. Sadece parametrelerden IsDetailText değeri false olsun kafidir.

Kod: Tümünü seç

  Procedure ObjectOlustur( AItem:TListViewItem; LItem: TListItemText; strRefKod, strText:String; iOffsetX, iOffsetY, iWidth,iHeight, iFontSize:Integer; iFontColor: LongInt );
  begin
    LItem                := TListItemText.Create(AItem);
    LItem.Name           := strRefKod;
    LItem.Font.Size      := iFontSize;
    LItem.TextColor      := iFontColor;
    LItem.Align          := TListItemAlign.Leading; // En Sol
    LItem.VertAlign      := TListItemAlign.Leading; // En Üst
    LItem.PlaceOffset.X  := iOffsetX;
    LItem.PlaceOffset.Y  := iOffsetY;
    LItem.TextAlign      := TTextAlign.taLeading;
    LItem.Trimming       := TTextTrimming.ttCharacter;
    LItem.IsDetailText   := False;
    LItem.Width          := iWidth;
    LItem.Height         := iHeight;
    LItem.Text           := strText;
  end;
Aynı proje üzerinden örnek vereyim...

Resim
Resim Resim

Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7432
Kayıt: 09 Haz 2003 11:26
Konum: İstanbul
İletişim:

Re: Android Projesi - RSS / ListView / PARSE

Mesaj gönderen mussimsek » 26 May 2014 12:35

Her zamanki gibi çok detaylı ve faydalı bir kaynak olmuş. Elinize sağlık...

Hashirama
Üye
Mesajlar: 81
Kayıt: 26 Kas 2013 03:42

Re: Android Projesi - RSS / ListView / PARSE

Mesaj gönderen Hashirama » 26 May 2014 08:28

Teşekkürler.

Hashirama
Üye
Mesajlar: 81
Kayıt: 26 Kas 2013 03:42

Re: Android Projesi - RSS / ListView / PARSE

Mesaj gönderen Hashirama » 26 Haz 2014 01:03

Merhaba

Listbox ta itemlerin Margins ayarlarını (10,10,10,10) şeklinde yapıp listbox ın itemlerinin her birini içine image koyup Align değerini Client yaptığımızda Listbox ın görünümü fotoğraftaki gibi daha güzel bir hale getirebiliyoruz.

Resim

Aynı şekilde Listview itemlerinin margins ayarlarını yaptırabilir miyiz?

Teşekkürler.

gaus
Üye
Mesajlar: 227
Kayıt: 14 May 2014 06:36
İletişim:

Re: Android Projesi - RSS / ListView / PARSE

Mesaj gönderen gaus » 01 Tem 2014 10:49

Muharrem hocam kolay gelsin
çok sağolun faydalandık ama benim şöyle bir sıkıntım var
ben bu procedurü kendi projeme uygulayamıyorum;
ben bir webserviceden xml çekip datayı oradan buraya aktarmak istiyorum aynı sizin gibi
nasıl yapmalıyım

Nemesis2005
Üye
Mesajlar: 136
Kayıt: 18 Oca 2005 05:24
Konum: İzmir

Re: Android Projesi - RSS / ListView / PARSE

Mesaj gönderen Nemesis2005 » 11 Eyl 2014 08:54

Merhaba
Muharrem hocam kolay gelsin
ObjectOlustur ile oluşturulan itemlerden biri seçildiğinde item değerlerini nasıl alacağız acaba
Her iyinin içinde bir Kötülük.Her Kötnün içide de bir iyilik vardır

Kullanıcı avatarı
barisatalay
Üye
Mesajlar: 398
Kayıt: 02 Nis 2013 04:43
İletişim:

Re: Android Projesi - RSS / ListView / PARSE

Mesaj gönderen barisatalay » 11 Eyl 2014 08:57

Şeklinde alabilirsiniz. Data4 Eklenen objenin adı.

Kod: Tümünü seç

var
  str : String;
begin
  strURL := (AItem.Objects.FindObject('Data4') as TListItemText).Text;

Cevapla