如何在Kotlin-MVP中的Adapter类中的button.setOnClickListener中显示片段对话框?

时间:2018-05-17 14:58:59

标签: android android-fragments android-recyclerview kotlin android-mvp

我正在使用此Kotlin-MVP结构开发一个Android应用程序。我有一个活动,它包含4个片段的TabLayout。所有片段在RecyclerView中都有一个按钮。我需要在该按钮单击侦听器上显示一个“片段对话框”。您能告诉我如何在适配器类的按钮单击侦听器上显示片段对话框?请查看截图。

enter image description here

我正在访问来自适配器类的点击侦听器事件的按钮,该类位于itemView.btn_accept.setOnClickListener

之下
class InApprovalAdapter(private val jobListItems: MutableList<JobItem>) : RecyclerView.Adapter<InApprovalAdapter.JobViewHolder>() {

private var _ProfileId: Long? = null;

fun getProfileId(): Long? {
    return _ProfileId
}

fun setProfileId(s: Long) {
    _ProfileId = s
}

private var _UserToken : String? = null;

fun getUserToken(): String? {
    return _UserToken
}

fun setUserToken(s: String) {
    _UserToken = s
}

private var _UserTypeId : Long? = null;
fun getUserTypeId(): Long? {
    return _UserTypeId
}

fun setUserTypeId(s: Long) {
    _UserTypeId = s
}


override fun getItemCount() = this.jobListItems.size

override fun onBindViewHolder(holder: JobViewHolder, position: Int) = holder.let {
    it.clear()
    it.onBind(position)
}

override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int) = JobViewHolder(LayoutInflater.from(parent?.context)
        .inflate(R.layout.item_inapproval_list, parent, false))

internal fun addJobsToList(jobs: List<JobItem>, profileId: Long?, userToken: String?, userTypeId: Long?) {
    this.jobListItems.addAll(jobs)
    setProfileId(profileId!!.toLong())
    setUserToken(userToken!!)
    setUserTypeId(userTypeId!!)
    notifyDataSetChanged()
}

inner class JobViewHolder(view: View) : RecyclerView.ViewHolder(view) {

    fun clear() {
        itemView.tv_job_id.text = "";
        itemView.tv_job_title.text= "";
        //itemView.tv_job_description.text ="";
        itemView.tv_job_category.text ="";
        itemView.tv_date_created.text ="";
    }

    fun onBind(position: Int) {

        val (jobId, name, description, serviceId, serviceName,
                address, engineerIds, engineerNames, startDateTimeUtc,
                startDateTimeLocal, endDateTimeUtc, endDateTimeLocal,
                customerId, customerName, customerMobile, customerAltMobile,
                priorityTypeId, priorityTypeName, statusTypeId, statusTypeName,
                isDeleted, isStatusTypeActive, createdBy, createdByName,
                dateCreatedPretty, modifiedBy, modifiedByName ,hasJobMedia,
                jobMedias, hasJobFeedback, jobDetailsImage, dateCreatedUtc, dateModifiedUtc) = jobListItems[position]

        inflateData(jobId, name,
                description,
                serviceId,
                serviceName,
                address,
                engineerIds,
                engineerNames,
                startDateTimeUtc,
                startDateTimeLocal,
                endDateTimeUtc,
                endDateTimeLocal,
                customerId,
                customerName,
                customerMobile,
                customerAltMobile,
                priorityTypeId,priorityTypeName,
                statusTypeId,
                statusTypeName,
                isDeleted,
                isStatusTypeActive,
                createdBy,
                createdByName,
                dateCreatedPretty,
                modifiedBy,
                modifiedByName ,
                hasJobMedia,
                jobMedias, hasJobFeedback, jobDetailsImage, dateCreatedUtc, dateModifiedUtc)
        setItemClickListener(jobId)
    }

    private fun setItemClickListener(jobId: Long?) {
        itemView.setOnClickListener {
            jobId?.let {
                try {
                    val intent = Intent(itemView.context, ServiceDetailActivity::class.java)
                    intent.putExtra("JobId", jobId)
                    itemView.context.startActivity(intent)
                } catch (e: Exception) {
                    Toast.makeText(itemView.context, e.message, Toast.LENGTH_LONG).show()
                }
            }
        }

        itemView.btn_accept.setOnClickListener {



        }

        itemView.btn_reject.setOnClickListener{

        }
    }
    private fun inflateData(jobId: Long?, name: String?, description: String?, serviceId: Long?, serviceName: String?, address: String?, engineerIds: String?,
                            engineerNames: String?, startDateTimeUtc: String?, startDateTimeLocal: String?, endDateTimeUtc: String?,
                            endDateTimeLocal: String?, customerId: Long?, customerName: String?, customerMobile:String?, customerAltMobile: String?,
                            priorityTypeId: Long?, priorityTypeName: String?, statusTypeId: Long?, statusTypeName: String?, isDeleted: Boolean?, isStatusTypeActive: Boolean?,
                            createdBy: Long?, createdByName: String?, dateCreatedPretty: String?, modifiedBy: Long?, modifiedByName: String?, hasJobMedia: Boolean?,
                            jobMedias: List<JobDetailsImage>?, hasJobFeedback: Boolean?, jobDetailsImage:  List<JobDetailsImage>?, dateCreatedUtc: String?, dateModifiedUtc: String?) {
        name.let {
            itemView.tv_job_title.text = it;
        }
        jobId.let {
            itemView.tv_job_id.text = "Job\n#" + it
        }
        /*description.let {
            itemView.tv_job_description.text = it
        }*/
        serviceName.let {
            itemView.tv_job_category.text = it
        }
        dateCreatedPretty.let {
            itemView.tv_date_created.text = it
        }

        if(getUserTypeId() == AppConstants.UserType.Administrator.type ||
                getUserTypeId() == AppConstants.UserType.Admin.type)
        {
            itemView.btn_reject.text = "Reject";
        }
        else
        {
            itemView.btn_reject.text = "Delete";
            itemView.btn_accept.visibility = View.GONE
        }
    }

    private fun callJobStatusChangeApi(jobId: Long?, statusTypeId: Long?)
    {
        val androidId = Settings.Secure.getString(itemView.context.contentResolver, Settings.Secure.ANDROID_ID)

        Rx2AndroidNetworking.post(ApiEndPoint.ENDPOINT_JOB_CHANGEJOBSTATUS)
                .addHeaders("Authorization", "bearer " + getUserToken())
                .addQueryParameter("profileId",  getProfileId().toString())
                .addQueryParameter("jobId", jobId.toString())
                .addQueryParameter("statusTypeId", statusTypeId.toString())
                .addQueryParameter("DeviceId", androidId.toString())
                .build()
                .getAsObject(BaseResponse::class.java, object : ParsedRequestListener<BaseResponse> {

                    override fun onResponse(baseResponse: BaseResponse) {
                        // do anything with response
                        println("succeeded : " + baseResponse.succeeded)
                        println("message : " + baseResponse.message)

                        if(baseResponse.succeeded)
                        {
                            val inApprovalFragment : InApprovalFragment = InApprovalFragment()
                            inApprovalFragment.showStatusSubmissionSuccessMessage(itemView.context, baseResponse.message);
                            notifyDataSetChanged();
                        }
                    }

                    override fun onError(anError: ANError) {
                        // handle error
                        println(anError.message);
                    }

                })
    }

}

}

2 个答案:

答案 0 :(得分:1)

如果您在访问FragmentManager时遇到问题,只需将lambda传递给适配器作为接受按钮的OnClickListener:

class InApprovalAdapter(
    private val jobListItems: MutableList<JobItem>
    // If you have data to pass to the handler(like a jobId for example) 
    // modify the lambda like (Int) -> Unit
    private val acceptHandler: () -> Unit
    ) : RecyclerView.Adapter<InApprovalAdapter.JobViewHolder>() {

然后你可以使用那个lambda:

itemView.btn_accept.setOnClickListener {
     acceptHandler()
}

然后创建适配器:

val adapter = InApprovalAdapter(theListOfItems, val clickListener: (Item) -> Unit) {
    // I'm assuming you're creating this adapter inside the Fragment class
    // so at this point you can access getFragmentManager()
    // ideally you'll let the presenter know that something happened in the view: presenter.userAcceptedJob()
    // and the presenter will call back a method on the view to actually show the DialogFragment.
}

答案 1 :(得分:0)

我做同样的事情,显示从适配器调用的自定义对话框,从片段中调用。不需要制作对话框片段,它将做同样的事情。

设置适配器时从片段传递活动

在ListFragment中:-

rvAdapter = Listadapter( listnotes,activity!!)

在Listadapter类中:-

class Listadapter( val DataList: ArrayList<String>?,val parentActivity: Activity) : RecyclerView.Adapter<Listadapter.ViewHolder>() {}

在onBindViewHolder方法中:-

view.notes.setOnClickListener {
        DialogNOTES(parentActivity,DataList[position])
    }

make方法在Listadapter类中显示自定义的Dailog:-

private fun DialogNOTES(parentActivity: Activity,notes:String) {
    val dialog = Dialog(parentActivity)
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)
    dialog.setCancelable(true)
    dialog.setContentView(R.layout.notes_dilog)//custom dialog layout 
    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

    dialog.show()

    dialog.dilog_notes.setText(notes)


}