- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在为我们的 android 应用程序创建一个画廊,在我们位于抽屉导航中的 fragment 之一上使用 GridView。我为 ImageView 创建了一个自定义适配器,它使用 Picasso 在 ImageView 中显示图像。我创建了一个名为 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)
我已经连续两天做这个了,就是无法让它工作,非常感谢您的建议或想法
最佳答案
这是异步操作的常见问题,当您这样做时,您的代码总是会崩溃,因为您在从 Firebase 到达之前设置适配器数据
DohvatiSlike();
galleryGridView.setAdapter(new GalleryGridAdapter(getActivity(), slike));
DohvatiSlike();
方法仍在请求数据,可能未完成添加元素到您拥有的 slike 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
后设置适配器。
此外,在显示 View 时在 onViewCreated()
中执行,因为 onCreateView()
只是为了膨胀 View 元素
关于java - 在 fragment 的 GridView 中显示从 Firebase 下载的图像在打开 fragment 时不断崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54380257/
我有一个需要以编程方式作为列(而不是行)绑定(bind)到 gridview 的值列表。例如,如果我的 DAL 返回 10 个值,我需要将这 10 个值显示为 gridview 中的列作为标题文本,并
我有一个使用 out-gridview 显示结果的脚本.这是一个简单的例子: "hello world" | out-gridview 当我使用 Run with PowerShell 运行脚本时,它
我正在尝试使用工作正常的 Kartik 导出小部件,除了它没有在扩展“函数/网格”中获取数据。现在我当然明白它是如何工作的,它实际上并没有显示任何东西,只是呈现另一个 View 。但我不知道如何在导出
在 Android 教程中,GridView tutorial准确的说是有一行代码 GridView gridview = (GridView) findViewById(R.id.gridview)
我正在尝试为与我的 gridview 关联的每一列添加一个标题,这样当页面足够宽以显示多行项目时,列标题应该显示在每一列的顶部,如果页面缩小,以至于该列不再适合。 最终结果看起来像这样: 2 colu
在我使用 comboBox 而不是 default(textBox) 在 gridview 中使用这个搜索之前: [ 'attribute' => 'project_status',
我想在列中显示我的交易表中一个/所有帐户的总余额。余额列应显示添加上一行总余额的余额。 我的网格 View 代码是 'yii\grid\SerialColumn'],
我正在使用 gridview 列出我的所有数据。我的 table 看起来像这样。 $dataProvider, 'columns' => [ 'firstName',
我目前正在构建一个 Windows 8 XAML C# 应用程序。在一个页面中,我有一个用于水平滑动和滚动的滚动查看器。我有几个控件可以很好地与 scorllviewer 配合使用。但是当您滚动并且光
当调整 GridView 的大小时,它的元素被重新排列,该元素的动画似乎不起作用。 在这里你可以找到一个简单的例子:http://pastebin.com/BgST6sCv 如果单击示例中的其中一个方
如何动态更改 gridview 模板列顺序? 最佳答案 迭代 通通栏目 的网格 View 对象和 店铺 他们在 收藏 . List columns = new List(); foreach (Dat
我在 Yii2 中使用了 CRUD 生成器,它为我的 actionIndex 生成了以下代码 Controller ... public function actionIndex() { $s
在我的用户模型中我有一个函数: public function getRole() { if ($this->role == self::ROLE_USER) { return
我正在构建一个带有 Yii2 框架的 webapp,它将为用户(登录)提供下载管理员预先上传文件的能力。 我已经创建了操作 actionDownload在调用 sendFile() 的特定 Contr
我想在 GridView 中订购图像。我已经使用列表框并成功将图像添加到其中。它的显示如下 但我希望这些图像显示在 GridView 中。可能与否。 请帮助我......提前致谢 最佳答案 出于此类目
我试图通过在 QtQuick 2.0 (Qt 5) 中动态填充 ListModel 来填充 GridView。它可以工作,但应用程序启动速度非常慢: 应用程序窗口立即出现,但大约需要 2 秒才会出现浅
我在 Yii2 GridView 小部件中显示一些列,“执行人员名称”是其中之一,但它应该仅在主管登录时显示,而不是在执行人员登录时显示。 当我将可见值硬编码为零时,它不会显示如下: [ 'l
我想用 HTML 制作一个表格。所以我从数据库中获取了一些数据。 每个项目都是一个用户。用户有用户名、名字、姓氏和电子邮件。我想制作一个表格来列出这些用户。 每个用户都必须换行。我已经在互联网上搜索过
我想在 pjax 处于事件状态的排序 gridview 之后运行脚本。重新加载 gridview 后我找不到任何事件处理程序。 pjax调用和gridview刷新后有没有正确的事件处理方法? 最佳答案
在 WinRT 上,我有一个 GridView 。我想在到达 gridview 的末尾时执行一个方法。 但是,没有像 GridView 那样的事件方法。 我尝试检测对 gridview 的操纵,但似乎
我是一名优秀的程序员,十分优秀!