Vista de cuadrícula de desplazamiento horizontal

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

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 obtengo todos los botones de imagen en una sola línea. ¿Cómo puedo implementarlos en una estructura tipo cuadrícula?

Usted puede

  • utilizar un TableLayout dentro de un HorizontalScrollView , o
  • quédese con su enfoque con LinearLayout horizontal, pero agregue LinearLayout vertical en vez de directamente las imágenes. Por ejemplo, agregar de tres a cuatro imágenes por LinearLayout vertical en vertical y redibujar para agregar solo dos en horizontal.

TableLayout probaría el enfoque TableLayout .

PS1: para la próxima vez, intente eliminar todo el código no relevante (cuanto menos código haya, más fácil será entender lo que hizo).

PS2: recuerde que System.out generalmente se redirige a /dev/null y, por lo tanto, se pierde, por lo que le sugiero que use 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); } } 

Implementar un GridView de desplazamiento horizontal 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 copiar parte del código y cambiar de arriba a izquierda, de abajo a derecha, etc. La razón principal para tener que copiar en lugar de extender es la naturaleza final de esas clases.

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

Hay un truco muy fácil.

  1. Gire la vista de cuadrícula 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!

Lo he hecho de esta manera:

activity_main.xml :

       

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); 

Agregue 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. Agrégalo a tu diseño

your_activity.xml

    

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

Cree un diseño para su elemento de cuadrícula ( grid_element.xml ). He creado uno simple con solo un botón.

     

4. Crea un adaptador

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

 public class GridElementAdapter extends RecyclerView.Adapter{ private Context context; private List elements; public GridElementAdapter(Context context){ this.context = context; this.elements = new ArrayList(); // 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); } 

Use recyclerview con la configuración de gridlayout como administrador de diseño y configúrelo en desplazamiento horizontal

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

aquí 2 es el tramo de columna para la grilla