#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 Не извиняйся, это нормально, все сталкиваются с этими ошибками