【问题标题】:Crashing on loading gallery adapter for recyclerview为 recyclerview 加载画廊适配器时崩溃
【发布时间】:2022-01-24 00:36:32
【问题描述】:

编辑:在 JonR85 的回答之后,它返回了图像适配器,但现在在返回膨胀的视图后,它使应用程序崩溃


override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        var _galleryFragment:View?
          _galleryFragment =   requireActivity().findViewById<View>(R.id.gallery_fragment) as View
              galleryFragment =   GetGalleryFragment(inflater,container) as View


             galleryNumberText =     (galleryFragment).findViewById(R.id.galleryNumber) as? TextView?
             recyclerView = (galleryFragment).findViewById(R.id.recyclerViewImageItems) as? RecyclerView?

             if(ContextCompat.checkSelfPermission(this.context as Context,Manifest.permission.READ_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED)
        {
            ActivityCompat.requestPermissions(this.parentFragment?.getActivity() as MainActivity,
                Array<String>(2){Manifest.permission.READ_EXTERNAL_STORAGE},READ_PERMISSION_CODE)
            var i:Any?;
        }
        else
        {
            loadImages()
        }
           return galleryFragment
    }

我一直在尝试在一个片段中设置一个 recyclerview(它首先被膨胀然后分配对象(recycler 视图和文本视图)在包含 recyclerview 的图像的类中并请求许可,但不知何故只是当它加载它关闭应用程序的recyclerview(显然在 E/AndroidRuntime: 致命异常: main 进程:com.example.applicationtest,PID:14303 java.lang.NullPointerException 在 com.example.applicationtest.gallery_fragment.loadImages(gallery_fragment.kt:140) 在 com.example.applicationtest.gallery_fragment.onCreateView(gallery_fragment.kt:104) 在 androidx.fragment.app.Fragment.performCreateView(Fragment.java:2963) 在 androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:518) 在 androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282) 在 androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2189) 在 androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2106) 在 androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:2002) 在 androidx.fragment.app.FragmentManager$5.run(FragmentManager.java:524) 在 android.os.Handler.handleCallback(Handler.java:938) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:236) 在 android.app.ActivityThread.main(ActivityThread.java:8037) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:656) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967)

调用 GalleryAdapter 的构造函数

我在片段的不同视图中创建了一个 galleryElement(我没有包含它),可能导致崩溃的原因是什么?

    fun loadImages(){
        recyclerView!!.setHasFixedSize(true)
        recyclerView!!.layoutManager = GridLayoutManager(this.activity,4)

        try {
            this.imageList = ImageGallery.GetImagesList(this.context as Context )
        }
        catch (ex:Exception)
        {
            println(ex.message)
        }
        galleryAdapter = GalleryAdapter(this.context as Context,imageList,
            object : IPhotoInterface {
                override fun onPhotoClick(stringPath: String):Unit {
                    //process picture on click
                }
            })
       try {
           recyclerView?.adapter = galleryAdapter
           galleryNumberText?.text = "${imageList.size} images"
       }
        catch(ex:Exception)
        {
            println(ex.message)
        }
    }```

GalleryAdapter


 class GalleryAdapter(var ctx: Context, var listOfImages:MutableList<String>,var photoListener: ViewHolder.IPhotoInterface): RecyclerView.Adapter<GalleryAdapter.ViewHolder>() {
    
        class ViewHolder(itemView: View): RecyclerView.ViewHolder(itemView){
    
            fun GetImageInit(view:View):ImageView =view.findViewById(R.id.imageElement1)
    
            var image : ImageView
    
            init {
                image  = GetImageInit(itemView) as ImageView
            }
            interface IPhotoInterface {
    
                fun onPhotoClick(stringPath:String): Unit
            }
    
        }
    
    
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
          var inflatedView:View =  LayoutInflater.from(this.ctx).inflate(R.layout.gallery_fragment,parent,false)
           return ViewHolder(inflatedView)
        }
    
        override fun onBindViewHolder(holder: ViewHolder, position: Int) {
            var image:String = (listOfImages as List<String>).get(position)
            Glide.with(ctx).load(image).into(holder.image)
            holder.itemView.setOnClickListener{view->
                this.photoListener.onPhotoClick(image)
            }
        }
    
        override fun getItemCount(): Int {
           return this.listOfImages.size
        }
    }

```

gallery_fragment

```xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".gallery_fragment"
    android:background="#333333"
    android:orientation="vertical">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:id="@+id/galleryNumberContainer">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/galleryNumber"
            android:layout_centerVertical="true"
            android:layout_marginLeft="16dp"
            android:textColor="@color/white"
            android:textStyle="bold"
            android:textSize="18dp"
            />
    </RelativeLayout>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerViewImageItems"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

    </androidx.recyclerview.widget.RecyclerView>

</RelativeLayout>

GalleryItem in a different view file
```xml

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/gallery_item"
    
        >
        <ImageView
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:scaleType="centerCrop"
            app:layout_constraintDimensionRatio="1"
            android:id="@+id/imageElement1"
            tools:ignore="MissingConstraints"
            ></ImageView>
    </androidx.constraintlayout.widget.ConstraintLayout>

我是如何获得图片列表的

kotlin
 

public fun GetImagesList(context: Context):MutableList<string>{
            lateinit var uri:Uri
            var cursor:Cursor?
            var columnIndexDataId:Int =0
            var imageCollectionList:MutableList<string> =  mutableListOf<string>()
            var projection:Array<string>
            var absoluteImagePath:String =""
            uri =MediaStore.Images.Media.EXTERNAL_CONTENT_URI
            var selection:string = "_id?"
           // var selectionArgs :Array<string> = arrayOf(DocumentsContract.getDocumentId(uri).split(":")[1])

            try {
                val columnName:string="_data"
                projection = arrayOf(columnName)
                cursor =context.contentResolver.query(uri,null,null,null,null)
               //if cursor is not null then execute codeblock
                cursor?.let {
                        while(it.moveToNext())
                        {
                            val columnIndex = cursor.getColumnIndexOrThrow(columnName)
                            absoluteImagePath =cursor.getString(columnIndex)
                            imageCollectionList.add(absoluteImagePath)
                        }
                }
            }
            catch (ex:Exception){
                    print(ex.message)
            }
            return imageCollectionList
        }

【问题讨论】:

  • 你的完整*错误信息是什么?
  • @JonR85 再次检查 OP 我已经全部复制了
  • 谢谢。 140 是哪一行?
  • @JonR85 galleryAdapter = GalleryAdapter(this.context as Context,imageList, 一旦接触到 get imageElement 就会崩溃
  • @JonR85 显然它在尝试在片段视图中找到元素时崩溃了我应该在片段上添加图像元素还是如何绑定到片段视图?

标签: java android android-studio kotlin


【解决方案1】:
class ViewHolder(itemView: View): RecyclerView.ViewHolder(itemView){

        var image : ImageView = view.findViewById(R.id.imageElement1)

        interface IPhotoInterface {

            fun onPhotoClick(stringPath:String): Unit
        }

    }

【讨论】:

  • 你在建议我不要使用构造函数吗?
  • 感谢它现在终于可以得到回收站了。但是片段中的膨胀视图会用已经膨胀的对象关闭应用程序...我不应该在 onCreatedView 方法上返回膨胀的视图吗?
  • 你的新错误信息是什么?
  • 这次没有,但我的意思是它返回膨胀的视图(来自 onViewCreated)然后崩溃(可能是一些内部类错误并抛出没有错误)可能与我调用片段的方式有关?我正在使用一个导航视图,它选择一个视图并调用如下:
  • R.id.gallery_fragment ->{ navSideMenu.isVisible=!navSideMenu.isVisible; val options = NavOptions.Builder() .setPopUpTo(R.id.gallery_fragment, true) .setLaunchSingleTop(true) .build() navigationController.navigate(R.id.gallery_fragment, null, options) true }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-18
  • 1970-01-01
  • 2021-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多