2013-02-15 17 views
5

Ho una scrollview orizzontale nella mia app per Android con i pulsanti Avanti e Precedente. Voglio mostrare questi pulsanti solo quando lo scollview ha bisogno di scrolling.ie, la larghezza del contenuto di scrollview supera la larghezza dello schermo. Inoltre, si desidera nascondere i pulsanti precedente e successivo quando si raggiunge rispettivamente il primo e l'ultimo elemento. Come per gli elementi successivi/precedenti quando si fa clic su questi pulsanti?Come scorrere un HorizontalScrollView sul pulsante clic in Android?

main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/mainLayout" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:background="#ffffff" > 

     <Button 
      android:id="@+id/btnPrevoius" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentLeft="true" 
      android:layout_centerVertical="true" 
      android:text="Previous" 
      android:visibility="gone" /> 

     <HorizontalScrollView 
      android:id="@+id/horizontalScrollView1" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_centerVertical="true" 
      android:layout_marginLeft="5dip" 
      android:layout_marginRight="5dip" 
      android:layout_toLeftOf="@+id/btnNext" 
      android:layout_toRightOf="@+id/btnPrevoius" 
      android:fillViewport="true" > 

      <LinearLayout 
       android:id="@+id/linearLayout1" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:orientation="horizontal" > 
      </LinearLayout> 
     </HorizontalScrollView> 

     <Button 
      android:id="@+id/btnNext" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentRight="true" 
      android:layout_centerVertical="true" 
      android:text="Next" 
      android:visibility="gone" /> 

    </RelativeLayout> 

attività

public class SampleActivity extends Activity { 
      private static LinearLayout linearLayout; 
      private static HorizontalScrollView horizontalScrollView; 
      private static Button btnPrevious; 
      private static Button btnNext; 
      private static int displayWidth = 0; 
      private static int arrowWidth = 0; 
      @Override 
      public void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.main); 
       horizontalScrollView = (HorizontalScrollView) findViewById(R.id.horizontalScrollView1); 
       linearLayout = (LinearLayout) findViewById(R.id.linearLayout1); 
       btnPrevious = (Button) findViewById(R.id.btnPrevoius); 
       btnNext = (Button) findViewById(R.id.btnNext); 
       for (int i = 0; i < 15; i++) { 
        Button button = new Button(this); 
        button.setTag(i); 
        button.setText("---"); 
        linearLayout.addView(button); 
       } 
       ViewTreeObserver vto = linearLayout.getViewTreeObserver(); 
       vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 

        @Override 
        public void onGlobalLayout() { 
         ViewTreeObserver obs = linearLayout.getViewTreeObserver(); 
         obs.removeGlobalOnLayoutListener(this); 
         Display display = getWindowManager().getDefaultDisplay(); 
         displayWidth = display.getWidth(); 
         if (linearLayout.getMeasuredWidth() > (displayWidth - 40)) { 
          btnPrevious.setVisibility(View.VISIBLE); 
          btnNext.setVisibility(View.VISIBLE); 
         } 
        } 

       }); 
       btnPrevious.setOnClickListener(listnerLeftArrowButton); 
       horizontalScrollView.setOnTouchListener(listenerScrollViewTouch); 
      } 

      private OnTouchListener listenerScrollViewTouch = new OnTouchListener() { 

       @Override 
       public boolean onTouch(View v, MotionEvent event) { 
        showHideViews(); 
        return false; 
       } 
      }; 

      private OnClickListener listnerLeftArrowButton = new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        horizontalScrollView.onKeyDown(KeyEvent.KEYCODE_DPAD_RIGHT, new KeyEvent(0, 0)); 
       } 
      }; 


     public static void showHideViews() { 
      int maxScrollX = horizontalScrollView.getChildAt(0).getMeasuredWidth()- displayWidth; 
      Log.e("TestProjectActivity", "scroll X = " +horizontalScrollView.getScrollX()); 
      Log.i("TestProjectActivity", "scroll Width = " +horizontalScrollView.getMeasuredWidth()); 
      Log.d("TestProjectActivity", "Max scroll X = " + maxScrollX); 

      if (horizontalScrollView.getScrollX() == 0) { 
       hideLeftArrow(); 
      } else { 
       showLeftArrow(); 
      } 
      if (horizontalScrollView.getScrollX() == maxScrollX) { 
       showRightArrow(); 
      } else { 
       //hideRightArrow(); 
      } 
     } 

     private static void hideLeftArrow() { 
      btnPrevious.setVisibility(View.GONE); 
     } 

     private static void showLeftArrow() { 
      btnPrevious.setVisibility(View.VISIBLE); 
     } 

     private static void hideRightArrow() { 
      btnNext.setVisibility(View.GONE); 
     } 

     private static void showRightArrow() { 
      btnNext.setVisibility(View.VISIBLE); 
     } 
    } 

Il valore 'maxScrollX' non è corretto per me. Come trovare il valore di scroll massimo per questo? Grazie in anticipo

risposta

1
+0

Mi dispiace.Non ho potuto capire come questi messaggi possano risolvere il mio problema. –

+0

@DevuSoman hai guardato i link che ho postato, scrollview orizzontale funziona in questo modo. Inoltre, se vuoi nascondere questi pulsanti, hai impostato l'abilitazione su false per la prima condizione e viceversa. Per l'esecuzione del prossimo è necessario applicare ascoltatore onclick sui rispettivi pulsanti e fai ciò che vuoi in base alla tua scelta .... –

+0

@DevuSoman cosa vuoi esattamente..Un solo impostare il padding e la regolazione del layout minore.dai provato con i link che ho postato? basta applicare sull'ascoltatore dei clic sui pulsanti ... secondo la tua scelta. Cosa vuoi fare con un clic? –

4

Questo potrebbe venire un po 'tardi, ma per qualcuno là fuori che si troveranno ad affrontare questo problema mi permetto di suggerire soluzioni alternative (s).

Innanzitutto, utilizzare componenti diversi da HorizontalScrollView. Ecco le opzioni:

Opzione 1:Horizontal ListView - Aggiungi questa classe per il vostro progetto (creare un pacchetto separato, qualcosa come com.yourproject.widgets). Dovrai anche creare un adattatore personalizzato, guarda come è fatto in questo example. Ti suggerisco di creare una classe adattatore separata (ad es. HorizontalListViewAdapter) e inserirla nel pacchetto com.yourproject.widgets già creato.

  • aggiungere questo widget per il layout nel xml (metterlo tra i pulsanti che hanno bisogno di imitare il comportamento di scorrimento) avrete bisogno di aggiungere qualcosa come:
<com.yourproject.widgets.HorizontalListView 
      android:id="@+id/hList" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"/> 
  • riferimento questo (insieme con i pulsanti) nella Attività/Frammento che utilizza il widget
HorizontalListView mHList = (HorizontalListView) findViewById (R.id.hList); 
Button bPrevoius = (Button) findViewById (R.id.btnPrevoius); 
Button bNext = (Button) findViewById (R.id.btnNext); 
  • aggiungere onClickListeners ai pulsanti. Utilizzare la funzione scrollTo() predefinita nel widget HorizontalListView. Come puoi vedere nel codice, ci vuole il valore int dp per scorrere.Aggiungere i valori positivi se si desidera scorrere a destra (accanto), e utilizzare valori negativi se si desidera scorrere a sinistra (precedente):

    bPrevoius.setOnClickListener(new OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         //value 500 is arbitrarily given. if you want to achieve 
         //element-by-element scroll you should get the width of the 
         //previous element dynamically or if the elements of the 
         //list have uniform width just put that value instead 
         mHList.scrollTo(-500); 
         //if it's the first/last element you can bPrevoius.setEnabled(false) 
    
        } 
    }); 
    
    
    bNext.setOnClickListener(new OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         mHList.scrollTo(500); 
    
        } 
    }); 
    

OPZIONE 2: più fino a soluzione data da questo problema può essere il nuovo widget RecyclerView introdotto in Android L (aggiunta di android: scrollbars = "verticale" sembra che farebbe il trucco, a parte questo dovrebbe avere un comportamento ListView convenzionale). Per maggiori informazioni consultare la documentazione ufficiale.

-1

In titanio Appcelerator, è possibile farlo utilizzando scrollableView

var scrollableView = Ti.UI.createScrollableView({ 
      showPagingControl:true, 
      scrollingEnabled: true,  
      top: 360        
}); 

Quindi, è possibile eseguire un ciclo di tutte le immagini o qualsiasi contenuto che si ha, e aggiungerli a questo punto di vista.

per (ciclo) {
eval ("var view" + i + "= Ti.UI.createView();");

profile_image = Ti.UI.createImageView({ 
       image: result[0]['profile_image'], 
       left:15, 
       width:82, 
       height:104, 
       top: 0 
      }); 

eval("view"+i+".add(profile_image);"); 

eval("scrollableView.addView(view"+i+");"); 

}

mywin.add (scrollableView);

Problemi correlati