Android: 自定义 Gridview 数据第一次没有绑定

Android: Custom Gridview data are not binding at first time

我通过从 Firebase DB 读取数据制作了一个 gridview 来显示图标列表(图像和文本),第一次调用 activity gridview 显示空白。只有在我改变方向后才会加载数据。

请指教如何让它在第一时间显示。(这是我第一次开发Android应用程序,之前从未编码过Java) 谢谢

下面是我的代码:

            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) {

                      }
                  });
              }

          }

您需要通知适配器您添加了一个项目。 所以在你的适配器中这样做:

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

然后在您的 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);

根据你上面的代码,我可以理解的是,setListData(); 中的任务在

执行后完成

mIconListGridViewAdapter.setGridData(mIconsImageArrData);

一个简单的更改应该有效。完成内部事件监听器的 onDataChange() 函数后,在你的 setListData() 函数中

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

这将确保您的适配器在 mIconsImageArrData

中完成数据复制后立即获取数据

注意:- 我假设您肯定在调用 notifyDataSetChanged();在 setGridData 函数中复制数据。