2017-10-08 4 views
1

Je me demande si quelqu'un peut m'aider à résoudre ce problème pour représenter When Expression bloc de code spécifique?Lorsque l'expression dans Kotlin ne fonctionne pas comme prévu

J'ai 2 activités pour se connecter entre le:

La première activité est MainActivity.kt et la deuxième activité est Main2Activity.kt, dans la 2ème activité je suis arrivé problème pour l'application Lorsque l'expression avec le bloc de code spécifique à l'intérieur Main2Activity class parce que je voulez passer un adaptateur spécifique à l'intérieur Main2Activity class lorsque cliquez sur l'image dans le MainActivity class comme en passant ADAPTER_TYPE_2 quand cliquez sur l'image b dans la première classe d'activité, et la question principale de ce qu'il est toujours le premier bloc-application des de code à l'intérieur Main2Activity class

Note: première activité utilisée GridView et 2ème activité utilisée ListView et j'ai 2 adaptateurs à l'intérieur Main2Activity.kt et j'utilise enum se composent de chaque adaptateur dans la 2ème activité

Voici une MainActivity.kt

class MainActivity : AppCompatActivity() { 

var adapter:FoodAdapter?=null 
var listOfFoods =ArrayList<Food>() 
override fun onCreate(savedInstanceState: Bundle?) { 
super.onCreate(savedInstanceState) 
setContentView(layout.activity_main) 


// load foods 
listOfFoods.add(Food("Coffee"," Coffee preparation is", a)) 
listOfFoods.add(Food("Coffee"," Coffee preparation is", b)) 
listOfFoods.add(Food("Coffee"," Coffee preparation is", c)) 
listOfFoods.add(Food("Coffee"," Coffee preparation is", d)) 

adapter= FoodAdapter(this,listOfFoods) 

gvListFood.adapter =adapter 

} 


class FoodAdapter: BaseAdapter { 
var listOfFood= ArrayList<Food>() 
var context: Context?=null 
constructor(context:Context,listOfFood:ArrayList<Food>):super(){ 
    this.context=context 
    this.listOfFood=listOfFood 
} 
override fun getView(p0: Int, p1: View?, p2: ViewGroup?): View? { 
    val food = this.listOfFood[p0] 
    var inflator = context!!.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater 
    var foodView= inflator.inflate(layout.food_ticket,null) 
    foodView.ivFoodImage.setImageResource(food.image!!) 
    foodView.ivFoodImage.setOnClickListener { 


     val intent = Intent(context, Main2Activity::class.java) 

     when (foodView) { 
      foodView.ivFoodImage.also { a } -> 
       intent.putExtra(Main2Activity.EXTRA_ADAPTER_MODE, AdapterType.ADAPTER_TYPE_1.ordinal) { 

        intent.putExtra("name", food.name!!) 
        intent.putExtra("des", food.des!!) 
        intent.putExtra("image", food.image!!) 
        context!!.startActivity(intent) 
       } 

      foodView.ivFoodImage.also { b } -> 
       intent.putExtra(Main2Activity.EXTRA_ADAPTER_MODE, AdapterType.ADAPTER_TYPE_2.ordinal) { 

        intent.putExtra("name", food.name!!) 
        intent.putExtra("des", food.des!!) 
        intent.putExtra("image", food.image!!) 
        context!!.startActivity(intent) 
      } 
     } 

    } 
    return foodView 
} 

override fun getItem(p0: Int): Any { 
    return listOfFood[p0] 
} 

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

override fun getCount(): Int { 

    return listOfFood.size 
} 

} 
} 

Voici food_ticket.xml pour la première activité

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
android:layout_width="63pt" 
android:layout_height="wrap_content" 
android:background="@color/gray" 
android:orientation="vertical" 
android:padding="3pt"> 

<LinearLayout 
android:gravity="center" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="@drawable/background" 
android:orientation="vertical"> 

<ImageView 
    android:id="@+id/ivFoodImage" 
    android:layout_width="50pt" 
    android:layout_height="50pt" 
    app:srcCompat="@drawable/c" /> 

<TextView 
    android:id="@+id/tvName" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:gravity="center" 
    android:text="Coffe" 
    android:textSize="20sp" /> 
</LinearLayout> 
</LinearLayout> 

Voici une Main2Activity.kt

class Main2Activity : AppCompatActivity() { 
companion object { 
    val EXTRA_ADAPTER_MODE = "extra_adapter_mode" 

} 

    var adapter1: FoodAdapter1?= null 
    var adapter2: FoodAdapter2? = null 
    var listOfFoods2 = ArrayList<Food>() 
    var listOfFoods3 = ArrayList<Food>() 
override fun onCreate(savedInstanceState: Bundle?) { 
    super.onCreate(savedInstanceState) 
    setContentView(activity_main2) 


    val bundle = intent.extras 
    val adapterTypeOrdinal = intent.getIntExtra(EXTRA_ADAPTER_MODE, 0) // 0 is the default value 
    val type = AdapterType.fromOrdinal(ordinal = adapterTypeOrdinal) 


    val name = bundle.getString("name") 
    val des = bundle.getString("des") 
    val image = bundle.getInt("image") 



    ivFoodImage2?.let { 
     it.setImageResource(image) 
    } 

    tvName2?.let { 
     it.text = name 
    } 

    tvDes2?.let { 
     it.text = des 
    } 


    // load foods2 
    listOfFoods2.add(Food("Coffee", " Coffee1 preparation is", R.drawable.a)) 
    listOfFoods2.add(Food("Coffee", " Coffee2 preparation is", R.drawable.b)) 



    // load foods3 
    listOfFoods3.add(Food("Coffee", " Coffee3 preparation is", R.drawable.c)) 
    listOfFoods3.add(Food("Coffee", " Coffee4 preparation is", R.drawable.d)) 

    //var ADAPTER_TYPE_1 = adapter1 
    //var ADAPTER_TYPE_2 = adapter2 

    lvFoods2.adapter = when (type) { 
     AdapterType.ADAPTER_TYPE_1-> FoodAdapter1(listOfFoods2, this) 
     AdapterType.ADAPTER_TYPE_2-> FoodAdapter2(listOfFoods3, this) 
     else -> lvFoods2.adapter 
    } 
} 



class FoodAdapter1 : BaseAdapter{ 
    var context: Context? = null 
    var listOfFoodsLocal2 = ArrayList<Food>() 

    constructor(listOfFoods2: ArrayList<Food>, context: Context) : super() { 
     this.listOfFoodsLocal2 = listOfFoods2 
     this.context = context 
    } 

    override fun getView(p0: Int, foodView: View?, p2: ViewGroup?): View { 
     val food = this.listOfFoodsLocal2[p0] 
     var inflator = context!!.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater 
     val foodView = inflator.inflate(food_ticket2, null) 



     foodView.ivFoodImage2?.let { 
      it.setImageResource(food.image!!) 
       } 
     foodView.tvName2?.let { 

      it.text = food.name!! 
     } 
     foodView.tvDes2?.let { 
      it.text = food.des!! 
     } 

     foodView.ivFoodImage2.setOnClickListener { 

      //move to next 
      val intent = Intent(context, FoodDetails::class.java) 
      intent.putExtra("name", food.name!!) 
      intent.putExtra("des", food.des!!) 
      intent.putExtra("image", food.image!!) 

      context!!.startActivity(intent) 

     } 
     return foodView 

    } 


    override fun getItem(p0: Int): Any { 
     return listOfFoodsLocal2[p0] 
    } 

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

    override fun getCount(): Int { 
     return listOfFoodsLocal2.size 
    } 

} 

class FoodAdapter2 : BaseAdapter { 
    var context: Context? = null 
    var listOfFoodsLocal3 = ArrayList<Food>() 

    constructor(listOfFoods3: ArrayList<Food>, context: Context) : super() { 
     this.listOfFoodsLocal3 = listOfFoods3 
     this.context = context 
    } 

    override fun getView(p0: Int, p1: View?, p2: ViewGroup?): View { 
     val food = this.listOfFoodsLocal3[p0] 
     var inflator = context!!.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater 
     val foodView = inflator.inflate(food_ticket2, null) 


      foodView.ivFoodImage2?.let { 
       it.setImageResource(food.image!!) 
      } 
      foodView.tvName2?.let { 
       it.text = food.name!! 
      } 
      foodView.tvDes2?.let { 
       it.text = food.des!! 
      } 




     foodView.ivFoodImage2.setOnClickListener { 

      //move to next 
      val intent = Intent(context, FoodDetails::class.java) 
      intent.putExtra("name", food.name!!) 
      intent.putExtra("des", food.des!!) 
      intent.putExtra("image", food.image!!) 

      context!!.startActivity(intent) 

     } 
     return foodView 

    } 


    override fun getItem(p0: Int): Any { 
     return listOfFoodsLocal3[p0] 
    } 

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

    override fun getCount(): Int { 
     return listOfFoodsLocal3.size 
    } 

} 
} 

activity_main2.xml pour la 2ème activité

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="@color/gray" 
android:orientation="vertical" 
tools:context="com.marzadmz.startup.Main2Activity"> 

<ListView 
android:id="@+id/lvFoods2" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="@color/gray" /> 
</LinearLayout> 

AdapterType.kt pour la classe enum

enum class AdapterType { 
ADAPTER_TYPE_1, 
ADAPTER_TYPE_2; 



    companion object { 
     fun fromOrdinal(ordinal: Int): AdapterType? { 
      return AdapterType.values().firstOrNull { it.ordinal == ordinal } 
     } 
    } 
} 

null error image 2nd picture

Répondre

1

La mise en œuvre est hors

var ADAPTER_TYPE_1 = adapter1 
var ADAPTER_TYPE_2 = adapter2 

lvFoods2.adapter = when (lvFoods2.adapter) { 
    ADAPTER_TYPE_1 -> FoodAdapter1(listOfFoods2, this).also { ADAPTER_TYPE_1 = it } 
    ADAPTER_TYPE_2 -> FoodAdapter2(listOfFoods3, this).also { ADAPTER_TYPE_2 = it } 
    else -> lvFoods2.adapter 
} 

La variable adapter1 est nulle ainsi que lvFoods2.adapter. De la façon dont je comprends votre code, il devrait ressembler à:

lvFoods2.adapter = when (type) { 
    ADAPTER_TYPE_1 -> FoodAdapter1(listOfFoods2, this) 
    ADAPTER_TYPE_2 -> FoodAdapter2(listOfFoods3, this) 
    else -> lvFoods2.adapter 
} 
+0

Merci beaucoup pour @tynn réponse, En fait, je l'ai fait, mais c'est montrer ce message mes 'types INCOMPATIBLES:? Main2Activity.FoodAdapter1 et AdapterType', et ma question est mise à jour en ajoutant une image 'erreur nulle' pouvez-vous la vérifier s'il vous plaît – andios

+0

Vous devez également supprimer le 'var ADAPTER_TYPE_x'. – tynn

+0

ma question est mise à jour, je l'ai fait mais c'est toujours le même, s'il vous plaît pouvez-vous vérifier ma deuxième photo @tynn – andios