mirror of
https://github.com/Matte23/circolapp.git
synced 2025-12-06 07:29:10 +00:00
Add base viewmodel and recyclerview adapter logic
This commit is contained in:
@@ -0,0 +1,32 @@
|
||||
package net.underdesk.circolapp.adapters
|
||||
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.TextView
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import kotlinx.android.synthetic.main.item_circular.view.*
|
||||
import net.underdesk.circolapp.R
|
||||
import net.underdesk.circolapp.data.Circular
|
||||
|
||||
|
||||
class CircularLetterAdapter(private val circulars: List<Circular>) :
|
||||
RecyclerView.Adapter<CircularLetterAdapter.CircularLetterViewHolder>() {
|
||||
|
||||
inner class CircularLetterViewHolder(view: View) : RecyclerView.ViewHolder(view) {
|
||||
var title: TextView = view.circular_title_textview
|
||||
}
|
||||
|
||||
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CircularLetterViewHolder {
|
||||
val itemView = LayoutInflater.from(parent.context)
|
||||
.inflate(R.layout.item_circular, parent, false)
|
||||
|
||||
return CircularLetterViewHolder(itemView)
|
||||
}
|
||||
|
||||
override fun onBindViewHolder(holder: CircularLetterViewHolder, position: Int) {
|
||||
holder.title.text = circulars[position].name
|
||||
}
|
||||
|
||||
override fun getItemCount() = circulars.size
|
||||
}
|
||||
@@ -23,7 +23,7 @@ import androidx.room.PrimaryKey
|
||||
|
||||
@Entity(tableName = "circulars")
|
||||
data class Circular(
|
||||
@PrimaryKey(autoGenerate = true) val id: Long,
|
||||
@PrimaryKey(autoGenerate = true) val id: Long?,
|
||||
val name: String,
|
||||
val url: String
|
||||
)
|
||||
@@ -18,7 +18,6 @@
|
||||
|
||||
package net.underdesk.circolapp.data
|
||||
|
||||
import androidx.lifecycle.LiveData
|
||||
import androidx.room.Dao
|
||||
import androidx.room.Insert
|
||||
import androidx.room.OnConflictStrategy
|
||||
@@ -27,8 +26,11 @@ import androidx.room.Query
|
||||
@Dao
|
||||
interface CircularDao {
|
||||
@Query("SELECT * FROM circulars")
|
||||
fun getCirculars(): LiveData<List<Circular>>
|
||||
fun getCirculars(): List<Circular>
|
||||
|
||||
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
||||
suspend fun insertAll(circulars: List<Circular>)
|
||||
fun insertAll(circulars: List<Circular>)
|
||||
|
||||
@Query("DELETE FROM circulars")
|
||||
fun deleteAll()
|
||||
}
|
||||
@@ -25,7 +25,10 @@ import android.view.ViewGroup
|
||||
import androidx.fragment.app.Fragment
|
||||
import androidx.lifecycle.Observer
|
||||
import androidx.lifecycle.ViewModelProviders
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import kotlinx.android.synthetic.main.fragment_circular_letters.view.*
|
||||
import net.underdesk.circolapp.R
|
||||
import net.underdesk.circolapp.adapters.CircularLetterAdapter
|
||||
import net.underdesk.circolapp.viewmodels.CircularLetterViewModel
|
||||
|
||||
class CircularLetterFragment : Fragment() {
|
||||
@@ -37,11 +40,14 @@ class CircularLetterFragment : Fragment() {
|
||||
container: ViewGroup?,
|
||||
savedInstanceState: Bundle?
|
||||
): View? {
|
||||
val root = inflater.inflate(R.layout.fragment_circular_letters, container, false)
|
||||
|
||||
root.circulars_list.layoutManager = LinearLayoutManager(context)
|
||||
|
||||
circularLetterViewModel =
|
||||
ViewModelProviders.of(this).get(CircularLetterViewModel::class.java)
|
||||
val root = inflater.inflate(R.layout.fragment_circular_letters, container, false)
|
||||
circularLetterViewModel.text.observe(this, Observer {
|
||||
|
||||
circularLetterViewModel.circulars.observe(this, Observer {
|
||||
root.circulars_list.adapter = CircularLetterAdapter(it)
|
||||
})
|
||||
return root
|
||||
}
|
||||
|
||||
@@ -40,7 +40,7 @@ class FavouritesFragment : Fragment() {
|
||||
circularLetterViewModel =
|
||||
ViewModelProviders.of(this).get(CircularLetterViewModel::class.java)
|
||||
val root = inflater.inflate(R.layout.fragment_circular_letters, container, false)
|
||||
circularLetterViewModel.text.observe(this, Observer {
|
||||
circularLetterViewModel.circulars.observe(this, Observer {
|
||||
|
||||
})
|
||||
return root
|
||||
|
||||
@@ -40,7 +40,7 @@ class RemindersFragment : Fragment() {
|
||||
circularLetterViewModel =
|
||||
ViewModelProviders.of(this).get(CircularLetterViewModel::class.java)
|
||||
val root = inflater.inflate(R.layout.fragment_circular_letters, container, false)
|
||||
circularLetterViewModel.text.observe(this, Observer {
|
||||
circularLetterViewModel.circulars.observe(this, Observer {
|
||||
|
||||
})
|
||||
return root
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
package net.underdesk.circolapp.server
|
||||
|
||||
import com.google.gson.Gson
|
||||
import net.underdesk.circolapp.data.Circular
|
||||
import net.underdesk.circolapp.server.pojo.Response
|
||||
import org.jsoup.Jsoup
|
||||
import java.io.IOException
|
||||
@@ -33,16 +34,16 @@ class DataFetcher {
|
||||
}
|
||||
|
||||
@Throws(IOException::class)
|
||||
fun getCircularsFromServer(): ArrayList<Pair<String, String>> {
|
||||
public fun getCircularsFromServer(): List<Circular> {
|
||||
val json = gson.fromJson(retrieveDataFromServer(), Response::class.java)
|
||||
|
||||
val document = Jsoup.parseBodyFragment(json.content!!.rendered)
|
||||
val htmlList = document.getElementsByTag("ul")[0].getElementsByTag("a")
|
||||
|
||||
val list = ArrayList<Pair<String, String>>()
|
||||
val list = ArrayList<Circular>()
|
||||
|
||||
htmlList.forEach { element ->
|
||||
list.add(Pair(element.text(), element.attr("href")))
|
||||
list.add(Circular(null, element.text(), element.attr("href")))
|
||||
}
|
||||
|
||||
return list
|
||||
|
||||
@@ -18,14 +18,41 @@
|
||||
|
||||
package net.underdesk.circolapp.viewmodels
|
||||
|
||||
import android.app.Application
|
||||
import androidx.lifecycle.AndroidViewModel
|
||||
import androidx.lifecycle.LiveData
|
||||
import androidx.lifecycle.MutableLiveData
|
||||
import androidx.lifecycle.ViewModel
|
||||
import net.underdesk.circolapp.data.AppDatabase
|
||||
import net.underdesk.circolapp.data.Circular
|
||||
import net.underdesk.circolapp.server.DataFetcher
|
||||
|
||||
class CircularLetterViewModel : ViewModel() {
|
||||
class CircularLetterViewModel(application: Application) : AndroidViewModel(application) {
|
||||
|
||||
private val _text = MutableLiveData<String>().apply {
|
||||
value = ""
|
||||
private val _circulars: MutableLiveData<List<Circular>> by lazy {
|
||||
MutableLiveData<List<Circular>>().also {
|
||||
loadCirculars()
|
||||
}
|
||||
}
|
||||
|
||||
val circulars: LiveData<List<Circular>> = _circulars
|
||||
|
||||
private fun loadCirculars() {
|
||||
object : Thread() {
|
||||
override fun run() {
|
||||
_circulars.postValue(AppDatabase.getInstance(getApplication()).circularDao().getCirculars())
|
||||
updateCirculars()
|
||||
}
|
||||
}.start()
|
||||
}
|
||||
|
||||
private fun updateCirculars() {
|
||||
val fetcher = DataFetcher()
|
||||
|
||||
val newCirculars = fetcher.getCircularsFromServer()
|
||||
if (newCirculars.size != _circulars.value?.size ?: true) {
|
||||
_circulars.postValue(newCirculars)
|
||||
AppDatabase.getInstance(getApplication()).circularDao().deleteAll()
|
||||
AppDatabase.getInstance(getApplication()).circularDao().insertAll(newCirculars)
|
||||
}
|
||||
}
|
||||
val text: LiveData<String> = _text
|
||||
}
|
||||
@@ -3,8 +3,7 @@
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:id="@+id/container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:paddingTop="?attr/actionBarSize">
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<com.google.android.material.bottomnavigation.BottomNavigationView
|
||||
android:id="@+id/nav_view"
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<androidx.recyclerview.widget.RecyclerView
|
||||
android:id="@+id/circulars_list"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:layout_editor_absoluteX="168dp"
|
||||
tools:layout_editor_absoluteY="235dp" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
14
app/src/main/res/layout/item_circular.xml
Normal file
14
app/src/main/res/layout/item_circular.xml
Normal file
@@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="8dp"
|
||||
android:layout_marginTop="8dp"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/circular_title_textview"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content" />
|
||||
</LinearLayout>
|
||||
Reference in New Issue
Block a user