2015-01-27 3 views
2

В то время как я работаю на GridView я столкнулся следующие проблемы, любая помощь будет оценена,Dynamicaly загрузка данных в Gridview

  1. Когда я загрузить данные в моей GridView он загружает только первые 3 элемента массива, но есть 18 предметов для загрузки. почему он не загружает другие 15 предметов. (Log.i показывает все 18 элементов в моем LogCat).

  2. Поскольку в MainCategoryID = 1 всего 18 предметов, он должен загружать только 18 сеток, но это загружает 28 сеток (это потому, что в responseJson есть 28 элементов). Я хочу ограничить это 18 сетками. (Внутри нагруженных 28 сетками, есть 3 вещи, погруженные и там повторяются в нескольких местах и ​​других сетках пустые сетки)

PizzaFragment класс

public class PizzaFragment extends ListFragment implements OnTaskCompleted { 

    private TranslateAnimation anim; 
    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(); 


     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("ImageURL")); 
        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(); 
     } 
    } 

CustomGrid

public class CustomGrid extends BaseAdapter { 

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

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

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

    @Override 
    public Object getItem(int position) { 
     return null; 
    } 

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

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View grid; 

     LayoutInflater inflater = (LayoutInflater) mContext 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     if (convertView == null) { 

      grid = new View(mContext); 
      grid = inflater.inflate(R.layout.fragment_pizza, null); 
      TextView textView = (TextView) grid.findViewById(R.id.grid_text); 
      ImageView imageView = (ImageView) grid 
        .findViewById(R.id.grid_image); 
      textView.setText(Description[position]); 
      Picasso.with(mContext).load(ImageURL[position]).into(imageView); 
     } else { 
      grid = (View) convertView; 
     } 

     return grid; 
    } 
} 

вот так выглядит мой экран (это не реальное изображение, но это так)

enter image description here

+0

@jitain sharma Может ли помочь мне с его настройкой, –

+0

Инициализация строки String [] ImageURL = new String [responseJson.length()]; 'которая является длиной вашего ответа json, что приводит к сделайте 28 сеток. Во-вторых, не инициализируйте адаптер сетки внутри AsyncTask onTaskCompleted(), скорее выполните инициализацию в onCreateView(), и сохраните свой адаптер пустым, , пока вы получили результат, просто назовите «adapter.add()» или «адаптер». addAll() ', и когда вы сделали call adapter.notifydatasetchanged. Тебе все будет хорошо. –

+0

@jitain sharma позволяет вам вносить изменения в код и показывать. –

ответ

1

После проверки петли onTaskCompleted метод. вы создаете экземпляр адаптера и устанавливаете на gridview внутри цикла. Я думаю, что это неправильно после наблюдения и проверки вашего кода. Я нашел первую проблему.

Во-вторых, как вы регулируете вид адаптера метод накачивания для заполнения строки тоже неправильно, и я могу сказать, не правильный путь ...

Так как только проверить код ниже для адаптера и onTaskCompleted метода.

@Override 
    public void onTaskCompleted(JSONArray responseJson) { 

     try { 
      String[] Description = new String[responseJson.length()]; 
      String[] ImageURL = new String[responseJson.length()]; 
      JSONArray jArrayCategoryWise = new JSONArray(); 
      for (int i = 0; i < responseJson.length(); i++) { 
       JSONObject object = responseJson.getJSONObject(i); 
       if ("1".equalsIgnoreCase(object.getString("MainCategoryID"))) { 
        // add to another jsonarray if MainCategoryID == 1 
        jArrayCategoryWise.put(object); 
       } 
      } 

      /****** 
      * You can also create class with getter setter method for the 
      * Description and ImageUrl.Make the arraylist of the class after 
      * parsing jsonArray. 
      */ 
      // which will required on more iteration of your json array response 
      CustomGrid adapter = new CustomGrid(getActivity(), 
        jArrayCategoryWise); 
      grid.setAdapter(adapter); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 

После проверки данные поступают правильно или not.or Вы добавляете что-нибудь между ними

ADAPTER

public class CustomGrid extends BaseAdapter { 

    private Context context; 
    private Context mContext; 
    // private final String[] Description; 
    // private final String[] ImageURL; 
    private JSONArray json; 
    private int size = 0; 

    public CustomGrid(Context c, JSONArray json) { 
     this.context = c; 
     this.json = json; 
     if (this.json != null) 
      size = this.json.length(); 
     // You can also create class with getter setter method (getter setter 
     // for Descriptions and ImageUrl). and pass arraylist of that class 

     // this.Description = Description; 
     // this.ImageURL = ImageURL; 
    } 

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

    @Override 
    public Object getItem(int position) { 
     return this.json.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.custom_trips_frag_row, 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(); 
     } 
     JSONObject jObjectRowData = this.json.getJSONObject(position); 
     holder.tvHeader.setText(jObjectRowData.getString("Description")); 
     Picasso.with(this.context).load(jObjectRowData.getString("ImageURL")) 
       .into(holder.ivImage); 

     return convertView; 
    } 

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

Пожалуйста, проверьте ответ .. надеюсь, я правильно и вы Gt ур quesion ваш ответ ...* Предложение * ОЖИДАЙТЕ ПРОВЕРКУ ViewHolder класс для базового адаптера.

+0

это сработало, и это загружает все 18 предметов, но все же оно несет пустые 10 сеток. Как удалить эти пустые 10 сеток. –

+0

Ваш последний код работал до вашего обновления. Я редактирую свой вопрос и добавляю фотографию на экране. Я получаю эти пустые сетки, потому что у responseJson есть некоторые элементы, которые принадлежат MainCategoryID = 2 –

+0

- его причина для этой String [] ImageURL = new String [responseJson.length()]; –

0

Во-первых, изменить адаптер расходует

extends ArrayAdapter<String> 

Измените конструктор: общественного CustomGrid (Context с) { супер (с, R.layout.fragment_pizza); } Теперь Изменить getView() метод:

// Get the item 
     String item = getItem(position); 

Установите этот элемент текста на ваш взгляд, и если вам требуется больше наборов данных, создать класс модели и изменить extends ArrayAdapter<String> с extends ArrayAdapter<ModelClass> и

// Get the item 
      ModelClass item = getItem(position); 

сейчас в классе Activity, инициализируйте ModelClass, установите его переменные и добавьте в адаптер с помощью методов add или addAll.

+0

Какое изменение я должен сделать для String [] ImageURL = new String [responseJson.length()]; –