7

Uygulamamın ayarlandığı yol, kullanıcılar tarafından gönderilen yayınların bir CursorLoader tarafından korunan bir ListView'ime sahip olduğudur. Her gönderinin, onunla ilişkili kullanıcı yorumları vardır. Her bir listenin alt kısmında, yorumların kaydırılabileceği özel bir metin görünümü vardır (sağ veya sol kaydırma ile). Özel metin görüntülerinin her birinde, kendi gönderisiyle ilişkili yorumların bir listesi bulunur. Öğeler hariç Google+ uygulamasındaki yorumlar gibi kaydırılabilir. Yorumlar, yazılardan ayrı bir veritabanı tablosunda saklanır.Her Liste öğesinin birden çok ilişkiye sahip olduğu bir ListView bakımı

Yapmakta olduğum sorun, BindView'a her zaman veritabanını sorguladığımı ve ilgili imleci bir imleci aldığımı ve özel metin görüntüleme listesine eklediğimi ifade etmesidir. Bu, her bir öğe için yorumlar veritabanı tablosunu sorgulamak için gerçekten yetersiz görünüyor. Bu yüzden bunu halletmenin en iyi yolu olup olmadığını merak ediyorum.

public void bindView(View view, Context context, Cursor cursor) 
    final String rowid = cursor.getString(cursor.getColumnIndexOrThrow(Database.ROWID)); 

    Cursor commentcursor = c.getContentResolver().query(DatabaseProvider.CONTENT_URI_COMMENTTABLE, freeWriteCommentColumns, Database.PARENTPOSTROWID + " =?", new String[]{rowid}, null); 

    commentcursor.moveToFirst(); 
    while (commentcursor.isAfterLast() == false){ 
      //get comment 
      //add to comment text view list 
      } 

Ben CursorJoiners içine baktım ama kullanışlı görünmüyor: My kod şöyle görünür. JOINS ile oynadım ama bu, satır sayısını olması gerekenden daha büyük yapıyor. Şu anda adaptör oluşturulduğunda ve global değişken olarak ayarlandığında oluşturulan yorum tablosu imleci için bir tutucu ile oynuyorum. Bu iyi bir cadde gibi gözüküyor çünkü her seferinde isteme gerek yok. Bu durumu nasıl halledeceğimi bilemiyorum.

+0

Neredeyse aynı bir senaryo ile karşılaşıyorum ve çözümlerin hiçbiri zarif görünmüyor. Bunu zorlaştıran şey, ana liste öğelerinin en yenisi olarak sipariş edilmesi ve herhangi bir zamanda değişebilmesidir (yeni girişler görünebilir). Bir CursorLoader yaklaşımı kullanmak, initLoader() kimliğine sahip bir satırın konumuyla ilk düşüncemdi. Bu, yeni bir giriş ulaştığında başarısız olur - eski pozisyon 0 için yükleyici işaretlenir ve şimdiki pozisyon 1 için sonuçlar döndürür. Yönetilen imleç rotasına gitmem gerekebilir gibi görünüyor. – tbm

+0

Bunun için asla gerçek bir çözüm bulamadım. İlk 5 yorum için posta veritabanım tablosuna birkaç tane daha sütun ekledim. Bu yüzden ilk 5 yorum çevrilebildiğinden ve kullanıcının daha fazlasını görüntülemek istediğinde daha fazla yorum düğmesini tıklamasını istedim. Gelecekte bunu tekrar gözden geçirmeye çalışacağım ama şimdilik bu çözüm işe yarıyor – Papajohn000

+0

En son söylediğin şeyi yap, adaptörle ilgili yorumlarla bir liste oluştur, sonra her seferinde tekrar sorgulamana gerek yok . Bir tür önbellek yapmak, sadece en son yorumları göstererek çalışmayı genişletebilirsiniz. Bağdaştırıcıda tutulduğunda yorumların sorgulanması. – Sulfkain

cevap

1

Bunu denediğimi biliyorum ama gitmenin yolu budur. Neredeyse aynı sorun vardı, daha büyük bir tane bile JOIN ve daha sonra bir MergeCursor ile oldu. Ancak sorununuza geri dönelim: bindView() kullanıcı arabiriminde çağrılır ve kullanıcı arabiriminde DB çağrıları yaparsınız, bu kötü bir uygulamadır ve bunun üzerine tüm imleç üzerinde çalışıyorsunuzdur. Ben post için sorgu JOIN olurdu ve yükleme SQL seviyesinde yorum yapmak ve daha sonra sadece mesajlar ve yorumlar için bir imleç kullanır ve her şey çok daha iyi olurdu.

Dize SQL düzeyinde nasıl uyulur? tüm yorumlar birlikte mi? peki bu cevabımı görüp düzenleyeceğim.