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: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Android Projesi - RSS / ListView / PARSE

Mesaj gönderen mrmarman »

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 ....Resim
mehmetantalya
Üye
Mesajlar: 189
Kayıt: 30 Eyl 2013 10:17

Re: Android Projesi - RSS / ListView / PARSE

Mesaj gönderen mehmetantalya »

Allah razi olsun.
hakanoguzer
Üye
Mesajlar: 44
Kayıt: 15 Kas 2013 10:22

Re: Android Projesi - RSS / ListView / PARSE

Mesaj gönderen hakanoguzer »

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: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Android Projesi - RSS / ListView / PARSE

Mesaj gönderen mrmarman »

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 ....Resim
hakanoguzer
Üye
Mesajlar: 44
Kayıt: 15 Kas 2013 10:22

Re: Android Projesi - RSS / ListView / PARSE

Mesaj gönderen hakanoguzer »

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: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Android Projesi - RSS / ListView / PARSE

Mesaj gönderen mrmarman »

Ş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 ....Resim
hakanoguzer
Üye
Mesajlar: 44
Kayıt: 15 Kas 2013 10:22

Re: Android Projesi - RSS / ListView / PARSE

Mesaj gönderen hakanoguzer »

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 »

Merhaba
mrmarman hocam listview içindeki yazıları nasıl renklendirebiliriz ?
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Android Projesi - RSS / ListView / PARSE

Mesaj gönderen mrmarman »

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 ....Resim
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7586
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Re: Android Projesi - RSS / ListView / PARSE

Mesaj gönderen mussimsek »

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 »

Teşekkürler.
Hashirama
Üye
Mesajlar: 81
Kayıt: 26 Kas 2013 03:42

Re: Android Projesi - RSS / ListView / PARSE

Mesaj gönderen Hashirama »

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 07:36
İletişim:

Re: Android Projesi - RSS / ListView / PARSE

Mesaj gönderen gaus »

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 »

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 05:43
İletişim:

Re: Android Projesi - RSS / ListView / PARSE

Mesaj gönderen barisatalay »

Şeklinde alabilirsiniz. Data4 Eklenen objenin adı.

Kod: Tümünü seç

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