'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 |
|---|
