Как показать фрагмент диалога в button.setOnClickListener из класса адаптера в Kotlin-MVP? - PullRequest
0 голосов
/ 17 мая 2018

Я разрабатываю одно приложение для Android, используя эту структуру Kotlin-MVP . У меня есть одно действие, и оно содержит TabLayout из 4 фрагментов. Весь фрагмент имеет одну кнопку в RecyclerView. Мне нужно показать одно «Fragment Dialog» на слушателе щелчка этой кнопки. Подскажите, пожалуйста, как я могу показать диалог фрагмента при прослушивании нажатия кнопки из класса адаптера? Пожалуйста, просмотрите скриншот.

enter image description here

Я получаю доступ к кнопке на событии прослушивателя щелчков из класса Adapter, который находится ниже 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);
                    }

                })
    }

}

}

1 Ответ

0 голосов
/ 18 мая 2018

Если у вас возникли проблемы с доступом к FragmentManager, вы можете просто передать лямбду своему адаптеру в качестве 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>() {

Тогда вы можете использовать эту лямбду:

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.
}
...