Получить выбранный элемент в адаптере утилита просмотра - PullRequest
0 голосов
/ 28 июня 2019

Я хочу создать приложение для Android с Kotlin.В этом приложении я также использую сваггер, чтобы получить все веб-службы в файле.Я хочу создать интерфейс, описание которого выглядит следующим образом:

Горизонтальный объект RecyclerView, содержащий весь список категорий, поступает из веб-службы apiMobileProductCategoriesGetAllPost .после этого, когда я нажимаю на какую категорию, появляется RecyclerView (Grid), который содержит весь продукт по идентификатору категории.

Я хочу знать, как я могу получить идентификатор категории, когда нажимаю наи как использовать его в задании Следующий адаптер категории RecyclerView:

 class CategoryAdapter(private val categories: Array<ProductCategoryData>) :
    RecyclerView.Adapter<CategoryAdapter.ViewHolder>(), View.OnClickListener {

    private var onItemClickListener: OnItemClickListener? = null

    override fun onClick(v: View?) {
        if (v != null) {
            onItemClickListener?.onItemClick(v, ProductCategoryData())
        }
    }

    fun setOnItemClickListener(onItemClickListener: OnItemClickListener) {
        this.onItemClickListener = onItemClickListener
    }

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

    override fun getItemCount() = categories.size

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val itemCategory: ProductCategoryData = categories[position]

        holder.categoryId.text = itemCategory.id.toString()

        println(holder.categoryId.text)
        println(itemCategory.name?.get("En").toString())
        holder.categoryName.text = itemCategory.name?.get("En").toString()
        println(itemCategory.id)
        if (itemCategory.logo != null) {
            Picasso.get()
                .load("..../T/${itemCategory.logo}")
                .into(holder.categoryImage, object : com.squareup.picasso.Callback {
                    override fun onError(e: Exception?) {
                        holder.categoryImage.setImageResource(R.drawable.homecraftdefault)
                    }

                    override fun onSuccess() {
                        Picasso.get().load("....T/${itemCategory.logo}")
                            .into(holder.categoryImage)
                    }

                })
            holder.itemView.setOnClickListener {
                onItemClickListener?.onItemClick(holder.itemView,itemCategory)
            }
        }
    }

    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), View.OnClickListener {
        val categoryName: TextView = itemView.categoryName
        val categoryImage: ImageView = itemView.categoryImage
        val categoryId: TextView = itemView.categoryId
        override fun onClick(v: View?) {
            if (v != null) {
                onItemClickListener?.onItemClick(v, ProductCategoryData())
            }
        }

    }

    interface OnItemClickListener {
        fun onItemClick(view : View, viewModel:ProductCategoryData)
    }

}

Следующий код относится к заданию:

class CategoryByProduct : AppCompatActivity(), CategoryAdapter.OnItemClickListener {

    override fun onItemClick(view: View, viewModel: ProductCategoryData) {
        var params =  "CategoryProductID";"5cc057458c4d9823743736d2"
        println(viewModel.id)
        val products = mobileApi!!.apiMobileProductsGetAllPost(params, 0, 50, "", "")
        recyclerViewProductByCategory.apply {
            recyclerViewProductByCategory.layoutManager = GridLayoutManager(this@CategoryByProduct, 2)
            recyclerViewProductByCategory.adapter = ProductAdapter(products)
        }    }

    var mobileApi: MobileApi? = null


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.list_product_by_category)
        mobileApi = MobileApi()
        val params = HashMap<String, String>()
        GlobalScope.launch(Dispatchers.IO) {

            val categories = mobileApi!!.apiMobileProductCategoriesGetAllPost(params, 0, 50, "", "")
            withContext(Dispatchers.Main) {
                recyclerViewCategories.apply {
                    recyclerViewCategories.layoutManager =
                        LinearLayoutManager(this@CategoryByProduct, OrientationHelper.HORIZONTAL, false)
                    recyclerViewCategories.adapter = CategoryAdapter(categories)
                }
            }
        }



    }


    }

Ответы [ 4 ]

0 голосов
/ 29 июня 2019

Чтобы получить данные от адаптера к действию, вы можете создать интерфейс в адаптере или глобально, а из действия вы можете передать этот интерфейс в конструктор адаптера и использовать его для получения данных.Я приведу вам пример.

interface ProductCategoryListner {
        fun getProductCategory(viewModel:ProductCategoryData)
    }

Не в конструкторе адаптера, добавьте этот интерфейс.

class CategoryAdapter(private val categories: Array<ProductCategoryData>,private val productCategoryListner: ProductCategoryListner):
    RecyclerView.Adapter<CategoryAdapter.ViewHolder>(), View.OnClickListener {

Теперь вы можете использовать это для передачи данных в упражнении, когда вы нажимаете на представление.

productCategoryListner.getProductCategory(categories[adapterPosition])

0 голосов
/ 28 июня 2019

В вашем случае это очень просто. Попробуйте следующее: -

holder.tv_broadcast_title.text=broadList[position].name

, где broadlist - мой список массивов, созданный в самом адаптере. В этом списке данные json получаютсясохраняются из API.

internal var broadList = ArrayList<Model>()

и .name - это имя ключа для извлечения имени из данных json.

holder.categoryName.text = itemCategory.name?.get("En").toString()

в вашем случае сделайте что-то подобное: -

itemCategory[position].name
0 голосов
/ 28 июня 2019

Прежде всего, никогда не помещайте свои onclick в onBindViewHolder Это не очень хорошая практика, после этого я думаю, что вам нужно получить ID категории, которую я приведу вам простой пример во всем классе адаптеров.

class NewsAdapter (val context: Context, private val arrayList: ArrayList <NewsModel>):
RecyclerView.Adapter <NewsAdapter.Holder> () {

companion object {
   // val TAG: String = OperationAdapter::class.java.simpleName
}

override fun onCreateViewHolder (parent: ViewGroup, viewType: Int): Holder {
    return Holder (LayoutInflater.from (parent.context ).inflate (R.layout.newslist , parent, false))
}

override fun getItemCount (): Int = arrayList. size

override fun onBindViewHolder (holder: Holder, position: Int) {

    val mynews = arrayList[position]
    holder.setData(mynews , position)

}

inner class Holder (itemView: View): RecyclerView.ViewHolder (itemView) {
    private var currentnews: NewsModel? = null
    private var currentPosition: Int = 0


    init {
        //The click listener

        itemView.newscardview.setOnClickListener {

            //do it here
            Toast.makeText(this,currentnews!!.id,Toast.LENGTH_SHORT).show()

        }
        //the end of the init
    }

    //getting data from model and bind it into View
    fun setData(news: NewsModel?, position: Int) {
        news?.let {
            itemView.newsid.text = news.id
            itemView.newstitle.text = news.title
            itemView.body.text = news.body
            itemView.txtdate.text = news.ndate

        }

        this.currentnews = news
        this.currentPosition = position
        }
      }

   }

В этом примере вы получите новости ID, когда вы нажмете newscardview, я надеюсь понять это

В вашей деятельности

введите этот код в onCreate

//set up the recycleview
mRecyclerView.setHasFixedSize (true)
mRecyclerView. layoutManager = LinearLayoutManager(this)

mRecyclerView - это мой RecycleView

также вызывайте свой класс Адаптер в любом месте, куда вы хотите

//adapter
      val adapter = NewsAdapter (this,arrayList)
                    adapter.notifyDataSetChanged()
                    mRecyclerView.adapter = adapter
0 голосов
/ 28 июня 2019

вы получаете положение категории внутри держателя, вызывая adapterPosition, и с этим вы можете получить категорию из списка, который вы предоставляете адаптеру в конструкторе (категории [adapterPosition])

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...