Android-如何使用按钮显示空白网格视图

时间:2016-11-20 19:13:25

标签: java android gridview adapter android-gridview

我想像这样显示空白动态网格

Blank Grid 我试图像这样填充网格,但为此我需要将drawable int数组发送到baseadapter。我知道它不是正确的方法来做到这一点

请考虑以下情况:

1)用户将获得带有空白网格的此类屏幕,其中“+”按钮可将图像添加到网格中,如果图像存在于网格上,则显示“ - ”按钮

2)一旦用户填写GridView的第二个空白网格,就动态增加网格。

同样考虑这个问题Alternate Question

1 个答案:

答案 0 :(得分:6)

我为这个问题创建了一个虚拟方法(要动态添加修改Gridview):

创建活动 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为 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>

适配器说 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;
    }
}

模型类模型

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

网格视图的布局(我知道它与问题所示的不一样:()

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

可绘制文件 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>

替代问题

&#34; 用户按“保存”或“完成”按钮后,如何通过AsyncTask将多个图像发送到服务器&#34; :

使用

a) executeOnExecutor(java.util.concurrent.Executor,Object []) THREAD_POOL_EXECUTOR 。每个异步任务并行发送1个图像, 有关详情,请访问https://developer.android.com/reference/android/os/AsyncTask.html

b)您可以关注https://stackoverflow.com/a/7130806/1920735

这将显示类似于此enter image description here

的用户界面