将项目加载到网格时它有空网格

when loading items to grid it has empty grids

当我在 gridview 上工作时,我遇到了以下问题,我们将不胜感激,

当我将数据加载到我的 gridview 时,它加载了所有 18 个项目。 (Log.i 它显示了我 LogCat 中的所有 18 个项目,因为我使用了 if 条件 ((object.getString("MainCategoryID")).equals("1")) ).但它也会加载 10 个空网格。为什么它加载其他 10 个空网格。

由于MainCategoryID=1的item只有18个,应该只加载18个grid,但是这里加载了28个grid(因为responseJson里面有28个item)。我想将它限制为 18 个网格并删除空网格。

当我加载时它看起来像这样

列表片段class

 public class PizzaFragment extends ListFragment implements OnTaskCompleted {

    GridView grid;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.menu_grid_main, container, false);

        new PizzaMenuAsyncTask(getActivity(), this).execute();

        mQuickReturnView = (TextView) view.findViewById(R.id.footer);
        mQuickReturnView1 = (TextView) view.findViewById(R.id.footer1);
        mQuickReturnView2 = (TextView) view.findViewById(R.id.footer2);

        grid = (GridView) view.findViewById(R.id.grid);
        return view;
    }

    @Override
    public void onTaskCompleted(JSONArray responseJson) {

        try {
            String[] Description = new String[responseJson.length()];
            String[] ImageURL = new String[responseJson.length()];

            for (int i = 0; i < responseJson.length(); i++) {
                JSONObject object = responseJson.getJSONObject(i);
                if ((object.getString("MainCategoryID")).equals("1")) {
                    Log.i("MainCategoryID ", object.getString("MainCategoryID"));
                    ImageURL[i] = object.getString("ImageURL");
                    Log.i("MainCategoryID ", object.getString("Description"));
                    Description[i] = object.getString("Description");

                    CustomGrid adapter = new CustomGrid(getActivity(), Description,
                            ImageURL);
                    grid.setAdapter(adapter);
                }
            }

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

自定义网格class

public class CustomGrid extends BaseAdapter {

    private Context context;
    private Context mContext;
    private final String[] Description;
    private final String[] ImageURL;

    public CustomGrid(Context c, String[] Description, String[] ImageURL) {
        this.context = c;
        this.Description = Description;
        this.ImageURL = ImageURL;
    }

    @Override
    public int getCount() {
        return Description.length;
    }

    @Override
    public Object getItem(int position) {
        return Description[position];
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            holder = new ViewHolder();
            convertView = LayoutInflater.from(context).inflate(
                    R.layout.fragment_pizza, parent, false);
            holder.ivImage = (ImageView) convertView
                    .findViewById(R.id.grid_image);
            holder.tvHeader = (TextView) convertView
                    .findViewById(R.id.grid_text);
            convertView.setTag(holder);

        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.tvHeader.setText(Description[position]);
        Picasso.with(this.context).load(ImageURL[position]).into(holder.ivImage);

        return convertView;
    }

    private class ViewHolder {
        private TextView tvHeader;
        private ImageView ivImage;
    }
}

这是因为在 CustomGrid class 的 getCount() 方法中,您要返回 Description[] 数组的大小;和 String[] Description = new String[responseJson.length()];,连同 ListFragment class 中的 CustomGrid adapter = new CustomGrid(getActivity(), Description, ImageURL); 导致网格看到 28 个项目(Description[] 数组的大小)而不是 18 个具有 "MainCategoryID" 的项目1.

您可能需要重写 public void onTaskCompleted(JSONArray responseJson) 方法,以便只存储符合条件的项目的描述和图像 URL。而且

CustomGrid adapter = new CustomGrid(getActivity(), Description, ImageURL);
grid.setAdapter(adapter);

可以在循环之外,在您已经准备好数据之后。

我继续为您重写下面的代码:

public class PizzaFragment extends ListFragment implements OnTaskCompleted {
    GridView grid;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.menu_grid_main, container, false);

        new PizzaMenuAsyncTask(getActivity(), this).execute();

        mQuickReturnView = (TextView) view.findViewById(R.id.footer);
        mQuickReturnView1 = (TextView) view.findViewById(R.id.footer1);
        mQuickReturnView2 = (TextView) view.findViewById(R.id.footer2);

        grid = (GridView) view.findViewById(R.id.grid);
        return view;
    }

    @Override
    public void onTaskCompleted(JSONArray responseJson) {
        try {
            List<String> descriptions = new ArrayList<String>();
            List<String> imageUrls = new ArrayList<String>();

            for (int i = 0; i < responseJson.length(); ++i) {
                JSONObject object = responseJson.getJSONObject(i);

                if ((object.getString("MainCategoryID")).equals("1")) {
                    Log.i("ImageURL ", object.getString("ImageURL"));

                    imageUrls.add(object.getString("ImageURL"));

                    Log.i("Description ", object.getString("Description"));

                    descriptions.add(object.getString("Description"));
                }
            }

            CustomGrid adapter = new CustomGrid(getActivity(), descriptions, imageUrls);
            grid.setAdapter(adapter);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}

public class CustomGrid extends BaseAdapter {
    private Context context;
    private Context mContext;
    private final List<String> descriptions;
    private final List<String> imageUrls;

    public CustomGrid(Context c, List<String> descriptions, List<String> imageUrls) {
        this.context = c;
        this.descriptions = descriptions;
        this.imageUrls = imageUrls;
    }

    @Override
    public int getCount() {
        return descriptions.size();
    }

    @Override
    public Object getItem(int position) {
        return descriptions.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            holder = new ViewHolder();
            convertView = LayoutInflater.from(context).inflate(
                    R.layout.fragment_pizza, parent, false);
            holder.ivImage = (ImageView) convertView
                    .findViewById(R.id.grid_image);
            holder.tvHeader = (TextView) convertView
                    .findViewById(R.id.grid_text);
            convertView.setTag(holder);

        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.tvHeader.setText(descriptions.get(position));
        Picasso.with(this.context).load(imageUrls.get(position)).into(holder.ivImage);

        return convertView;
    }

    private class ViewHolder {
        private TextView tvHeader;
        private ImageView ivImage;
    }
}

注意:我改用 List 而不是 Array,并修复了一些代码风格问题。我没有测试这个。您应该自己尝试该示例并查阅文档以获取更多信息。另请阅读 the Google Java Style 以获得良好的 Java 风格指南。