2015-05-29 12 views
5

के साथ RealmBaseAdapter मैं एंड्रॉइड के लिए realm डेटा स्टोर का उपयोग करने की कोशिश कर रहा हूं और मैं एक ऐसा एप्लिकेशन बनाने की कोशिश कर रहा हूं जो उपयोगकर्ता को ListView में विकल्पों की एक सूची दिखाता है, जैसे उपयोगकर्ता संपर्क सूची की तरह। प्रत्येक खंड (जैसे ए, बी, सी, आदि) के लिए पहला अक्षर एक शीर्षलेख होना चाहिए। RealmBaseAdapter के साथ इसे प्राप्त करने का कोई तरीका है?सेक्शन हेडर

वर्तमान में मेरे पास ArrayAdapter के साथ काम कर रहा है और मेरे पास बस मूल्यवान मूल्यों के साथ एक सरणी है लेकिन यदि संभव हो तो अपने एडाप्टर का उपयोग करके रीयल से डेटा खींचना चाहूंगा। मुझे आईओएस में पता है कि यह NSFetchedResultsController का उपयोग कर काफी सीधे आगे है। हम RealmResults को अनुभागों में कैसे विभाजित करते हैं?

उत्तर

2

RealmBaseAdapter ExpandableListAdapter (जो मुझे लगता है कि आप अनुभागों के लिए उपयोग कर रहे हैं?) के साथ काम नहीं करते हैं, तो अभी आपका एकमात्र विकल्प अपना स्वयं का कार्यान्वयन बना रहा है। लेकिन एक RealmResults भी एक सूची है, इसलिए यह एक ArrayAdapter के साथ निर्बाध रूप से काम करना चाहिए। https://github.com/realm/realm-java/issues/978

+0

भविष्य के लिए योजना में इस है

तुम भी यहां और विवरण देख सकते हैं? मैं इसे सूची के माध्यम से कर सकता हूं। लेकिन मुद्दा यह होता है कि जब आपके पास बहुत बड़ी सूची (10,000+ आइटम) होती है, तो इसे इस तरह से करने में सक्षम नहीं होता है। – KVISH

+0

हमारे पास कोई मौजूदा योजना नहीं है, लेकिन मैं बेसएक्सपैंडेबल लिस्ट एडाप्टर के दायरे संस्करण के लिए उपयोग केस देख सकता हूं जिसे इस तरह के लिए आवश्यक होगा। मैंने इसे हमारे बैकलॉग में जोड़ा है: https://github.com/realm/realm-java/issues/1199 –

0

यह मैं क्या उपयोग है:

package com.poterion.android.library.adapters 

import android.widget.BaseExpandableListAdapter 
import io.realm.* 

/** 
* @author Jan Kubovy <[email protected]> 
*/ 
abstract class RealmExpandableListAdapter<out Group : Any, Item : RealmModel>(
     private val itemGroupsProvider: (Item) -> Collection<Group?>, 
     private val groupsProvider: (Collection<Item>) -> List<Group?>, 
     private var adapterData: OrderedRealmCollection<Item>?) : BaseExpandableListAdapter() { 
    private val listener: RealmChangeListener<OrderedRealmCollection<Item>>? 

    protected val groups: List<Group?> 
     get() { 
      return adapterData?.takeIf { isDataValid }?.let(groupsProvider) ?: emptyList() 
     } 

    private val isDataValid: Boolean 
     get() = adapterData?.isValid == true 

    init { 
     if (adapterData?.isManaged == false) 
      throw IllegalStateException("Only use this adapter with managed list, for un-managed lists you can just use the BaseAdapter") 
     this.listener = RealmChangeListener { notifyDataSetChanged() } 
     adapterData?.takeIf { isDataValid }?.also { addListener(it) } 
    } 

    private fun addListener(data: OrderedRealmCollection<Item>) { 
     when (data) { 
      is RealmResults<Item> -> data.addChangeListener((listener as RealmChangeListener<RealmResults<Item>>)) 
      is RealmList<Item> -> data.addChangeListener((listener as RealmChangeListener<RealmList<Item>>)) 
      else -> throw IllegalArgumentException("RealmCollection not supported: " + data.javaClass) 
     } 
    } 

    private fun removeListener(data: OrderedRealmCollection<Item>) { 
     when (data) { 
      is RealmResults<Item> -> data.removeChangeListener((listener as RealmChangeListener<RealmResults<Item>>)) 
      is RealmList<Item> -> data.removeChangeListener((listener as RealmChangeListener<RealmList<Item>>)) 
      else -> throw IllegalArgumentException("RealmCollection not supported: " + data.javaClass) 
     } 
    } 

    override fun getGroupCount(): Int = groups.size 

    override fun getChildrenCount(groupPosition: Int): Int = adapterData?.takeIf { isDataValid }?.let { data -> 
     val g = groups[groupPosition] 
     data.filter { g == null || groups(it).contains(g) }.size 
    } ?: 0 

    override fun getGroup(groupPosition: Int): Group? = if (groups.size > groupPosition) groups[groupPosition] else null 

    override fun getChild(groupPosition: Int, childPosition: Int): Item? = children(groupPosition) 
     .takeIf { it.size > childPosition }?.get(childPosition) 

    override fun notifyDataSetChanged() { 
     super.notifyDataSetChanged() 
    } 

    private fun children(groupPosition: Int): List<Item> { 
     return getGroup(groupPosition) 
        ?.let { g -> adapterData?.takeIf { isDataValid }?.filter { groups(it).contains(g) } } ?: emptyList() 
    } 
} 

और उपयोग:

class PersonListAdapter(realm: Realm) : 
     RealmExpandableListAdapter<String, Person>(
       itemGroupsProvider = { person -> arrayOf(person.group, null) }, 
       groupsProvider = { people -> people.map { it.group } }, 
       adapterData = realm.where(Person::class.java) 
         .findAllSortedAsync("lastName", Sort.ASCENDING, "firstName", Sort.ASCENDING)) { 

    override fun getGroupId(groupPosition: Int) = getGroup(groupPosition).id 

    override fun getChildId(groupPosition: Int, childPosition: Int) = getChild(groupPosition, childPosition).id 

    override fun hasStableIds() = true 

    override fun getGroupView(groupPosition: Int, isExpanded: Boolean, convertView: View?, parent: ViewGroup?): View { 
     // ... Item View here ... 
    } 

    override fun getChildView(groupPosition: Int, childPosition: Int, isLastChild: Boolean, 
           convertView: View?, parent: ViewGroup?): View { 
     // ... Group View here ... 
    } 

    override fun isChildSelectable(groupPosition: Int, childPosition: Int) = true 
} 
संबंधित मुद्दे