Android: cómo mostrar el gridview en blanco con el botón
Quiero mostrar cuadrículas dinámicas en blanco como esta
Intenté poblar la rejilla como esto pero para esto necesito enviar el arsenal int drawable a baseadapter.I saben su manera no derecha de hacer esto
- Nuevo PhoneGap 3.0 No se puede resolver la importación org.apache.cordova
- Manera correcta de manejar la advertencia de pelusa de NullPointerException de Android Studio
- Error "No se puede crear instancias de actividad"
- ¿Cuál es la cámara de la resolución mínima para escanear código de barras con un teléfono Android?
- Android, Java - Renderización de un vídeo utilizando marcos de mapa de bits para invertir un vídeo (Xuggler)
Tenga en cuenta este escenario:
1) El usuario obtendrá este tipo de pantalla con una cuadrícula en blanco con el botón "+" para agregar imágenes a la cuadrícula y el botón "-" si existe una imagen en la cuadrícula
2) Aumentar la cuadrícula dinámicamente tan pronto como el usuario llena la segunda rejilla en blanco de GridView.
Considere esta pregunta también
- ¿Cómo puedo implementar el equivalente RxJava de INotifyPropertyChanged para hacer un modelo de datos Observable?
- Diferencia entre setBackgroundDrawable () y setBackground ()
- Android.database.CursorIndexOutOfBoundsException
- BaseAdapter notifyDatasetChanged () llamado pero getView () nunca se llama
- Cómo averiguar la cara detectada es real o falsa
- Error de sistema que captura la salida de una pantalla virtual de MediaProjection a un ImageReader
- PopupMenu no se encuentra correctamente dentro de RecyclerView
- "Java.lang.NullPointerException" al intentar instalar Android SDK
He creado un enfoque ficticio para el problema (Para añadir modificar el Gridview dinámicamente):
Crear una actividad Main3Activity
public class Main3Activity extends AppCompatActivity implements ViewClickCallBack { private RecyclerView recyclerView; private GridAdapter gridAdapter; private List<Model> models = new ArrayList<>(); private final int SIZE_NEXT_ITEM = 5; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main3); recyclerView = (RecyclerView) findViewById(R.id.grid_recycle); gridAdapter = new GridAdapter(this); getNextModel(); gridAdapter.setModels(models); RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(this, 3); recyclerView.setLayoutManager(mLayoutManager); recyclerView.setAdapter(gridAdapter); } @Override public void viewClicked(int position) { models.get(position - 1).setUploaded(true);// Set the upload flag as true for the clicked item int gridItemCount = gridAdapter.getItemCount();// Get the total count of items in gridview if ((gridItemCount - position) == 1) { // check if the clicked item is second last, if yes then difference would be 1 getNextModel(); gridAdapter.setModels(models); } else { Toast.makeText(this, "Popup Image picker", Toast.LENGTH_SHORT).show(); } gridAdapter.notifyDataSetChanged(); } /** * Function to get the set (or next set) of objects that * we want to show in GRID view. * * These objects will be added to a list. * This list will act as data source for adapter **/ private void getNextModel() { for (int i = 0; i < SIZE_NEXT_ITEM; i++) { Model model = new Model(); model.setUploaded(false); models.add(model); } } }
XML como activity_main3
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="work.sof.ghost.myapplication.Main3Activity"> <android.support.v7.widget.RecyclerView android:id="@+id/grid_recycle" android:layout_width="match_parent" android:layout_height="wrap_content"/> </RelativeLayout>
Un adaptador dice GridAdapter
public class GridAdapter extends RecyclerView.Adapter<GridAdapter.GridViewHolder> { private ViewClickCallBack viewClickCallBack; private List<Model> models; public GridAdapter(ViewClickCallBack viewClickCallBack) { this.viewClickCallBack = viewClickCallBack; } class GridViewHolder extends RecyclerView.ViewHolder { public TextView textView; public GridViewHolder(View itemView) { super(itemView); textView = (TextView) itemView.findViewById(R.id.text_some); textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (viewClickCallBack != null) { Log.e("Element Index", "" + getAdapterPosition()); /** * Increment the position by 1, as getAdapterPosition will * return the index (count starts from 0) of the element. * Hence, to simplify, we will increment the index by one, * so that when we calculate the second last element, we will * check the difference for 1. * */ viewClickCallBack.viewClicked(getAdapterPosition() + 1); } } }); } } @Override public GridViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View itemView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.grid_view, parent, false); return new GridViewHolder(itemView); } @Override public void onBindViewHolder(GridViewHolder holder, int position) { Model model = getModel(position); if (model.isUploaded()) { holder.textView.setText("-"); } else { holder.textView.setText("+"); } } @Override public int getItemCount() { if (models != null) { return models.size(); } return 0; } private Model getModel(int position) { if (models != null) { return models.get(position); } return null; } public void setModels(List<Model> models) { this.models = models; } }
Modelo de una clase modelo
public class Model { private String imagePath; private boolean isUploaded; public String getImagePath() { return imagePath; } public void setImagePath(String imagePath) { this.imagePath = imagePath; } public boolean isUploaded() { return isUploaded; } public void setUploaded(boolean uploaded) { isUploaded = uploaded; } }
Un diseño para la vista de cuadrícula (sé que no es lo mismo que se muestra en la pregunta :()
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="5dp" android:layout_marginRight="5dp" android:background="@drawable/rect_drawable" android:orientation="vertical"> <ImageView android:src="@drawable/ic_launcher" android:id="@+id/image_holder" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:layout_gravity="right" android:id="@+id/text_some" android:layout_margin="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="25sp" android:text="+" /> </LinearLayout>
Un archivo dibujable rect_drawable
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <size android:width="6dp" android:height="6dp" /> <solid android:color="@color/colorPrimary" /> </shape>
Para la pregunta alternativa
" Cómo enviar varias imágenes al servidor a través de AsyncTask tan pronto como el usuario presione el botón Guardar o Hecho ":
Utilizar
a) executeOnExecutor (java.util.concurrent.Executor, Object []) con THREAD_POOL_EXECUTOR . Para enviar una imagen por tarea asíncrona en paralelo, Más información en https://developer.android.com/reference/android/os/AsyncTask.html
o
b) Puede seguir https://stackoverflow.com/a/7130806/1920735
Esto mostrará la interfaz de usuario de este modo
- OnRequestPermissionsResult no se devuelve en una actividad de Android
- RecyclerView horizontal con relleno inicial