从显示火力地堡在GridView上下载的片段影像,在打开的片段总是崩溃

问题描述 投票:3回答:1

我使用我们的片段分别位于导航抽屉的一个一个GridView创建画廊我们的Android应用程序。我创建用于使用毕加索在图像查看以显示的图像中的图像视图定制适配器。我提出,从火力下载图像和文件变量保存它们()称为DohvatiSlike的方法。当我建立应用程序并运行它,每当我从抽屉式导航栏中打开库崩溃的应用程序。如果我排除了线路设置在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个回答
2
投票

这是异步操作的通病,你的代码将总是崩溃,因为你设置适配器的数据它是从火力地堡达到之前,当你这样做

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

该方法DohvatiSlike();仍请求数据,并可能无法完成将在S形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()只是为你的充气视图元素

© www.soinside.com 2019 - 2024. All rights reserved.