4

i want to display blank dynamic grids like this

Blank Grid i tried to populate grid like this but for this i need to send drawable int array to baseadapter.I know its not right way to do this

Please Consider this scenario:

1) User Will get this kind of screen with blank grid with "+" button to add images to grid and "-" button if image is exist on grid

2) Increase Grid Dynamically as soon as user filled second last blank grid of GridView.

Consider this question too Alternate Question

Community
  • 1
  • 1
androidXP
  • 1,692
  • 3
  • 27
  • 58
  • Post the code what you have tried so far – avinash Jan 19 '17 at 06:49
  • @avinash i have made simple fragment with RecyclerView(Grid Layout) first i want to achieve above blank layout which increase automatically as soon as user filled second last one. Then user can fill these grid with camera or local gallery.My current code is simple RecyclerView with Grid Layout – androidXP Jan 19 '17 at 08:41

1 Answers1

6

I have created a dummy approach for the issue (To add modify the Gridview dynamically):

Create an activity 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 as 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>

An adapter say 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;
    }
}

An model class Model

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

A layout for grid view (i know its not same as shown in question :( )

<?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>

An drawable file 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>

For the alternate question

"How to send multiple images to server via AsyncTask as soon as user press Save or Done button" :

Use

a) executeOnExecutor(java.util.concurrent.Executor, Object[]) with THREAD_POOL_EXECUTOR. To send 1 image per async task in parallel, More info at https://developer.android.com/reference/android/os/AsyncTask.html

or

b) You can follow https://stackoverflow.com/a/7130806/1920735

This will show UI like this enter image description here

Community
  • 1
  • 1
avinash
  • 1,744
  • 24
  • 40