2017-09-23 129 views
0

我想知道是否有人可以幫助我用Intent修復這個錯誤?在Kotlin的兩個活動之間傳遞一個對象實例

我有2個活動之間進行連接:第一活性「MainActivity.kt」, 第二對列表視圖「Main2Activity.kt」 爲網格視圖和我有2對象實例(適配器1,適配器2)從「Main2Activity .kt」我想通過特定對象實例(適配器1)或(適配器2)當點擊特定圖像中的‘MainActivity.kt’

注:我使用BaseAdapter

這裏是一個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 { 


      if (foodView.ivFoodImage.context!!.equals(a)) { 
       val intent = Intent(context, Main2Activity::class.java) 
       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) 

      } 
      else if (foodView.ivFoodImage.context!!.equals(b)) { 
       val intent = Intent(context, Main2Activity::class.java) 
       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 
    } 

} 
} 

這裏是一個Main2Activity.kt

class Main2Activity : AppCompatActivity() { 
companion object { 
    val EXTRA_ADAPTER_MODE = "extra_adapter_mode" 
} 
var adapter1: FoodAdapter? = null 
var adapter2: FoodAdapter2? = null 
var listOfFoods2 = ArrayList<Food>() 
var listOfFoods3 = ArrayList<Food>() 
override fun onCreate(savedInstanceState: Bundle?) { 
    super.onCreate(savedInstanceState) 
    setContentView(R.layout.activity_main2) 


    val bundle = intent?.getIntExtra(EXTRA_ADAPTER_MODE, AdapterType.ADAPTER_TYPE_1.ordinal) 
    val name = bundle?.let { AdapterType.fromOrdinal(it) } 
    val des = bundle?.let { AdapterType.fromOrdinal(it) } 
    val image = bundle?.let { AdapterType.fromOrdinal(it) } 

    //val bundle = intent.extras 
    //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)) 

     //listOfFoods2.add(Food("Coffee"," Coffee preparation is",R.drawable.c)) 
     //listOfFoods2.add(Food("Coffee"," Coffee preparation is",R.drawable.d)) 


    // load foods3 


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



    if(adapter1 ==lvFoods2.adapter) { 
     adapter1 = FoodAdapter(listOfFoods2, this) 
     lvFoods2.adapter = adapter1 
    } else if (adapter2==lvFoods2.adapter) { 
     adapter2 = FoodAdapter2(listOfFoods3, this) 
     lvFoods2.adapter = adapter2 
    } 

    } 


class FoodAdapter : 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, p1: View?, p2: ViewGroup?): View { 
     val food = this.listOfFoodsLocal2[p0] 
     var inflator = context!!.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater 
     val foodView = inflator.inflate(R.layout.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(R.layout.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 
    } 

} 
} 

這是枚舉類

enum class AdapterType { 
ADAPTER_TYPE_1, 
ADAPTER_TYPE_2, 
ADAPTER_TYPE_3; 


companion object { 
    fun fromOrdinal(name:String,des:String,image: Int): AdapterType? { 
     return AdapterType.values().firstOrNull { it.ordinal == image} 



    } 
} 
} 
+0

,我不認爲這個代碼將編譯,不是嗎?在你的意圖中,你指定了你想要去的活動。您無法指定適配器。把另一個布爾值加入到intent中,然後根據布爾值來決定使用什麼適配器... –

+0

謝謝@Nino Handler,是的,我的代碼不能編譯 – Marzadmz

+0

boolean接受true或false,其實在Activity 2中我想添加超過2個適配器不僅2它的50個適配器(每個適配器有不同的ArrayList),所以我怎麼做,沒有指定適配器 – Marzadmz

回答

2

創建IntDef像:

@Retention(SOURCE) 
@IntDef({ADAPTER_MODE_1, ADAPTER_MODE_2, ADAPTER_MODE_3}) 
public @interface AdapterMode {} 
public static final int ADAPTER_MODE_1 = 0; 
public static final int ADAPTER_MODE_2 = 1; 
public static final int ADAPTER_MODE_3 = 2; 
//... 

和INT添加到包。 對於科特林你必須使用一個companion object定義像

class FirstActivity { 
    companion object { 
     val ADAPTER_MODE1 = 0 
     val ADAPTER_MODE2 = 1 
     val ADAPTER_MODE3 = 2 
     //... 
    } 
} 

變量所以,你可以通過無限適配器的情況下,以你的第二個活動

編輯: 科特林doesn't support @IntDef所以你應該使用枚舉爲:

enum class AdapterType { 
    ADAPTER_TYPE_1, 
    ADAPTER_TYPE_2, 
    ADAPTER_TYPE_3; 

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

然後使用它像:

class FirstActivity : AppCompatActivity() { 

    override fun onCreate(savedInstanceState: Bundle?) { 
     super.onCreate(savedInstanceState) 
     setContentView(R.layout.activity_main) 

     val intent = Intent(this, SecondActivity::class.java) 
     intent.putExtra(SecondActivity.EXTRA_ADAPTER_MODE, AdapterType.ADAPTER_TYPE_2.ordinal) 
    } 
} 

和檢索它像:

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

    override fun onCreate(savedInstanceState: Bundle?) { 
     super.onCreate(savedInstanceState) 
     //... 
     val adapterTypeOrdinal = intent?.getIntExtra(EXTRA_ADAPTER_MODE, AdapterType.ADAPTER_TYPE_1.ordinal) 
     val adapterType = adapterTypeOrdinal?.let { AdapterType.fromOrdinal(it) } 

     // do something with it 
    } 
} 
+0

感謝@Nino Handler的回答,實際上我創建了一個「IntDef」並且我的問題代碼已更新,在您的第二部分回答:請你能幫助我,因爲我不知道如何將int添加到包中,以及在第二個活動中添加伴隨對象代碼的位置,請你檢查我的第二個活動 – Marzadmz

+0

我更新了我的答案,因爲Kotlin沒有支持@IntDef,我不知道。所以從編輯部分閱讀它。並更新您的問題 –

+0

謝謝@Nino Handler,我做到了,但這是我第一次使用枚舉,請你可以檢查我的問題代碼更新,因爲它還沒有完成 – Marzadmz

1

你不能傳遞活動之間的適配器。至少以一種乾淨的方式,由Google推薦。適配器既不實現Parcelable也不實現Serializable接口。正如Nino Handler指出的一般規則 - 使用Intent發送數據(不是適配器本身),它應該用於創建適配器。