2017-09-28 5 views
0

Je fais un gridview pour afficher la liste des icônes (image & text) en lisant les données de la base de données Firebase, en appelant cette activité pour la première fois l'affichage gridview. Ce n'est qu'après avoir changé l'orientation que les données sont chargées. .Android: Les données Gridview personnalisées ne sont pas obligatoires au premier instant

S'il vous plaît indiquerons comment puis-je faire afficher à la première fois (ce qui est la première fois que le développement de l'application Android et ne code Java avant) Merci

Ci-dessous mon code:

  package com.abc.expensestracker; 
  import android.app.Activity; 
      import android.content.Intent; 
      import android.os.Bundle; 
      import android.support.v7.app.AppCompatActivity; 
      import android.view.View; 
      import android.widget.AdapterView; 
      import android.widget.GridView; 

      import com.google.firebase.database.DataSnapshot; 
      import com.google.firebase.database.DatabaseError; 
      import com.google.firebase.database.DatabaseReference; 
      import com.google.firebase.database.FirebaseDatabase; 
      import com.google.firebase.database.ValueEventListener; 

      import java.util.ArrayList; 

      public class NewCategoryIconListActivity extends AppCompatActivity { 

       private GridView mIconListGridView; 
       private IconsListGridViewAdapter mIconListGridViewAdapter; 
       public ArrayList<IconsImageGridItemData> mIconsImageArrData = null; 

       private DatabaseReference mIconImagesRef; 


       @Override 
       protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_new_category_icon_list); 


        mIconListGridView = (GridView) findViewById(R.id.icons_list_gridview); 
        mIconImagesRef = FirebaseDatabase.getInstance().getReference().child("Iconimages"); 


        mIconsImageArrData = new ArrayList<IconsImageGridItemData>(); 
        setListData(); 

        mIconListGridViewAdapter = new IconsListGridViewAdapter(this,R.layout.icons_single_item_layout,mIconsImageArrData);//(this, R.layout.icons_single_item_layout, mGridData); 
        mIconListGridView.setAdapter(mIconListGridViewAdapter); 


        mIconListGridViewAdapter.setGridData(mIconsImageArrData); 



        mIconListGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
         @Override 
         public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

          //Get item at position 
          IconsImageGridItemData item = (IconsImageGridItemData) parent.getItemAtPosition(position); 
          String selectedIconURL = item.getIconURL(); 

          //send back the selected icon to parent activity 
          Intent returnIntent = getIntent(); 
          returnIntent.putExtra("icon_URL",selectedIconURL); 
          setResult(Activity.RESULT_OK,returnIntent); 
          finish(); 
         } 
        }); 
       } 


       /****** Function to set data in ArrayList *************/ 
       public void setListData() 
       { 

        mIconImagesRef.addValueEventListener(new ValueEventListener() { 
         @Override 
         public void onDataChange(DataSnapshot dataSnapshot) { 

          for(DataSnapshot categorySnapshot: dataSnapshot.getChildren()){ 
           String iconURL = categorySnapshot.child("iconURL").getValue(String.class); 

           final IconsImageGridItemData iconsImageData = new IconsImageGridItemData(); 
           /******* Firstly take data in model object ******/ 
           iconsImageData.setIconURL(iconURL); 



           /******** Take Model Object in ArrayList **********/ 
           mIconsImageArrData.add(iconsImageData); 
          } 
         } 

         @Override 
         public void onCancelled(DatabaseError databaseError) { 

         } 
        }); 
       } 

      } 

Répondre

0

Formez votre code ci-dessus ce que je peux comprendre est, tâche à l'intérieur setListData(); achèvent après l'exécution de

mIconListGridViewAdapter.setGridData(mIconsImageArrData);

Un simple changement devrait fonctionner. à côté de votre fonction setListData() après avoir terminé de pour la fonction OnDataChange de l'intérieur EventListener()

/******** Take Model Object in ArrayList **********/ 
            mIconsImageArrData.add(iconsImageData); 
           }// For finish 
          mIconListGridViewAdapter.setGridData(mIconsImageArrData); 
        }// end of onDataChange 

cela fera que votre adaptateur reçoit des données juste après avoir terminé la copie de données dans mIconsImageArrData

Remarque : - Je suppose que vous appelez certainement notifyDataSetChanged(); dans la fonction de copie de la fonction setGridData.

+0

Merci, cela résout mon problème. J'espère pouvoir appliquer cette même méthode en liant Custom RecyclerView que j'ai rencontré le même problème. – user1397859

+0

Oui, cela fonctionnera car l'adaptateur est utilisé pour mettre à jour les données dans la vue liste/Recycleur. Seul '' notifyDataSetChanged() ''est appelé après avoir des données disponibles dans votre Array/ArrayList ou n'importe quel type de collection de données. Codage heureux! –

0

Vous devez indiquer à l'adaptateur que vous avez ajouté un élément. Donc, dans votre adaptateur faire:

public void add (IconsImageGridItemData iconsImageData) { 
    mIconsImageArrData.add (0, iconsImageData); 
    notifyItemInserted(0); //position to add the item 
} 

Puis dans votre setListData:

final IconsImageGridItemData iconsImageData = new IconsImageGridItemData(); 
          /******* Firstly take data in model object ******/ 
          iconsImageData.setIconURL(iconURL); 
          adapter.add (iconsImageData); 



          /******** Take Model Object in ArrayList**********/ 
         // mIconsImageArrData.add(iconsImageData); 
+0

merci pour la réponse rapide. mais 'notifyItemInserted (0);' est une méthode inconnue dans ma classe Adapter. – user1397859