'Im creating app to print user`s repos as a recyclerview. Im using retrofit to get data from github API. Basically, app compiles, bot nothing shows up

RecyclerView

class RecyclerViewAdapter: RecyclerView.Adapter<RecyclerViewAdapter.RepoViewHolder>(){

inner class RepoViewHolder(val binding: RepoelementBinding): RecyclerView.ViewHolder(binding.root)

private val diffCallBack = object : DiffUtil.ItemCallback<userReposItem>(){
    override fun areItemsTheSame(oldItem: userReposItem, newItem: userReposItem): Boolean {
        return oldItem.url == newItem.url
    }

    override fun areContentsTheSame(oldItem: userReposItem, newItem: userReposItem): Boolean {
        return oldItem == newItem
    }
}

private val differ= AsyncListDiffer(this, diffCallBack)
var repos: List<userReposItem>
    get()=differ.currentList
    set(value) {differ.submitList(value)}

override fun getItemCount() = repos.size



override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RepoViewHolder {
    return RepoViewHolder(RepoelementBinding.inflate(
        LayoutInflater.from(parent.context),
        parent,
        false
    ))
}

override fun onBindViewHolder(holder: RepoViewHolder, position: Int) {
    holder.binding.apply{
        val repo = repos[position]
        urlOfRepo.text = repo.url
        nameOfRepo.text= repo.description


    }
}
}

RepoService

private const val BASE_URL = "https://api.github.com/"
//private const val ENDPOINT_URL= "https://api.github.com/users/${username}/repos"
interface GitHubReposAPIService{
//using only GetUserRepos
@GET("/users/{username}/repos")
suspend fun getUserRepos(@Path("username") username: String) : Response<List<userReposItem>>

@GET(BASE_URL+"users/{username}/{repo}/language")
suspend fun getLanguages(@Path("username") username:String,
                         @Path("repo") repo: String) : String

}

object UserRepoAPI{
private val moshi= Moshi.Builder()
    .add(KotlinJsonAdapterFactory())
    .build()

val retrofitService : GitHubReposAPIService by lazy {
    Retrofit.Builder()
        .addConverterFactory(MoshiConverterFactory.create(moshi))
        .baseUrl(BASE_URL)
        .build()
        .create(GitHubReposAPIService::class.java)
 }
 //val retrofitService : GitHubReposAPIService by lazy {      
 retrofit.create(GitHubReposAPIService::class.java)}
 }

Activity with List

const val TAG= "Repos"

 class UserProfile : AppCompatActivity() {
private lateinit var userName: String
private lateinit var Repos : RecyclerViewAdapter
private lateinit var binding: ActivityUserProfileBinding

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
 //        val binding: ViewDataBinding? = DataBindingUtil.setContentView(this,     
   R.layout.activity_user_profile)
    binding= ActivityUserProfileBinding.inflate(layoutInflater)
    setContentView(binding.root)

    userName = intent.getStringExtra("username").toString()

    val viewUserName= findViewById<TextView>(R.id.userDisplay)
    viewUserName.text=userName
    setupRepos()

    lifecycleScope.launchWhenCreated {
        val response=try{
            UserRepoAPI.retrofitService.getUserRepos(userName)
        } catch (e: IOException){
            Log.e(TAG, "Might not have internet connection")
            return@launchWhenCreated
        } catch (e: HttpException){
            Log.e(TAG, "HttpException, invalid response")
            return@launchWhenCreated
        }
        if(response.isSuccessful && response.body()!=null){
            Repos.repos=response.body()!!
        }else{
            Log.e(TAG, "Response not succesful")
        }
    }

}

private fun setupRepos() = binding.recyclerView?.apply{
    Repos = RecyclerViewAdapter()
    adapter = Repos
    layoutManager = LinearLayoutManager(this@UserProfile)

}

}

Data class I only want two parameters ( url of repo and its description). There is many more information, but I only need those 2 for every repo.

  @JsonClass(generateAdapter = true)
  @JsonIgnoreProperties(ignoreUnknown = true)
data class userReposItem(
@Json(name = "description")
val description: String? = "",
@Json(name = "url")
val url: String? = "",

) : Parcelable{
constructor(parcel: Parcel) : this(
    parcel.readString()!!,
    parcel.readString()!!
) {
}

override fun writeToParcel(parcel: Parcel, flags: Int) {
    parcel.writeString(description)
    parcel.writeString(url)
}

override fun describeContents(): Int {
    return 0
}

companion object CREATOR : Parcelable.Creator<userReposItem> {
    override fun createFromParcel(parcel: Parcel): userReposItem {
        return userReposItem(parcel)
    }

    override fun newArray(size: Int): Array<userReposItem?> {
        return arrayOfNulls(size)
    }
 }

 }

Layouts:

Main layout for printing list of repos. At the top of layout we have name of user and below should be list of repos (but as I mentioned it doesnt work)

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com    
/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".UserProfile">

<TextView
    android:id="@+id/userDisplay"
    android:layout_width="374dp"
    android:layout_height="38dp"
    android:layout_marginStart="16dp"
    android:layout_marginTop="4dp"
    android:layout_marginEnd="21dp"
    android:text="@string/username"
    app:layout_constraintBottom_toTopOf="@+id/recyclerView"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintVertical_bias="0.0" />

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/recyclerView"
    android:layout_width="409dp"
    android:layout_height="547dp"
    android:layout_marginBottom="4dp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent" />
 </androidx.constraintlayout.widget.ConstraintLayout>

List item I would like to print url of repo and its name ("description" as shown in github API)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<TextView
    android:id="@+id/urlOfRepo"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginStart="16dp"
    android:layout_marginTop="12dp"
    android:layout_marginEnd="89dp"
    android:layout_marginBottom="489dp"
    android:text="TextView"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/nameOfRepo" />

<TextView
    android:id="@+id/nameOfRepo"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:text="TextView"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/urlOfRepo" />

  </LinearLayout>


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source