1
resposta

[Projeto] Problemas na exibição de cards no orçamento

Como faço para os cards aparecem um me baixo do outro sem substituir o anterior? E também quando eu saio da tela ou do app os cards somem.

Esse código em composto pelo HomeFragment.kt:

class BudgetsFragment : Fragment() {

    private lateinit var adapter: CardAdapter
    private lateinit var recyclerView: RecyclerView
    private var cardList: MutableList<CardItem> = mutableListOf()

    private val retrofit = Retrofit.Builder()
        .baseUrl("https://647fc34cf061e6ec4d485612.mockapi.io/")
        .addConverterFactory(GsonConverterFactory.create())
        .build()

    private val apiService: CardService = retrofit.create(CardService::class.java)

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val rootView = inflater.inflate(R.layout.fragment_budgets, container, false)

        recyclerView = rootView.findViewById(R.id.recyclerView)
        recyclerView.layoutManager = LinearLayoutManager(context)

        val itemId = arguments?.getInt("itemId", -1) ?: -1

        if (!::adapter.isInitialized) {
            adapter = CardAdapter(cardList)
            recyclerView.adapter = adapter
        }

        apiService.getCards().enqueue(object : Callback<List<CardItem>> {
            override fun onResponse(call: Call<List<CardItem>>, response: Response<List<CardItem>>) {
                if (response.isSuccessful) {
                    val cards = response.body() ?: emptyList()
                    val filteredList = cards.filter { it.id == itemId }

                    if (filteredList.isEmpty()) {
                        Toast.makeText(context, "Seu orçamento está vazio.", Toast.LENGTH_SHORT).show()
                    }

                    cardList.clear()
                    cardList.addAll(filteredList)

                    adapter.notifyDataSetChanged()
                }
            }

            override fun onFailure(call: Call<List<CardItem>>, t: Throwable) {}
        })

        return rootView
    }
}

Esse código em composto pelo CardAdapter.kt:

class CardAdapter(
    private var cardList: List<CardItem>
) : RecyclerView.Adapter<CardAdapter.CardViewHolder>() {

    class CardViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val textViewCardTitle: TextView = itemView.findViewById(R.id.textViewCardTitle)
        val imageViewCardItem: ImageView = itemView.findViewById(R.id.imageViewCardItem)
        val imageButtonDeleteCard: ImageButton = itemView.findViewById(R.id.imageButtonDeleteCard)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CardViewHolder {
        val itemView = LayoutInflater.from(parent.context).inflate(R.layout.item_card_test, parent, false)
        return CardViewHolder(itemView)
    }

    override fun onBindViewHolder(holder: CardViewHolder, position: Int) {
        val currentItem = cardList[position]

        holder.textViewCardTitle.text = currentItem.nome

        Picasso.get().load(currentItem.imagem).into(holder.imageViewCardItem)

        holder.imageButtonDeleteCard.setOnClickListener {
            removeCard(position)
        }
    }

    private fun removeCard(position: Int) {
        val updatedList = cardList.toMutableList()
        updatedList.removeAt(position)

        cardList = updatedList.toList()
        notifyItemRemoved(position)
    }

    override fun getItemCount(): Int {
        return cardList.size
    }
}

Esse código em composto pelo DetailsFragment.kt que envia o card até BudgetsFragment.kt:

                        val buttonDetails = view.findViewById<AppCompatButton>(R.id.buttonDetails)
                        buttonDetails.setOnClickListener {
                            val bundle = Bundle()
                            bundle.putInt("itemId", detailsItem.id)
                            val navController = findNavController()
                            navController.navigate(R.id.nav_budgets, bundle)
                        }
1 resposta

Olá Giovanni!

Pelo que entendi, você está enfrentando dois problemas com a exibição dos cards no orçamento. O primeiro problema é que os cards estão sendo substituídos em vez de aparecerem um abaixo do outro. O segundo problema é que quando você sai da tela ou do aplicativo, os cards somem.

Para resolver o primeiro problema, você precisa garantir que os cards sejam adicionados à lista cardList do adaptador em vez de substituírem os cards existentes. No código do BudgetsFragment.kt, você está chamando o método cardList.clear() antes de adicionar os cards filtrados. Isso faz com que a lista seja limpa antes de cada requisição, resultando na substituição dos cards. Para corrigir isso, você pode remover a linha cardList.clear() e adicionar os cards filtrados diretamente à lista existente, utilizando o método addAll().

cardList.addAll(filteredList)

Para resolver o segundo problema, você precisa persistir os cards mesmo quando você sai da tela ou do aplicativo. Uma solução para isso é utilizar um banco de dados local para armazenar os cards. Você pode utilizar o Room, uma biblioteca de persistência do Android, para isso. Com o Room, você pode criar uma entidade para representar o card e uma classe de acesso a dados (DAO) para realizar as operações de inserção, atualização, exclusão e consulta dos cards.

No seu caso, você pode criar uma tabela no banco de dados para armazenar os cards e utilizar o método insertAll() do DAO para adicionar os cards filtrados. Em seguida, no método onCreateView() do BudgetsFragment.kt, você pode utilizar o método getAllCards() do DAO para obter os cards salvos no banco de dados e exibi-los na lista.

Lembre-se de adicionar as dependências do Room no arquivo build.gradle do seu projeto e de configurar o banco de dados e o DAO corretamente.

Espero que essas sugestões possam te ajudar a resolver os problemas com a exibição dos cards no orçamento. Se tiver mais alguma dúvida, é só me dizer! Espero ter ajudado e bons estudos!