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?
- Evento de la galería a "cuando la imagen se centró"
- Restablecer la posición de TextView (desplazable) en la nueva carga de texto
- Scrollview no se desplaza hacia abajo completamente
- Desplazamiento en Horizontal ScrollView pierde el foco del elemento enfocado,
- Cómo usar la barra de desplazamiento y rápido Desplácese a NestedScrollView
- Desplazamiento de imagen enriquecido y zoom en android
- Smooth Scroll para GridView
- Deshabilitar el desplazamiento en la vista de lista
- Soluciones para GridView.scrollTo ()?
- Fuerza de la pantalla WebView para dibujar
- Agregar una vista de pie de página nativa a la vista web
- SetCurrentItem en ViewPager no se desplaza inmediatamente en la posición correcta
- Problemas de desplazamiento de GridView dentro de Viewpager dentro de NestedScrollView
Usted puede
- Utilizar un
TableLayout
dentro de unHorizontalScrollView
, o - Permanezca con su acercamiento con un
LinearLayout
horizontal pero agregandoLinearLayout
vertical s en vez de directamente las imágenes. Por ejemplo, agregar tres a cuatro imágenes porLinearLayout
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.
- Gire la vista de cuadrícula en 270 grados y establezca el número de columnas como 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
- ¿Cómo utilizar los encabezados precompilados en el proyecto Android NDK?
- Uso de MediaCodec para guardar series de imágenes como Video