【问题标题】:Load data from Firebase Real database into Gridview将 Firebase Real 数据库中的数据加载到 Gridview
【发布时间】:2018-09-28 16:06:29
【问题描述】:

当我想从 firebase 检索数据并将其加载到 GridView 时,我遇到了一些问题,但直到我将手机从纵向旋转到横向或反之亦然,数据才会出现:

当我启动应用程序时(数据不出现)

当我将手机旋转到横向视图时,数据开始出现

最后,当我将手机重新旋转到纵向视图时,数据加载成功

我尝试了一些方法来解决这个问题,例如(刷新网格视图 gridview.notifyalldatachanged()),但它们都没有解决这个问题。

我的代码很简单:创建新的自定义适配器并将其设置为 gridview

public class ReceipesActivity extends AppCompatActivity {

GridView gridView;
ArrayList<String> RecipeImageUrl=new ArrayList<String>();
ArrayList<String> RecipeTitle=new ArrayList<String>();
DatabaseReference mdata;
MyCustomAdapter myCustomAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_receipes);
    gridView = (GridView) findViewById(R.id.GridviewID);
    mdata = FirebaseDatabase.getInstance().getReference("Categories").child("انواع الخبز");
    LoadDataFromFirebase();
    myCustomAdapter = new MyCustomAdapter(RecipeImageUrl,RecipeTitle);
    gridView.setAdapter(myCustomAdapter);
}

@Override
protected void onStart() {
    super.onStart();
}

//My Custom Adapter for GridView

public class MyCustomAdapter extends BaseAdapter {

    ArrayList<String> RecipeImageUrl;
    ArrayList<String> RecipeTitle;

    MyCustomAdapter(ArrayList<String> RecipeImageUrl,ArrayList<String> RecipeTitle) {
        Toast.makeText(ReceipesActivity.this, "hey to start", Toast.LENGTH_SHORT).show();
        this.RecipeImageUrl = RecipeImageUrl;
        this.RecipeTitle = RecipeTitle;
    }

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

    @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) {
        LayoutInflater layoutInflater = getLayoutInflater();
        View view = layoutInflater.inflate(R.layout.grid_view_custom, null);
        ImageView imageView = (ImageView) view.findViewById(R.id.GridRecipeImageID);
        TextView textView = (TextView) view.findViewById(R.id.GridRecipeTitleID);
        Toast.makeText(ReceipesActivity.this, "sdfgsfg" + RecipeTitle.get(position), Toast.LENGTH_SHORT).show();
        textView.setText(RecipeTitle.get(position));            Picasso.with(getApplicationContext()).load(RecipeImageUrl.get(position)).into(imageView);
        return view;
    }

}

public void LoadDataFromFirebase() {
    mdata.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                RecipeTitle.add(ds.child("title").getValue().toString());
                RecipeImageUrl.add(ds.child("image").getValue().toString());
            }
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
      });
    }
}

【问题讨论】:

  • 您好,欢迎来到 Stack Overflow。请编辑您的问题以包含您用于获取问题中显示的结果的代码。
  • 嗨伙计,完成了...
  • 遇到同样的问题。创造了一个赏金。希望有帮助。
  • 你的ViewHolder在哪里?并且适配器中的 getItem 方法返回 null,它应该从列表中返回一个对象(如 ViewHolder)。

标签: android android-gridview


【解决方案1】:

您是否尝试在填充 RecipeTitle 和 RecipeImageUrl 列表后添加 myCustomAdapter.notifyDataSetChanged()?

这是一个例子:

public void LoadDataFromFirebase() {
    mdata.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                RecipeTitle.add(ds.child("title").getValue().toString());
                RecipeImageUrl.add(ds.child("image").getValue().toString());
            }
            myCustomAdapter.notifyDataSetChanged();  // THIS WILL NOTIFY YOUR ADAPTER WHEN DATA IS CHANGED
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
    });
}

【讨论】:

    【解决方案2】:

    尝试更改您的适配器以从您的活动类中单独更新数据,并将您的 MyCustomAdapter 类从 ReceipesActivity 类中删除:

      public class MyCustomAdapter extends BaseAdapter {
    
        ArrayList<String> RecipeImageUrlList;
        ArrayList<String> RecipeTitleList;
    
        public void addRecipeImageUrl(String RecipeImageUrl) {
            RecipeImageUrl.add(RecipeImageUrl);
            notifyDataSetChanged();
        }
    
        public void addRecipeTitle(String RecipeTitle) {
            RecipeTitleList.add(RecipeTitle);
            notifyDataSetChanged();
        }
        ...
    }
    

    并将您的 LoadDataFromFirebase 方法更改为:

     public void LoadDataFromFirebase() {
        mdata.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot ds : dataSnapshot.getChildren()) {
                    myCustomAdapter.addRecipeTitle(ds.child("title").getValue().toString());
                    myCustomAdapter.addRecipeImageUrl(ds.child("image").getValue().toString());
                }
            }
            @Override
            public void onCancelled(DatabaseError databaseError) {
            }
        });
    }
    

    【讨论】:

      猜你喜欢
      • 2018-05-16
      • 2018-05-26
      • 2019-10-19
      • 2013-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-12
      相关资源
      最近更新 更多