Vista de cuadrícula de desplazamiento horizontal

Sé que no es posible en Android desplazar horizontalmente la vista de cuadrícula. Pero lo que estoy haciendo es agregar botones de imagen de forma dinámica dentro de la vista de desplazamiento horizontal como esto:

public class HorizontalScroller extends Activity { static int l=0; private Rect mTempRect = new Rect(); static int r1=0; static int t=0; static int b=0; static int x=0; static int y=0; //Button[] b1 = new Button[100]; ImageButton btn[][] = new ImageButton[10][10]; //ImageButton b1 = new ImageButton(this); /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); LinearLayout rl = (LinearLayout)findViewById(R.id.widget92); LinearLayout.LayoutParams params1 = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); for(int i=0;i<4;i++) { for(int j=0;j<10;j++) {System.out.println("helo"); /* l=l+100; r1=r1+100; t=t+100; b=b+100;*/ //button(); //ImageButton btn=new ImageButton(this); /* Rect r = mTempRect; r.left=10; r.top=10; r.right=10; r.bottom=10; btn[i][j].getDrawingRect(r);*/ //btn[i][j].setId(j); Rect r = mTempRect; r.set(0,0,0,0); Rect r2 = mTempRect; r2.set(0,20,0,20); btn[i][j]=new ImageButton(this); btn[i][j]. setBackgroundResource(R.drawable.icon); btn[i][j].setMinimumWidth(20); btn[i][j].setMinimumHeight(20); params1.setMargins(5, 5, 5,5); rl.addView(btn[i][j],params1); System.out.println("1="+btn[i][j].getTop()); System.out.println("2="+btn[i][j].getLeft()); System.out.println("3="+btn[i][j].getRight()); System.out.println("4="+btn[i][j].getBottom()); } } } } 

Pero estoy recibiendo todos los botones de imagen en una sola línea. ¿Cómo puedo implementarlos en una estructura similar a una rejilla?

Usted puede

  • Utilizar un TableLayout dentro de un HorizontalScrollView , o
  • Permanezca con su acercamiento con un LinearLayout horizontal pero agregando LinearLayout vertical s en vez de directamente las imágenes. Por ejemplo, agregar tres a cuatro imágenes por LinearLayout vertical en el retrato, y redibujar para agregar sólo dos en el paisaje.

Intentaría TableLayout método TableLayout .

PS1: para la próxima vez, trate de eliminar todo el código no relevante (menos código hay, más fácil es entender lo que hizo).

PS2: Recuerde que System.out suele ser redirigido a /dev/null y por lo tanto perdido, por lo que le sugiero que utilice Log.d en Log.d lugar.

Ejemplo completo

Adapte esto al método onCreate () o donde lo necesite:

 public void horizontalScrollGalleryLayout () { HorizontalScrollView sv = new HorizontalScrollView(this); LinearLayout llh = new LinearLayout(this); llh.setOrientation(LinearLayout.HORIZONTAL); LinearLayout.LayoutParams layoutParamsTV = new LinearLayout.LayoutParams(40, 40); LinearLayout.LayoutParams layoutParamsLL = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); for (int i=0; i<20; i++) { LinearLayout llv = new LinearLayout(this); llv.setOrientation(LinearLayout.VERTICAL); TestView testView1 = new TestView(this, Color.rgb(i*12, 0, 0)); TestView testView2 = new TestView(this, true, Color.rgb(i*12, i*12, 0)); TestView testView3 = new TestView(this, true, Color.rgb(0, i*12, 0)); llv.addView(testView1, layoutParamsTV); llv.addView(testView2, layoutParamsTV); llv.addView(testView3, layoutParamsTV); llh.addView(llv, layoutParamsLL); } sv.addView(llh, layoutParamsLL); setContentView(sv); } 

Estoy usando una vista muy simple como ejemplo:

 public class TestView extends View { Context context; int color; public TestView(Context context, int color) { super(context); this.context = context; this.color = color; } @Override public void onDraw (Canvas canvas) { super.onDraw(canvas); this.setBackgroundColor(Color.LTGRAY); Paint paint = new Paint (Paint.ANTI_ALIAS_FLAG); paint.setColor(color); canvas.drawCircle(20, 20, 20, paint); } } 

La implementación de un GridView desplazable horizontalmente implica copiar algunas de las clases de código fuente de Android en su base de código (AdapterView, AbsListView, GridView, ScrollBarDrawable) y agregar código para manejar el código horizontal. Esto es principalmente copia de algunos de los códigos y el cambio de arriba a la izquierda, de abajo a derecha, etc La principal razón para tener que copiar en lugar de extender es la naturaleza final de esas clases.

Implementé un desplazamiento horizontal de GridView hace un tiempo y finalmente me puse a empujar a github: https://github.com/jess-anders/two-way-gridview

Hay un truco muy fácil.

  1. Gire la vista de cuadrícula en 270 grados y establezca el número de columnas como 2.
  2. Gire cada elemento a 90 grados (para que los elementos se muestren como orientación original).

Esto podría ser útil para algunos !!

He hecho de esta manera:

Activity_main.xml :

 <HorizontalScrollView android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <GridView android:id="@+id/gridView" android:layout_width="match_parent" android:layout_height="wrap_content"> </GridView> </LinearLayout> </HorizontalScrollView> 

MainActivity.java :

 GridView gridView = (GridView) findViewById(R.id.gridView); gridView.setNumColumns(arrayList.size()); GridViewAdapter gridViewAdapter = new GridViewAdapter(mContext, arrayList); gridView.setAdapter(gridViewAdapter); // Set dynamic width of Gridview setDynamicWidth(gridView); 

Añada el siguiente método :

 private void setDynamicWidth(GridView gridView) { ListAdapter gridViewAdapter = gridView.getAdapter(); if (gridViewAdapter == null) { return; } int totalWidth; int items = gridViewAdapter.getCount(); View listItem = gridViewAdapter.getView(0, null, gridView); listItem.measure(0, 0); totalWidth = listItem.getMeasuredWidth(); totalWidth = totalWidth*items; ViewGroup.LayoutParams params = gridView.getLayoutParams(); params.width = totalWidth; gridView.setLayoutParams(params); } 

Espero que esto te ayudará.

Ya he publicado esta respuesta aquí , pero ambas preguntas son idénticas …


Hay una buena solución en Android a partir de ahora: HorizontalGridView .

1. Dependencia de Gradle

 dependencies { compile 'com.android.support:leanback-v17:23.1.0' } 

2. Añadir en su diseño

Your_activity.xml

 <!-- your stuff before... --> <android.support.v17.leanback.widget.HorizontalGridView android:layout_width="wrap_content" android:layout_height="80dp" android:id="@+id/gridView" /> <!-- your stuff after... --> 

3. Elemento de la cuadrícula de diseño

Cree un diseño para el elemento grid ( grid_element.xml ). He creado una sencilla con sólo un botón en ella.

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="New Button" android:id="@+id/button" /> </LinearLayout> 

4. Cree un adaptador

Muy inspirado en este enlace: https://gist.github.com/gabrielemariotti/4c189fb1124df4556058

 public class GridElementAdapter extends RecyclerView.Adapter<GridElementAdapter.SimpleViewHolder>{ private Context context; private List<String> elements; public GridElementAdapter(Context context){ this.context = context; this.elements = new ArrayList<String>(); // Fill dummy list for(int i = 0; i < 40 ; i++){ this.elements.add(i, "Position : " + i); } } public static class SimpleViewHolder extends RecyclerView.ViewHolder { public final Button button; public SimpleViewHolder(View view) { super(view); button = (Button) view.findViewById(R.id.button); } } @Override public SimpleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { final View view = LayoutInflater.from(this.context).inflate(R.layout.grid_element, parent, false); return new SimpleViewHolder(view); } @Override public void onBindViewHolder(SimpleViewHolder holder, final int position) { holder.button.setText(elements.get(position)); holder.button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(context, "Position =" + position, Toast.LENGTH_SHORT).show(); } }); } @Override public long getItemId(int position) { return position; } @Override public int getItemCount() { return this.elements.size(); } } 

5. Inicialízalo en tu actividad:

 private HorizontalGridView horizontalGridView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_activity); horizontalGridView = (HorizontalGridView) findViewById(R.id.gridView); GridElementAdapter adapter = new GridElementAdapter(this); horizontalGridView.setAdapter(adapter); } 

Utilice recyclerview con la configuración de su gridlayout como gestor de diseño y configurarlo en desplazamiento horizontal

 your recycle view.setLayoutManager(new GridLayoutManager(getActivity(),2, LinearLayoutManager.HORIZONTAL, false)) 

Aquí 2 es el span de columna para la rejilla

  • Limitar el número de líneas en TextView
  • Desplazamiento suave en Android
  • Android: Desplazamiento automático de texto en TextView
  • RecyclerView - ¿Cómo suavizar desplazamiento a la parte superior del elemento en una posición determinada?
  • Cómo guardar la posición de desplazamiento de RecyclerView en Android?
  • Cómo habilitar el desplazamiento en un simpleadapter en el firmware X16 de Google Glass
  • Cómo desplazarse mediante programación WebView de Android
  • Android: ViewPager y HorizontalScrollVIew
  • Eliminar los efectos de desplazamiento de RecyclerView
  • Desplazar RecyclerView para mostrar el elemento seleccionado en la parte superior
  • Desplazamiento de un TextView a una línea específica
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.