Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在片段的GridView中显示从Firebase下载的图像在打开片段时不断崩溃_Java_Android_Firebase_Gridview_Baseadapter - Fatal编程技术网

Java 在片段的GridView中显示从Firebase下载的图像在打开片段时不断崩溃

Java 在片段的GridView中显示从Firebase下载的图像在打开片段时不断崩溃,java,android,firebase,gridview,baseadapter,Java,Android,Firebase,Gridview,Baseadapter,我正在为我们的android应用程序创建一个图库,在导航抽屉中的一个片段上使用GridView。我为图像视图创建了一个自定义适配器,它使用毕加索在图像视图中显示图像。我创建了一个名为DohvatiSlike()的方法,该方法从firebase下载图像并将其保存在一个文件变量中。当我构建并运行应用程序时,每当我从导航抽屉打开图库时,应用程序就会崩溃。如果在onCreateView中排除GalleryGridAdapter的行设置,则不会出现崩溃,但显然不起作用。有人能帮我找到问题吗 这是Galle

我正在为我们的android应用程序创建一个图库,在导航抽屉中的一个片段上使用GridView。我为图像视图创建了一个自定义适配器,它使用毕加索在图像视图中显示图像。我创建了一个名为DohvatiSlike()的方法,该方法从firebase下载图像并将其保存在一个文件变量中。当我构建并运行应用程序时,每当我从导航抽屉打开图库时,应用程序就会崩溃。如果在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);
}

我已经连续两天这样做了,只是无法让它工作,建议或想法很受欢迎

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

DohvatiSlike();
    galleryGridView.setAdapter(new GalleryGridAdapter(getActivity(), slike));
方法
DohvatiSlike()
仍在请求数据,可能无法完成在您拥有的slike
数组中添加元素

相反,将适配器的设置移动到
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();
                    }
                    });
            }
public void DohvatiSlike(){
slike=新列表();
mDatabaseRef=FirebaseDatabase.getInstance().getReference(“图像”);
mDatabaseRef.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
对于(DataSnapshot postSnapshot:DataSnapshot.getChildren()){
文件slika=postsnashot.getValue(File.class);
slike.add(slika);
}
setAdapter(新的GalleryGridAdapter(getActivity(),slike));
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
Toast.makeText((AppCompatActivity)getActivity(),databaseError.getMessage(),Toast.LENGTH_SHORT).show();
}
});
}
当您执行
DohvatiSlike()
时,您需要根据您的internet连接等待以获取该数据,在获取该数据后,您将填充阵列,在这种情况下,您请求数据并立即使用可能尚未获取的数据设置适配器,相反,只需在解析所有数据并将其添加到
onDataChange
中后设置适配器即可


此外,当显示视图时,请在
onViewCreated()
内执行此操作,因为
onCreateView()
仅用于膨胀视图元素

谢谢您的建议,您所说的很有意义,我按照您的指示执行了操作,但应用程序在打开一秒钟后仍会崩溃。可能还有其他问题,这是我第一次创建android应用程序,所以很有可能。你能详细说明crashlogs说了什么吗?我的答案是,您应该使用什么方法将数据加载到适配器中,否则每次启动碎片时它都会崩溃您会收到错误,因为您正在将文件传递到毕加索毕加索.with(mContext).load(slike.indexOf(position)).into(imageView),你应该在那里传递一个url,而不是一个文件。我编辑了文章以包含一个崩溃日志,我还将查看图像的url。编辑我的答案,确保在Dohvatslike()方法中初始化你的数组,无论哪种方式,它都将为null
DohvatiSlike();
    galleryGridView.setAdapter(new GalleryGridAdapter(getActivity(), slike));
     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();
                    }
                    });
            }