【问题标题】:Displaying images downloaded from Firebase in a GridView on a Fragment keeps crashing upon opening fragment在片段上的 GridView 中显示从 Firebase 下载的图像在打开片段时不断崩溃
【发布时间】:2019-01-26 16:20:43
【问题描述】:

我正在使用 GridView 为我们的 android 应用程序创建一个画廊,该 GridView 位于导航抽屉中的一个片段上。我为图像视图创建了一个自定义适配器,它使用毕加索在图像视图中显示图像。我创建了一个名为 DohvatiSlike() 的方法,它从 firebase 下载图像并将它们保存在 File 变量中。当我构建应用程序并运行它时,每当我从导航抽屉打开画廊时,它都会使应用程序崩溃。如果我在 onCreateView 中排除设置 GalleryGridAdapter 的行,则不会崩溃,但它显然不起作用。谁能帮我找出问题?

这是 GalleryFragment 代码:

public class GalleryFragment extends Fragment implements NavigationItem {
private DatabaseReference mDatabaseRef;
private List<File> slike;
private int position;
GridView galleryGridView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.gallery_fragment, container, false);
    super.onCreateView(inflater, container, savedInstanceState);

    galleryGridView = (GridView)v.findViewById(R.id.gallery_gridview);
    DohvatiSlike();
    galleryGridView.setAdapter(new GalleryGridAdapter(getActivity(), slike));

    return v;
}

public void DohvatiSlike(){
    mDatabaseRef=FirebaseDatabase.getInstance().getReference("images");
    mDatabaseRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for(DataSnapshot postSnapshot: dataSnapshot.getChildren()){
                File slika = postSnapshot.getValue(File.class);
                slike.add(slika);
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Toast.makeText((AppCompatActivity)getActivity(), databaseError.getMessage(), Toast.LENGTH_SHORT).show();
        }
        });}

@Override
public void onAttach(Activity activity){
    super.onAttach(activity);
}

这是适配器代码:

public class GalleryGridAdapter extends BaseAdapter {
private Context mContext;
public List<File> slike;

public GalleryGridAdapter(Context context, List<File> slikice){
    slike = slikice;
    mContext = context;
}

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

@Override
public Object getItem(int position) {
    return slike.indexOf(position);
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ImageView imageView;
    if (convertView == null) {
        imageView = new ImageView(mContext);
        imageView.setLayoutParams(new GridView.LayoutParams(500, 500));
        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
    } else{
        imageView = (ImageView) convertView;
    }
        Picasso.with(mContext).load(slike.indexOf(position)).into(imageView);
        return imageView;
}

}

编辑*

这是崩溃日志

 Process: hr.foi.air1817.botanico, PID: 26065
java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
    at hr.foi.air1817.botanico.adapters.GalleryGridAdapter.getCount(GalleryGridAdapter.java:26)
    at android.widget.GridView.setAdapter(GridView.java:211)
    at hr.foi.air1817.botanico.fragments.GalleryFragment$1.onDataChange(GalleryFragment.java:62)
    at com.google.firebase.database.obfuscated.zzap.zza(com.google.firebase:firebase-database@@16.0.3:75)
    at com.google.firebase.database.obfuscated.zzca.zza(com.google.firebase:firebase-database@@16.0.3:63)
    at com.google.firebase.database.obfuscated.zzcd$1.run(com.google.firebase:firebase-database@@16.0.3:55)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6863)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:537)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

我已经连续两天了,只是无法让它发挥作用,感谢您的建议或想法

【问题讨论】:

    标签: java android firebase gridview baseadapter


    【解决方案1】:

    这是异步操作的常见问题,您的代码总是会崩溃,因为您在从 Firebase 访问适配器数据之前设置适配器数据,当您这样做时

    DohvatiSlike();
        galleryGridView.setAdapter(new GalleryGridAdapter(getActivity(), slike));
    

    DohvatiSlike(); 方法仍在请求数据,可能无法完成在您拥有的Array 处添加元素。

    相反,将适配器的设置移动到您的 DohvatiSlike(); 方法中

         public void DohvatiSlike(){
    
               slike = new List<>();                
    
    
      mDatabaseRef = FirebaseDatabase.getInstance().getReference("images");
                    mDatabaseRef.addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
    
                            for(DataSnapshot postSnapshot: dataSnapshot.getChildren()){
                                File slika = postSnapshot.getValue(File.class);
                                slike.add(slika);
                            }
    
                        galleryGridView.setAdapter(new GalleryGridAdapter(getActivity(), slike));
    
                        }
    
                        @Override
                        public void onCancelled(DatabaseError databaseError) {
                            Toast.makeText((AppCompatActivity)getActivity(), databaseError.getMessage(), Toast.LENGTH_SHORT).show();
                        }
                        });
                }
    

    当您执行DohvatiSlike() 时,您将需要根据您的互联网连接等待获取该数据,在获取该数据后您填充您的数组,在这种情况下,您正在请求数据并立即使用以下数据设置适配器可能还没有被获取,而是在所有数据都被解析并添加到你的onDataChange之后设置适配器。

    此外,在显示视图时,请在 onViewCreated() 内进行,因为 onCreateView() 只是用于膨胀视图元素

    【讨论】:

    • 感谢您的建议,您说的很有道理,我按照您的指示做了,但是应用程序在打开一秒钟后仍然崩溃。其他可能仍然会导致问题,这是我第一次创建 Android 应用程序,所以很有可能。
    • 您能详细说明崩溃日志的内容吗?我的回答是您应该使用哪种方法将数据加载到您的适配器中,否则每次启动片段时它都会崩溃
    • 您收到错误是因为您将文件传递给 picasso Picasso.with(mContext).load(slike.indexOf(position)).into(imageView); ,你应该传递一个 url 而不是 File
    • 我已经编辑了帖子以包含崩溃日志,我还将查看获取图像的 url
    • 编辑了我的答案,确保在你的 Dohvatslike() 方法中初始化你的数组,不管怎样它都会为空
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 2014-04-19
    相关资源
    最近更新 更多