0

I'm trying to implement viewpager when press of a button on secondary activity for that I created a PageAdaper class which extends Recycler view.Adapter .I got viewpager must not be null error on runtime .

PageAdaper.kt

open class PageAdapter(context: Context, arrayList: ArrayList<Uri>) : RecyclerView.Adapter<PageAdapter.MyViewHolder>() {
    private var mContext: Context? =null
    private var galleryUri= arrayListOf<Uri>()
    private var layoutInflater: LayoutInflater? =null
    init {
        this.mContext=context
        this.galleryUri=arrayList
        this.layoutInflater=context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
    }
    private fun onBindViewHolderr(holder: MyViewHolder, position: Int) {
        holder.iView.setImageURI(galleryUri[position])
    }
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        val view=LayoutInflater.from(mContext).inflate(R.layout.image_container,parent,false)
        return MyViewHolder(view)
    }
    override fun getItemCount(): Int {
        return galleryUri.size
    }
    class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val iView: ImageView
        init {
            super.itemView
            iView=itemView.findViewById(R.id.imageContainer)
        }
    }
    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        onBindViewHolderr(holder, position)
    }
}

Image_container.xml


<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/imageContainer"
        android:contentDescription="@string/gallery" />
</LinearLayout>

Activity_gallery.xml

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageButton
        android:id="@+id/galleryBack"
        android:layout_width="59dp"
        android:layout_height="56dp"
        android:background="@android:color/transparent"
        android:contentDescription="@string/back_button"
        android:src="@drawable/ic_baseline_arrow_back_24"
        style="@style/Widget.AppCompat.Button.Colored"
        app:layout_constraintHorizontal_bias="0.05"
        app:layout_constraintVertical_bias="0.05"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/viewPager"
        android:layout_width="409dp"
        android:layout_height="729dp"
        android:background="@android:color/black"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

    </androidx.viewpager2.widget.ViewPager2>

</androidx.constraintlayout.widget.ConstraintLayout>

Creation on viewpager on button click from activity_main

gallery.setOnClickListener {    // gallery button reference
            if (lastImageUri!=null){
                val intent= Intent(this,GalleryActivity::class.java) 
                startActivity(intent)    // inflates activity_gallery.xml
                val iAdapter=PageAdapter(this,galleryUri) // creating object with params
                viewPager.adapter=iAdapter    // here comes the error
            }
        }

Update

GalleryActivity.kt

It contains only setContentview to activity_gallery.xml Do I need to add anything.

class GalleryActivity : AppCompatActivity() {
    public override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_gallery)
        overridePendingTransition(android.R.anim.slide_in_left,android.R.anim.slide_out_right)
        galleryBack.setOnClickListener {
            finish()
            overridePendingTransition(android.R.anim.slide_in_left,android.R.anim.slide_out_right)
        }
    }
}

Explain me about this as I'm new to android. Thank you!

Ajith Selvan
  • 45
  • 1
  • 9

1 Answers1

1

So, startActivity will go to the GalleryActivity class. You need to put the lines after that into the GalleryActivity.

Okay, now that you've added your GalleryActivity.kt. You need to make 2 changes. First, in your activity_main:

gallery.setOnClickListener {    // gallery button reference
   if (lastImageUri!=null){
      val intent= Intent(this,GalleryActivity::class.java)
      intent.putExtra("IMAGE_URI", galleryUri)
      startActivity(intent)    // inflates activity_gallery.xml
   }
}

Then, in your GalleryActivity.kt

class GalleryActivity : AppCompatActivity() {
    public override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_gallery)

        val galleryUri = getIntent().getStringExtra("GALLERY_URI")
        val iAdapter=PageAdapter(this,galleryUri) // creating object with params
        viewPager.adapter=iAdapter 
     overridePendingTransition(android.R.anim.slide_in_left,android.R.anim.slide_out_right)
        galleryBack.setOnClickListener {
            finish()
            overridePendingTransition(android.R.anim.slide_in_left,android.R.anim.slide_out_right)
        }
    }
}

Try that.

Greg Billetdeaux
  • 2,039
  • 13
  • 9
  • I already passed that galleryUri to PageAdaper class through constructor which contains image URIs that sets image on imageview . Did I done any mistake on PageAdaper class . – Ajith Selvan Aug 23 '20 at 17:10
  • On log it shows Recycler view : No adapter attached; skipping layout – Ajith Selvan Aug 23 '20 at 17:29
  • Can you show what activity_gallery.kt looks like? It looks like you have 2 activities but have only showed us a part of 1 of them. – Greg Billetdeaux Aug 23 '20 at 18:11
  • How do I add view pager on galleryActivity.kt . I have added galleryActivity.kt on the original post .I got the point on your edit how to do that so. – Ajith Selvan Aug 23 '20 at 18:48
  • Could you help me? , i have the same problem creating a NavigationDrawer with SwipeViewTabs https://stackoverflow.com/questions/64207278/viewpager2-must-not-be-null-in-navigationdrawer-and-swipeviewtabs – Jorge Leonardo Oct 05 '20 at 11:12