Данные, не отображаемые в представлении переработчика

#java #android #kotlin #retrofit #retrofit2

Вопрос:

Я довольно новичок в мобильной разработке и котлине в целом. Прямо сейчас я пытаюсь заполнить recyclerview данными из базы данных. Проблема в том, что я знаю, что соединение установлено, потому что вижу сообщение журнала на консоли

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


Адаптер :

 class restaurantadapter(private var restaurantList: ArrayListlt;Restaurantgt;, private val context: Context) : RecyclerView.Adapterlt;restaurantadapter.ViewHoldergt;() {   override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {  return ViewHolder(LayoutInflater.from(context).inflate(R.layout.restaurant_card_view, parent, false))  }   override fun getItemCount(): Int {  return restaurantList.size  }   override fun onBindViewHolder(holder: ViewHolder, position: Int) {  val restaurant = restaurantList.get(position)  holder.titleTextView?.text = restaurant.title  holder.desTextView?.text = restaurant.description  }  class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {  var titleTextView: TextView? = null  var desTextView: TextView? = null   init {  titleTextView = itemView.findViewById(R.id.restaurantname)  desTextView = itemView.findViewById(R.id.restaurantdesc)   }  }  

Основная деятельность

 class Main1Activity : AppCompatActivity() {   var restaurantList: ArrayListlt;Restaurantgt; = ArrayList()  private var adapter: restaurantadapter? = null    override fun onCreate(savedInstanceState: Bundle?) {  super.onCreate(savedInstanceState)  setContentView(R.layout.activity_main1)   var recyclerView: RecyclerView = findViewById(R.id.restaurantslist)  recyclerView.layoutManager= LinearLayoutManager(this@Main1Activity)  adapter=restaurantadapter(restaurantList,this  )   recyclerView.adapter=adapter   ApiClient.getApiClient()!!.create(ApiInterface::class.java)   ApiClient.apiservice.getRestaurants()  .enqueue(object: Callbacklt;ArrayListlt;Restaurantgt;gt;{  override fun onResponse(  call: Calllt;ArrayListlt;Restaurantgt;gt;,  response: Responselt;ArrayListlt;Restaurantgt;gt;  )  {  val response = response.body()  response?.let {  restaurantList.addAll(it)  adapter?.notifyDataSetChanged()   }  }   override fun onFailure(call: Calllt;ArrayListlt;Restaurantgt;gt;, t: Throwable) {  Toast.makeText(this@Main1Activity,"failure",Toast.LENGTH_SHORT).show()  }  })     }  

расположение :

 lt;?xml version="1.0" encoding="utf-8"?gt; lt;androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:orientation="horizontal"  android:layout_margin="6dp"  app:contentPadding="12dp"   xmlns:app="http://schemas.android.com/apk/res-auto"  xmlns:tools="http://schemas.android.com/tools"  gt;   lt;androidx.constraintlayout.widget.ConstraintLayout  android:layout_width="match_parent"  android:layout_height="wrap_content"  android:padding="10dp"gt;   lt;TextView  android:id="@ id/restaurantname"  android:layout_width="match_parent"  android:layout_height="wrap_content"  android:layout_marginStart="20dp"  android:layout_marginTop="16dp"  android:layout_marginEnd="16dp"  android:textColor="@color/black"  android:textSize="22sp"  app:layout_constraintStart_toStartOf="parent"  app:layout_constraintTop_toTopOf="parent"  app:layout_constraintEnd_toEndOf="parent"  android:layout_gravity="center"  /gt;   lt;TextView  android:id="@ id/restaurantdesc"  android:layout_width="match_parent"  android:layout_height="wrap_content"  android:layout_gravity="center"  android:layout_marginStart="20dp"  android:layout_marginTop="55dp"  android:layout_marginEnd="16dp"  android:textColor="@color/black"  app:layout_constraintStart_toStartOf="parent"  app:layout_constraintTop_toBottomOf="@ id/restaurantname"  android:textSize="22sp"  /gt;  lt;/androidx.constraintlayout.widget.ConstraintLayoutgt;  lt;/androidx.cardview.widget.CardViewgt;  

Комментарии:

1. Не могли бы вы, пожалуйста, добавить код этого макета? R. макет.restaurant_card_view

2. да, это добавлено.

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

4. пожалуйста, проверьте еще раз сейчас, я отредактировал сообщение

Ответ №1:

Ваша проблема в том, что вы передали пустой список restaurantList адаптеру, а затем добавили ответ в этот список restaurantList.addAll(it) , но это приведет к обновлению списка в вашей деятельности, а не списка в адаптере, чтобы решить эту проблему, вы можете создать метод в адаптере для обновления его списка

 fun updateData(newRestaurant: ArrayListlt;Restaurantgt;) {  restaurantList = newRestaurant  notifyDataSetChanged() }  

Код в onResponse будет:

 val response = response.body() response?.let {  adapter.updateData(it) }  

Комментарии:

1. вы должны перейти adapter.notifyDataSetChanged() в updateData режим, чтобы представление не сообщало адаптеру об изменении, именно здесь возникают ошибки, когда вам нужно звонить в эту строку каждый раз, когда вы меняете данные, но этот ответ будет работать

2. @a_local_nobody Вы правы, я отредактирую его, спасибо

3. Большое вам спасибо, что нашли время ответить мне, просто короткий вопрос, newApples должен быть опечаткой, верно ? тем не менее … к сожалению, у меня все еще та же проблема, данные по-прежнему не отображаются

4. @ZahraCarthageCHOUCHENE Добро пожаловать, да, это опечатка, я отредактировал сообщение сейчас

5. @ZahraCarthageCHOUCHENE Не извиняйся, это нормально, все сталкиваются с этими ошибками