Creación de un cliente de noticias con los protocolos QUIC, MVVM y Data Binding [parte 3] | Daniel Mendoza Desarrolladores de Huawei Latinoamérica Octubre 2020

Autor del blog Ilustraciones de Gráficos de diseño

Después de la parte final de esta serie, es hora de leer nuestras noticias de RecyclerView con las noticias de newsapi.org.

El adaptador permite la gestión de proyecciones para cada una de las novedades que tenemos en nuestra lista.

En primer lugar, necesitamos definir nuestro ViewHolder, que combina un elemento de lista con una vista.

class NewsViewHolder(private val itemBinding: ArticleBinding) : RecyclerView.ViewHolder(itemBinding.root){
public fun bind(article: Article, newsVM: NewsViewModel){
itemBinding.article=article
itemBinding.mainVM=newsVM
}
}

Tan pronto como nuestro ViewHolder le indique una instancia de un artículo roto, ArticleBinding. Esta clase es generada por la librería Data Binding gracias a la configuración que proporcionamos en el layout item_view.xml

<data class="ArticleBinding">
<variable
name="article"
type="com.hms.demo.hquicnews.Article" />

<variable
name="mainVM"
type="com.hms.demo.hquicnews.NewsViewModel" />
</data>

Creación de un formulario para crear un enlace ViewHolder las Indicaciones del Artículo Vinculando la instancia del Artículo para actualizar el texto publicado en su TextView y el ViewModel para reportar los clics que el usuario tiene que ver.

ArticleBinding para aprender más sobre cómo obtener los datos del artículo que más te guste TextView tal como lo especificamos en el xml;

Nuestro adaptador reconoce la lista de noticias y ViewModel con onClickListener. Los adaptadores deben escribir los métodos RecyclerView.Adapter:

  • onCreateViewHolder: vea lo que sucede en su canción y contiene una lista de elementos. Aquí usaremos una instancia de ArticleBinding para crear y devolver un NewsViewHolder.
  • onBindViewHolder: Aquí vemos nuestro amplio viewHolder con una descripción detallada.
  • getItemCount: debe devolver la lista de la lista que el adaptador requerirá cuando encienda onCreateViewHolder.
class NewsAdapter(private val news:ArrayList<Article>,private val newsVM:NewsViewModel): RecyclerView.Adapter<NewsAdapter.NewsViewHolder>() {

class NewsViewHolder(private val itemBinding: ArticleBinding) : RecyclerView.ViewHolder(itemBinding.root){
public fun bind(article: Article, newsVM: NewsViewModel){
itemBinding.article=article
itemBinding.mainVM=newsVM
}
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NewsViewHolder {
val layoutInflater=LayoutInflater.from(parent.context)
val articleBinding=ArticleBinding.inflate(layoutInflater,parent,false)
return NewsViewHolder(articleBinding)
}

override fun onBindViewHolder(holder: NewsViewHolder, position: Int) {
holder.bind(news[position],newsVM)
}

override fun getItemCount(): Int {
return news.size
}

Siempre lo tenemos todo, pero ahora podemos acordar la funcionalidad de nuestra Actividad.

En primer lugar, debemos aplicar un Refactor -> Renombrar a MainActivity que generamos Android Studio para nuestro proyecto (esto es opcional y no tiene impacto en el funcionamiento de la aplicación).

class NewsActivity : AppCompatActivity(), SwipeRefreshLayout.OnRefreshListener, NewsViewModel.NewsViewModelListener{
private var adapter:NewsAdapter?=null
private lateinit var viewModel: NewsViewModel
private lateinit var binding: ActivityNewsBinding
}

Del método onVytvořte haremos lo siguiente

  • La vista enlaza nuestro diseño
  • Acordado onRefreshListener al SwipeRefreshLayout
  • Observador consistente como LiveData que contiene la lista de noticias
  • Llamar y NewsViewModel.loadNews, el. Vende las noticias y la lista es más o menos la misma enNewsDownloadComplete si tienes alguna noticia. Aquí es donde desea descargar y usar la pantalla de usuario.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

binding = ActivityNewsBinding.inflate(layoutInflater)
setContentView(binding.root)
this.viewModel = ViewModelProviders.of(this).get(NewsViewModel::class.java)
binding.swipeRefreshLayout.setOnRefreshListener(this)
binding.recyclerNews.layoutManager=LinearLayoutManager(this)

viewModel.news.observe(this){
adapter= NewsAdapter(it,viewModel)
binding.recyclerNews.adapter=adapter
}
binding.swipeRefreshLayout.isRefreshing=true
viewModel.listener=this
viewModel.loadNews(this)
}

En el método Refresh, llegamos a getNews para descargar el paquete y el usuario estará al tanto de la lista de intenciones.

override fun onRefresh() {
viewModel.getNews(this)
}

Para el único propósito, debemos describir los métodos de NewsViewModel.NewsViewModelListener.

En OnNewsDownloadComplete, si la descarga está completa y hay un problema, SwipeRefreshLayout le mostrará ProgressBar.

override fun onNewsDownloadComplete() {
binding.swipeRefreshLayout.isRefreshing=false
}

Desde el método onItemClick se puede decidir que el usuario haga clic aquí en la noticia. En este caso, abriremos la noticia en una interfaz de navegador configurada por defecto.

override fun onItemClick(article: Article) {
val intent= Intent(Intent.ACTION_VIEW)
intent.data= Uri.parse(article.url)
startActivity(intent)
}

¡Y octubre! Para compilar y ejecutar la aplicación, siga el resultado a continuación:

Aplicación en funcionamiento

Eso es todo. Ahora tenemos una lista de aplicaciones para descargar HTTP / 3.

¡Gracias por leer!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *