2017-06-20 94 views
1

指定我从片段运行GirlQualitiesChoiceDialog像下面拉姆达解雇DialogFragment:如何从主叫科特林

 girlType.setOnClickListener { 
       GirlQualitiesChoiceDialog.show(activity, InitialDataSet.instance.QUALITY_TYPE_COLOR){ 
       Picasso.with(context).load(it.resId).into(colorTypeImage as ImageView) 
      //GirlQualitiesChoiceDialog.this.dismiss() - need to dismiss the created dialog 
       } 
     } 

凡注明听众。我需要的是在我加载图片后关闭对话框。 GirlQualitiesChoiceDialog.this.dismiss()不起作用。

有人可以告诉我,我该怎么解雇GirlQualitiesChoiceDialog在这里?假设我需要将对话回调以某种方式传递给lambda,但无法实现。

下面是我的对话框的代码:

class GirlQualitiesChoiceDialog : DialogFragment() { 

    companion object { 
     val ARG_QUALITY_TYPE = "ARG_QUALITY_TYPE" 

     private lateinit var itemClickInterface: (Quality) -> Unit 

     fun show(activity: Activity, qualityType: Int, itemClick: (Quality) -> Unit) { 
      itemClickInterface = itemClick 
      GirlQualitiesChoiceDialog().apply { 
       arguments = Bundle().apply { 
        putInt(ARG_QUALITY_TYPE, qualityType) 
       } 
      }.show((activity as AppCompatActivity).supportFragmentManager, TAG) 
     } 
    } 

    private lateinit var adapter: QualitiesAdapter 

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { 

     val choiceDialogView = activity.getLayoutInflater().inflate(horizontal_list_view, null) 
     val layoutManager = LinearLayoutManager(activity, LinearLayoutManager.HORIZONTAL, false) 
     choiceDialogView.horisontalCardsRecyclerView.setLayoutManager(layoutManager) 

     with(ItemClickSupport.addTo(choiceDialogView.horisontalCardsRecyclerView)) { 
      setOnItemLongClickListener { recyclerView, position, v -> 
       val quality = v.getTag() as Quality; 
       dismiss() 
       true 
      } 
     } 

     var qualityType = arguments.getInt(ARG_QUALITY_TYPE) 

     var title = -1 
     when (qualityType) { 
      InitialDataSet.instance.QUALITY_TYPE_COLOR -> { 
       title = R.string.choose_color_type 
       adapter = QualitiesAdapter(InitialDataSet.instance.qualities, itemClickInterface) 
      } 
     } 

     choiceDialogView.horisontalCardsRecyclerView.adapter = adapter 

     return AlertDialog.Builder(activity) 
       .setTitle(title) 
       .setView(choiceDialogView) 
       .create() 
    } 
} 

和适配器

class QualitiesAdapter(val qualities: List<Quality>, val itemClick: (Quality) -> Unit) : 
    RecyclerView.Adapter<QualitiesAdapter.ViewHolder>() { 

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { 
    val view = LayoutInflater.from(parent.context).inflate(R.layout.selection_card, parent, false) 
    return ViewHolder(view, itemClick) 
} 

override fun onBindViewHolder(holder: ViewHolder, position: Int) { 
    holder.bindForecast(qualities[position]) 
} 

override fun getItemCount() = qualities.size 

class ViewHolder(view: View, val itemClick: (Quality) -> Unit) : RecyclerView.ViewHolder(view) { 

    fun bindForecast(quality: Quality) { 
     with(quality) { 
      Picasso.with(itemView.context).load(resId).into(itemView.selectionImage) 
      (itemView as BaseCardView).setStatusLabel(desc) 
      itemView.setTag(quality) 
      itemView.setOnClickListener { itemClick(this) } 
     } 
    } 
} 
+0

https://kotlinlang.org/docs/reference/this-expressions.html#qualified –

+0

这不是我可以在这里使用的。我只能做这个@ AddGirlFragment,但不能这样@ GirlQualitiesChoiceDialog。 AddGirlFragment是我打开GirlQualitiesChoiceDialog的片段。但我需要解除GirlQualitiesChoiceDialog。所以我需要通过一些链接将GirlQualitiesChoiceDialog传递给setOnClickListener主体。 –

回答

0

我建议你从你的表演方法返回对话框的实例,那么你可以在调用驳回背部。

变化展现在GirlQualitiesChoiceDialog类似如下:

fun show(activity: Activity, qualityType: Int, itemClick: (Quality) -> Unit): GirlQualitiesChoiceDialog { 
     itemClickInterface = itemClick 
     val dialog = GirlQualitiesChoiceDialog().apply { 
      arguments = Bundle().apply { 
       putInt(ARG_QUALITY_TYPE, qualityType) 
      } 
     } 
     dialog.show((activity as AppCompatActivity).supportFragmentManager, TAG) 
     return dialog 
    } 

这里的监听器代码:

girlType.setOnClickListener { 
    val dialog = GirlQualitiesChoiceDialog.show(activity, InitialDataSet.instance.QUALITY_TYPE_COLOR) { 
     Picasso.with(context).load(it.resId).into(colorTypeImage as ImageView) 
     dialog.dismiss() 
    } 
}