2013-02-27 12 views
7

के साथ दो सूची दृश्यों को सिंक करना मैं एक तरफ से GridView की तरह ListViews कार्य दोनों तरफ से बनाने की कोशिश कर रहा हूं। कारण मैं ग्रिड व्यू का उपयोग नहीं कर रहा हूं क्योंकि स्टैगर्ड लुक के लिए कोई समर्थन नहीं है। वैसे भी, मैं कोड निम्नलिखित अब तक राशि: - पुराना, अब अप्रासंगिक कोड -एंड्रॉइड

<>

संपादित करें:

मैंने किया था के रूप में @Sam सुझाव दिया और निम्न कोड का प्रयोग किया:

lv1.setOnTouchListener(new OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       if (touchSource == null) { 
        touchSource = v; 
       } 

       if (v == touchSource) { 
        lv2.dispatchTouchEvent(event); 
        if (event.getAction() == MotionEvent.ACTION_UP) { 
         clickSource = v; 
         touchSource = null; 
        } 
       } 

       return false; 
      } 
     }); 

     lv1.setOnItemClickListener(new OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, 
        int position, long id) { 
       if (parent == clickSource) { 
           //my own code here 

       } 
      } 
     }); 

     lv1.setOnScrollListener(new OnScrollListener() { 
      @Override 
      public void onScroll(AbsListView view, int firstVisibleItem, 
        int visibleItemCount, int totalItemCount) { 
       if (view == clickSource) { 


       } 
       boolean loadMore = /* maybe add a padding */ 
       firstVisibleItem + visibleItemCount + 10 >= totalItemCount; 

       if (loadMore) { 
        //add items, load more 
       } 
      } 

      @Override 
      public void onScrollStateChanged(AbsListView view, int scrollState) { 
      } 
     }); 

     lv2.setOnTouchListener(new OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       if (touchSource == null) { 
        touchSource = v; 
       } 

       if (v == touchSource) { 
        lv1.dispatchTouchEvent(event); 
        if (event.getAction() == MotionEvent.ACTION_UP) { 
         clickSource = v; 
         touchSource = null; 
        } 
       } 

       return false; 
      } 
     }); 
     lv2.setOnItemClickListener(new OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, 
        int position, long id) { 
       if (parent == clickSource) { 
       } 
      } 
     }); 

     lv2.setOnScrollListener(new OnScrollListener() { 
      @Override 
      public void onScroll(AbsListView view, int firstVisibleItem, 
        int visibleItemCount, int totalItemCount) { 
       if (view == clickSource) { 

       } 
       boolean loadMore = /* maybe add a padding */ 
       firstVisibleItem + visibleItemCount + 2 >= totalItemCount; 

       if (loadMore) { 

       } 

      } 

      @Override 
      public void onScrollStateChanged(AbsListView view, int scrollState) { 
      } 
     }); 

मैं स्टैगर्ड प्रभाव बनाने के लिए सूचियों में से एक पर शीर्षलेख का भी उपयोग कर रहा हूं और मुझे हर कीमत पर इस स्टैगर को रखने की आवश्यकता है। यह ज्यादातर काम कर रहा है (उपर्युक्त कोड) लेकिन यह बहुत समय से unsyncs। मैंने यह पता लगाया है कि यह केवल तभी होता है जब मेरे पास छोटे छोटे स्वाइप होते हैं। मुझे यकीन नहीं है क्यों, और मुझे एक अच्छा समाधान नहीं मिल रहा है। ऐसा लगता है कि उपर्युक्त तर्क काम करना चाहिए।

इसके अलावा, अगर यह मायने रखता है, तो मैं फ़ोटो लोड करने के लिए यूनिवर्सल इमेजलोडर का उपयोग कर रहा हूं और अधिक तस्वीरें लोड करने के लिए एक सरल एंडलेस स्क्रॉल तर्क (सीधे adapter.notifyDataSetChanged()) को कॉल कर रहा हूं। हालांकि यह सामान बहुत प्रासंगिक प्रतीत नहीं होता है। यहां तक ​​कि जब फ़ोटो लोड हो जाती हैं, तब भी मैं इसे असंसमित देख सकता हूं।

मैं स्पष्ट होना चाहता हूं: यदि मैं छोटी स्वाइप करता हूं (और कभी-कभी केवल सामान्य बार-बार स्क्रॉलिंग में) मैं इच्छानुसार सूचियों को रद्द कर सकता हूं।

किसी भी मदद की सराहना की जाती है। धन्यवाद।

संपादित करें 2:

फिर भी एक अच्छा समाधान खोजने के लिए।

  • ऊपर समाधान: unsyncs अभी तक भी अक्सर
  • Pinterest List View: कोई OnScrollListener/onItemClick भेदभाव
  • StaggeredGridView: नहीं onScrollListener
  • Stag Project यहाँ समाधान है कि मैं पाया है नहीं काफी काम करना है कि कर रहे हैं : नहीं onItemClick श्रोता
  • Linear Layout Method: नहीं onItemClick श्रोता

कोई विचार? धन्यवाद।

+0

स्पष्ट रूप से Pinterest इस तरह के एक लेआउट का उपयोग करता है, यदि आप यहां ["एंड्रॉइड पिन रुचि"] (http://stackoverflow.com/search?q= [android] + pinterest) के लिए स्टैक ओवरफ़्लो पर खोज करते हैं तो आप विभिन्न दृष्टिकोण पा सकते हैं। – Sam

+0

हां, मुझे एहसास है कि। मैं भी बहुत कुछ शोध कर रहा हूं। मुझे वास्तव में Pinterest स्टाइल ग्रिड, https://github.com/vladexologija/PinterestListView पर किसी अन्य उत्तर से इस स्रोत का हिस्सा मिला, लेकिन मुझे नहीं लगता कि यह स्क्रॉल करने के लिए प्रासंगिक इटैमक्लिक और टचवेन्ट्स पर अंतर करने की मेरी समस्या को हल करता है। – Kgrover

+1

मैंने कभी भी Pinterest ऐप का उपयोग नहीं किया है, लेकिन जब किसी ने पूछा: [एंड्रॉइड। एक साथ स्क्रॉलिंग 2 सूचीदृश्य] (http://stackoverflow.com/q/12342419/1267661) मैं ऐसे समाधान के साथ आया जो आपकी मदद कर सकता है। (यह आपके इच्छित क्लिकों को संभालता है, लेकिन कभी-कभी सिंक्रनाइज़ेशन ब्रेक ...) – Sam

उत्तर

2

ठीक है, इसलिए मैंने Linear Layout Method (प्रश्न देखें) का उपयोग करके समाप्त किया और ऑनटैक्लिक लिस्टनर काम करने के लिए सेटटाग का उपयोग किया, और अनंत सूची काम करने के लिए कस्टमस्क्रोलव्यू कार्यान्वयन का उपयोग किया।

मूल रूप से, स्क्रॉलव्यू के अंदर, दो रैखिक स्तर क्षैतिज रूप से रुक गए। यह बल्कि अच्छी तरह से काम करता है, और बहुत तेजी से लोड करता है।

इसके अलावा, अगर मेरी मदद की गई तो SmartImageView मेरी छवियों को लोड करने के लिए।

अगर कोई कोड चाहता है, तो मैं इसके कुछ हिस्सों को पोस्ट करने में सक्षम हो सकता हूं।

+0

अच्छा! सुनकर अच्छा लगा –

1

ऑन टच सुनने के बजाए आप ListViews के ऑनक्रॉल श्रोता में सूचियों को क्यों स्क्रॉल नहीं करते हैं। यही वह पुस्तकालय है जिसका उपयोग मैं लिस्ट व्यू के स्क्रॉल को ट्रैक करता हूं और यह एक आकर्षण की तरह काम करता है। इस फाइल को देखें। https://github.com/JlUgia/list_moving_container/blob/master/src/com/ugia/listmovingcontainer/fragment/BottomListMovingContainerFragment.java

विशेष रूप से 81 पर ध्यान दें (वैश्विक लेआउट अद्यतनकर्ता श्रोता जोड़ने के लिए मत भूलना) और 89 (ऑनस्कोल श्रोता के साथ)। इस तरह आप क्लिक हैक के बारे में भी भूल सकते हैं।

अद्यतन

मैं इसे निम्न तरीके से कोड दूंगा।

lv1.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     updateListPosition(lv2, lv1); 
    } 
}); 

lv1.setOnScrollListener(new AbsListView.OnScrollListener() { 

    @Override 
    public void onScrollStateChanged(AbsListView view, int scrollState) { 
    } 

    @Override 
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
     updateListPosition(lv2, lv1); 
    } 
}); 

lv2.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     updateListPosition(lv1, lv2); 
    } 
}); 

lv2.setOnScrollListener(new AbsListView.OnScrollListener() { 

    @Override 
    public void onScrollStateChanged(AbsListView view, int scrollState) { 
    } 

    @Override 
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
     updateListPosition(lv1, lv2); 
    } 
}); 

private void updateListPosition(ListView updatedList, ListView scrolledList){ 
    updatedList.setScrollY(scrolledList.getScrollY()); 

} 

** setScrollY पहले से ही आपकी सूची को अमान्य कर देता है।

** ध्यान दें कि मैंने कोड का परीक्षण नहीं किया है। हालांकि यह काफी सरल होना चाहिए।

+0

मैं इसे आज़माउंगा। क्या आप मुझे अपने वर्तमान सिस्टम में इसे कार्यान्वित करने के तरीके पर और अधिक प्रतिक्रिया दे सकते हैं? मुझे आपके कोड में वास्तव में क्या हो रहा है और समांतर सूचियों को पूरा करने के लिए इसका उपयोग कैसे कर सकता है, यह तय करने में कठिनाई हो रही है। हालांकि उत्तर के लिए धन्यवाद, यह एक स्टम्पर है। – Kgrover

+0

इसके अलावा- आपका कोड वास्तव में क्या करता है? क्या यह समानांतर फैशन में _2_ सूचियों को स्क्रॉल करता है? – Kgrover

+0

कोई सूची की स्क्रॉलिंग स्थिति पर निर्भर फ़ंक्शन के आधार पर कोई दृश्य (सूची का पाद लेख) स्क्रॉल नहीं करता है। आपके मामले के लिए मैं आपकी दोनों सूची के लिए श्रोता (GlobalLayoutListener और onScrollListener) दोनों को लागू करता हूं, उनमें से प्रत्येक में अन्य सूची अपडेट करता है। मुझे एक उदाहरण के साथ अपना जवाब अपडेट करने दें। –