2017-06-11 29 views
7

के साथ रीसाइक्लर व्यू अपडेट करें लाइवटाटा परिवर्तन पर एडाप्टर में नई सूची को कैसे धक्का देना है, इसके कई उदाहरण हैं।एंड्रॉइड लाइवडाटा

मैं बड़ी सूची में एक पंक्ति (जैसे पोस्ट के लिए टिप्पणियों की संख्या) को अपडेट करने का प्रयास कर रहा हूं। केवल एक फ़ील्ड को बदलने के लिए पूरी सूची रीसेट करने के लिए बेवकूफ होगा।

मैं पर्यवेक्षक onBindViewHolder जोड़ने में सक्षम हूँ, लेकिन मैं नहीं समझ सकता है जब मैं पर्यवेक्षक

@Override 
public void onBindViewHolder(ViewHolder vh, int position) { 
    Post post = getPost(position); 
    vh.itemView.setTag(post); 
    post.getLiveName().observeForever(vh.nameObserver); 
    ... 
} 

उत्तर

4

निकाल देना चाहिए DiffUtil का उपयोग करते हुए एक विशाल सूची में एक पंक्ति को अद्यतन करने के साथ मदद कर सकता है। इसके बाद आप लाइवडाटा को एक टिप्पणी या टिप्पणी की विशेषता के बजाय टिप्पणियों की सूची लपेट सकते हैं।

यहां RecyclerView adapter और list LiveData observation code in the fragment के भीतर डिफ्यूट का उपयोग करने का एक उदाहरण दिया गया है।

+1

हाय लायला में, "टुकड़ा में सूची LiveData Observaion कोड" करने के लिए अपने लिंक काम नहीं कर रहा है। इसमें यूआरएल में "/ ui /" गुम है। सही यूआरएल [ProductListFragment.java # L75] है (https://github.com/googlesamples/android-architecture-components/blob/master/BasicSample/app/src/main/java/com/example/android/persistence/ ui/ProductListFragment.java # L75) - ल्यूक – lukegjpotter

+0

लिंक फिक्स्ड! धन्यवाद! – Lyla

6

की तरह @ लिला ने कहा, आपको परिवर्तन प्राप्त करते समय पूरी सूची को फ्रैगमेंट या गतिविधि में लाइवडाटा के रूप में देखना चाहिए, आपको पूरी सूची को डिफ्यूट द्वारा एडाप्टर पर सेट करना चाहिए।

नकली कोड:

PostViewModel { 
    LiveData<List<Post>> posts; // posts comes from DAO or Webservice 
} 

MyFragment extends LifecycleFragment { 
    PostAdapter postAdapter; 

    ... 

    void onActivityCreated() { 
     ... 
     postViewModel.posts.observer(this, (postList) -> { 
      postAdapter.setPosts(postList); 
     } 
    }  
} 

PostAdapter { 
    void setPosts(List<Post> postList) { 
     DiffUtil.DiffResult result = DiffUtil.calculateDiff(new DiffUtil.Callback() {...} 
     ... 
    } 
} 
0

उपयोग Transformations.switchMap() अंतर्निहित Post वस्तु स्वैप करने के लिए। फिर कोशिका का पुनर्नवीनीकरण होने पर पर्यवेक्षकों को हटाने और फिर से जोड़ने की आवश्यकता नहीं है।

@Override 
public void onBindViewHolder(PostViewHolder vh, int position) { 
    Post post = getPost(position); 
    vh.bind(post); 
} 

फिर अपने ViewHolder वर्ग

public class PostViewHolder extends RecyclerView.ViewHolder { 
    private final MutableLiveData<Post> post = new MutableLiveData<>(); 

    public PostViewHolder(View itemView) { 
     super(itemView); 

     LiveData<String> name = Transformations.switchMap(post, new Function<Post, LiveData<String>>() { 
      @Override 
      public LiveData<String> apply(Post input) { 
       return input.getLiveName(); 
      } 
     }); 

     name.observeForever(new Observer<String>() { 
      @Override 
      public void onChanged(@Nullable String name) { 
       // use name 
      } 
     }); 
    } 

    public void bind(Post post) { 
     post.setValue(post); 
    } 
} 
संबंधित मुद्दे