Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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
Android 获取从onBindViewHolder到片段的位置_Android_Kotlin_Android Recyclerview - Fatal编程技术网

Android 获取从onBindViewHolder到片段的位置

Android 获取从onBindViewHolder到片段的位置,android,kotlin,android-recyclerview,Android,Kotlin,Android Recyclerview,这是我的片段a 添加图像允许用户捕获图像并保存到手机外部存储器中。newList是一个List列表,它从手机存储器中检索所有图像,并最终设置为adapter newList = retrieveCaptureImagePath() myRecyclerView.setLayoutManager( LinearLayoutManager( getActivity(), LinearL

这是我的
片段a

添加图像允许用户捕获图像并保存到手机外部存储器中。
newList
是一个
List
列表,它从手机存储器中检索所有图像,并最终设置为adapter

newList = retrieveCaptureImagePath() 
myRecyclerView.setLayoutManager(
                LinearLayoutManager(
                    getActivity(),
                    LinearLayoutManager.HORIZONTAL, false
                )
            )
myRecyclerView.setHasFixedSize(true);
myRecyclerView.setAdapter(ImageListAdapter(this, newList))
这是适配器类中的
onBindViewHolder

override fun onBindViewHolder(holder: ViewHolder, p1: Int) {

        context.longToast("position "+imgPics?.get(p1).toString())

        val item = this!!.imgPics?.get(p1)

        val bfOptions = BitmapFactory.Options()
        bfOptions.inDither = false                     
        bfOptions.inPurgeable =
            true                   
        bfOptions.inInputShareable =
            true             
        bfOptions.inTempStorage = ByteArray(32 * 1024)
        var fs: FileInputStream? = null

        val file = File(imgPics?.get(p1).toString())
        if (file.exists()) {
            fs = FileInputStream(File(imgPics?.get(p1).toString()))
            if (fs != null) {
                var bm = BitmapFactory.decodeFileDescriptor(fs.fd, null, bfOptions)
                holder.image?.setImageBitmap(bm)
            }
        }

        with(holder.itemView) {
            tag = item
        }

    }
在onBindViewHolder中,我可以很容易地获得图像路径

 context.longToast("position "+imgPics?.get(p1).toString())
但是,当单击片段中的勾号操作栏时,如何获取位置

 override fun onOptionsItemSelected(item: MenuItem): Boolean {
        val id = item.itemId

        if (id == R.id.save) {
            for (i in newList?.size.toString()) {
                val position = view?.tag
                longToast(position.toString())
            }
        }

        return super.onOptionsItemSelected(item)
    }
我一直在显示空值

编辑

适配器类声明如下

class ImageListAdapter(
    private val context: Fragment,
    private val imgPics: MutableList<String>?,
    private val mListener: ImageAdapterUIHandler?
) :
    RecyclerView.Adapter<ImageListAdapter.ViewHolder>() {


    private val mOnClickListener: View.OnClickListener

    init {
        mOnClickListener = View.OnClickListener { v ->
            val item = v.tag as String
            mListener?.onWorkRequestClicked(item)
        }
    }


    override fun onCreateViewHolder(p0: ViewGroup, p1: Int): ViewHolder {
        val view = LayoutInflater.from(p0.context)
            .inflate(R.layout.grid_item, p0, false)
        return ViewHolder(view)
    }

    override fun getItemCount(): Int{
        return imgPics?.size!!
    }


    override fun onBindViewHolder(holder: ViewHolder, p1: Int) {

        context.longToast("position "+imgPics?.get(p1).toString())

        val item = this!!.imgPics?.get(p1)

        val bfOptions = BitmapFactory.Options()
        bfOptions.inDither = false                     //Disable Dithering mode
        bfOptions.inPurgeable =
            true                   //Tell to gc that whether it needs free memory, the Bitmap can be cleared
        bfOptions.inInputShareable =
            true              //Which kind of reference will be used to recover the Bitmap data after being clear, when it will be used in the future
        bfOptions.inTempStorage = ByteArray(32 * 1024)
        var fs: FileInputStream? = null

        val file = File(imgPics?.get(p1).toString())
        if (file.exists()) {
            fs = FileInputStream(File(imgPics?.get(p1).toString()))
            if (fs != null) {
                var bm = BitmapFactory.decodeFileDescriptor(fs.fd, null, bfOptions)
                holder.image?.setImageBitmap(bm)
            }
        }

        with(holder.itemView) {
            tag = item
//            setOnClickListener(mOnClickListener)
        }

    }

    override fun getItemId(position: Int): Long {
        return position.toLong()
    }

    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

        val image: ImageView = itemView.imageView2
    }

    interface ImageAdapterUIHandler{
        fun onWorkRequestClicked(pos: String)
    }

}
class ImageListAdapter(var context: Context, var newList: ArrayList<ImageList>?,
                      var addImageClickListener: AddImageClickListener?) :
        RecyclerView.Adapter<MyViewHolder>() {

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {

        holder.view.setOnClickListener({
            addImageClickListener!!.onClick(position)
        })
    }
}
创建一个接口

interface AddImageClickListener {

    fun onClick(position: Int)

}
您的适配器类如下所示

class ImageListAdapter(
    private val context: Fragment,
    private val imgPics: MutableList<String>?,
    private val mListener: ImageAdapterUIHandler?
) :
    RecyclerView.Adapter<ImageListAdapter.ViewHolder>() {


    private val mOnClickListener: View.OnClickListener

    init {
        mOnClickListener = View.OnClickListener { v ->
            val item = v.tag as String
            mListener?.onWorkRequestClicked(item)
        }
    }


    override fun onCreateViewHolder(p0: ViewGroup, p1: Int): ViewHolder {
        val view = LayoutInflater.from(p0.context)
            .inflate(R.layout.grid_item, p0, false)
        return ViewHolder(view)
    }

    override fun getItemCount(): Int{
        return imgPics?.size!!
    }


    override fun onBindViewHolder(holder: ViewHolder, p1: Int) {

        context.longToast("position "+imgPics?.get(p1).toString())

        val item = this!!.imgPics?.get(p1)

        val bfOptions = BitmapFactory.Options()
        bfOptions.inDither = false                     //Disable Dithering mode
        bfOptions.inPurgeable =
            true                   //Tell to gc that whether it needs free memory, the Bitmap can be cleared
        bfOptions.inInputShareable =
            true              //Which kind of reference will be used to recover the Bitmap data after being clear, when it will be used in the future
        bfOptions.inTempStorage = ByteArray(32 * 1024)
        var fs: FileInputStream? = null

        val file = File(imgPics?.get(p1).toString())
        if (file.exists()) {
            fs = FileInputStream(File(imgPics?.get(p1).toString()))
            if (fs != null) {
                var bm = BitmapFactory.decodeFileDescriptor(fs.fd, null, bfOptions)
                holder.image?.setImageBitmap(bm)
            }
        }

        with(holder.itemView) {
            tag = item
//            setOnClickListener(mOnClickListener)
        }

    }

    override fun getItemId(position: Int): Long {
        return position.toLong()
    }

    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

        val image: ImageView = itemView.imageView2
    }

    interface ImageAdapterUIHandler{
        fun onWorkRequestClicked(pos: String)
    }

}
class ImageListAdapter(var context: Context, var newList: ArrayList<ImageList>?,
                      var addImageClickListener: AddImageClickListener?) :
        RecyclerView.Adapter<MyViewHolder>() {

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {

        holder.view.setOnClickListener({
            addImageClickListener!!.onClick(position)
        })
    }
}
类ImageListAdapter(var-context:context,var-newList:ArrayList?,
变量addImageClickListener:addImageClickListener?:
RecyclerView.Adapter(){
覆盖onBindViewHolder(holder:MyViewHolder,位置:Int){
holder.view.setOnClickListener({
addImageClickListener!!.onClick(位置)
})
}
}
在片段类中实现AddImageClickListener

然后像这样设置适配器 setAdapter(ImageListAdapter(this,newList),this)

在AddImageClickListener的覆盖方法中,获取适配器中选定图像的位置

override fun onBindViewHolder(holder: SideMenuAdapter.ViewHolder, position: Int) {
        holder.bindItems(arrayList.get(position))
        if (selected==position){
            holder.itemView.frame_sidemenu.setBackgroundResource(R.drawable.sidemnubg)
        }else{
            holder.itemView.frame_sidemenu.setBackgroundResource(R.color.transparent)
        }
        holder.itemView.frame_sidemenu.setOnClickListener{
            holder.itemView.frame_sidemenu.setBackgroundResource(R.drawable.sidemnubg)
            val posEvent = PosEvent()
            posEvent.pos = position
            EventBus.getDefault().post(posEvent)

        }

    }
零碎

@Subscribe(threadMode = ThreadMode.MAIN)
    fun onMessageEvent(posEvent: PosEvent) {
        drawerLayout.closeDrawer(Gravity.LEFT)
        openFragments(posEvent.pos)
//        showToast(arrayList[position])
        selectednavPosition = posEvent.pos
        val adapter_menu: SideMenuAdapter = 
        SideMenuAdapter(this@MainActivity,arrayList,selectednavPosition)
        recycler_menu.adapter = adapter_menu
    }


override fun onResume() {
        super.onResume()
        EventBus.getDefault().register(this)
    }

    override fun onPause() {
        super.onPause()
        EventBus.getDefault().unregister(this)
    }
事件


你想知道所选图像在碎片中的位置吗?@primo ya……检查我的答案。这可能会对您有所帮助。我希望在单击碎片操作栏中的“保存”按钮时获得位置,而不是在
holder.view中,但您必须在recyclerview中选择要保存的图像。正确吗?添加映像不是在适配器中创建的。它是在
fragmentA中创建的。xml
。或者您知道如何首先在适配器中创建plus映像吗?那个么我就可以使用你们的解决方案了?对于你们所做的任何事情,无论你们是在适配器中还是在片段中创建plus镜像,你们都需要一个接口来获取从适配器类到片段的位置。欢迎来到SO。虽然这段代码片段可能是解决方案,但包含解释确实有助于提高文章的质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。请查看更多详细信息。