2008-11-20 8 views
32

के लिए एकाधिक सूची दृश्यों के साथ स्क्रॉलिंग मैं पूरी तरह से इस पर फंस गया हूं। मेरे पास तीन अलग-अलग सूचियां हैं जिन्हें स्क्रीन पर प्रदर्शित करने की आवश्यकता है। यह पूरी तरह से संभव है कि सूचियों को स्क्रीन के निचले किनारे से आगे बढ़ाया जाएगा, इसलिए मुझे स्क्रॉलिंग की आवश्यकता होगी।एंड्रॉइड

मैं एक ScrollView के साथ एक LinearLayout बच्चे का उपयोग कर, और डाल की कोशिश की है मेरी LinearView में ListViews, लेकिन स्क्रॉल बार के साथ एक निश्चित ऊंचाई करने के लिए ListViews ताला के सभी। अन्य प्रकार के लेआउट का उपयोग करना कोई स्क्रॉलिंग नहीं है।

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

उत्तर

6

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

दूसरा विचार सूचियों की सूची बनाना है। लेकिन यह मुसीबत मांगने की तरह लगता है।

+2

तीसरा विकल्प क्या है? क्योंकि मुझे उस विषय में भी दिलचस्पी है और मैंने सूची के लिए ListView दृष्टिकोण में ListViews करने का प्रयास किया है http://stackoverflow.com/questions/1526831/android-scrollview-layout-problem (alt मैंने आपका जवाब नहीं देखा है से पहले)। # एंड्रॉइड-देव पर लड़कों के साथ बात करते हुए, लिस्ट व्यू में लिस्ट व्यू को स्क्रॉलव्यू में डालने से भी बदतर है। (और मेरे परिणाम भी थे।) क्योंकि आपका पोस्ट युद्ध काफी समय पहले लिखा गया था, क्या आपने अब तक सभी सूची समाधान में कोशिश की है? – svens

-1

विस्तारणीय सूची दृश्य का उपयोग करें। जच एक समान प्रश्न यहाँ मेरा उत्तर: Android ScrollView layout problem

6

मैं बचाने कि मैं दो GridViews और एक ListView स्क्रॉल करने के लिए इसी तरह की समस्या थी। मैं इसे मैन्युअल listviews और GridView की ऊंचाई सेट करके किया:

ListAdapter listAdapter = listView.getAdapter(); 

    int rows = listAdapter.getCount()/columns; 
    int height = 60 * rows; // Insert the general cell height plus the dividers. 

    ViewGroup.LayoutParams params = listView.getLayoutParams(); 
    params.height = height; 
    listView.setLayoutParams(params); 
    listView.requestLayout(); 

आशा मैं किसी को मदद कर सकता है।

11

touched से आगे की टच ईवेंट अन्य विचारों को देखें। आपके सभी विचार सिंक्रनाइज़ किए जाएंगे/विस्तारित भी होंगे।

OnTouchListener mOnTouch = new OnTouchListener() 
    { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) 
     {    
      MotionEvent newEvent = MotionEvent.obtain(event); 
      switch(event.getAction()){ 
      case MotionEvent.ACTION_MOVE: 
       if(mTouched == null){ 
        mTouched = v; 
       } 
       mMovingFlag = true; 
       break; 
      case MotionEvent.ACTION_UP: 
       if(mMovingFlag==false){ 
        newEvent.setAction(MotionEvent.ACTION_CANCEL); 
       } 
       mMovingFlag = false; 
       break; 
      default: 
       mMovingFlag = false; 
       if(mTouched != null && mTouched.equals(v)){ 
        mTouched = null; 
       } 
       break; 

      } 
      if(mTouched == null || mTouched.equals(v)){ 
       int items = mLayoutWithListViews.getChildCount(); 
       for(int list=0; list<items; list++){ 
        AbsListView listView =mLayoutWithListViews.getChildAt(list)); 
        if(listView != v){ 
         listView.onTouchEvent(newEvent); 
        } 
       } 
      } 
      return false; 
     } 
    }; 
+0

मेरी इच्छा है कि मैं एक से अधिक बार ऊपर उठा सकता हूं। –

+1

मुझे खेद है, लेकिन मुझे नहीं पता कि इस जवाब को कैसे कार्यान्वित किया जाए। mTouched हैं, mMovingFlag वैश्विक चर? क्या वे अन्य सूचीदृश्यों से संबंधित हैं? क्या इस उदाहरण में mLayoutWithList अन्य सूचीदृश्य को देखता है जिसे हम सिंक्रनाइज़ करना चाहते हैं? धन्यवाद। वास्तविक के लिए – Graph

+0

। कृपया सभी कोड शामिल करें .................... –

3

हालांकि यह उत्तर सूची दृश्य के बजाय स्क्रॉल व्यू के लिए है, समस्या एक जैसी है और यह समाधान मेरे लिए अच्छा काम करता है। बाएं स्क्रॉलव्यू को स्क्रॉल करना दायां स्क्रॉलव्यू और वाइसवर्सा स्क्रॉल करेगा।

public class MainActivity extends Activity implements OnTouchListener { 
    private ScrollView scrollViewLeft; 
    private ScrollView scrollViewRight; 
    private static String LOG_TAG = MainActivity.class.getName(); 
    private boolean requestedFocus = false; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     scrollViewLeft = (ScrollView) findViewById(R.id.scrollview_left); 
     scrollViewRight = (ScrollView) findViewById(R.id.scrollview_right); 

     scrollViewLeft.setOnTouchListener(this); 
     scrollViewRight.setOnTouchListener(this); 

     scrollViewLeft.setFocusableInTouchMode(true); 
     scrollViewRight.setFocusableInTouchMode(true); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onTouch(View view, MotionEvent motionEvent) { 
     Log.d(LOG_TAG, "--> View, event: " + view.getId() + ", " + motionEvent.getAction() + ", " + view.isFocused()); 
     Log.d(LOG_TAG, "--> " + scrollViewLeft.isFocused() + ", " + scrollViewRight.isFocused()); 

     if (motionEvent.getAction() == MotionEvent.ACTION_DOWN && requestedFocus == false){ 
      view.requestFocus(); 
      requestedFocus = true; 
     }else if (motionEvent.getAction() == MotionEvent.ACTION_UP){ 
      requestedFocus = false; 
     } 

     if (view.getId() == R.id.scrollview_left && view.isFocused()){ 
      scrollViewRight.dispatchTouchEvent(motionEvent); 
     }else if (view.getId() == R.id.scrollview_right && view.isFocused()){ 
      scrollViewLeft.dispatchTouchEvent(motionEvent); 
     } 

     return super.onTouchEvent(motionEvent); 
    } 
} 
1
ListAdapter listAdapter = listView.getAdapter(); 
int rows = listAdapter.getCount()/columns; 
int height = 60 * rows; // Insert the general cell height plus the dividers. 
ViewGroup.LayoutParams params = listView.getLayoutParams(); 
params.height = height; 
listView.setLayoutParams(params); 
listView.requestLayout();