News API Example
Learn how to integrate and use News API using the following example.
News-API
Android library for accessing News API. https://newsapi.org/.
Step 1: Install it
Integrating the library into you app is extremely easy. A few changes in the build gradle and your all ready to use the library. Make the following changes.
Step 1. Add the JitPack repository to your build file. Add it in your root build.gradle at the end of repositories:
Then Add the dependency:
Step 2: How to use the library?
Okay seems like you integrated the library in your project but how do you use it? Well its really easy just follow the steps below.
...
NewsApi.initialize("YOUR_API_KEY")
...
NewsApi.getSources(onSourcesListener = object :
OnSourcesListener {
override fun onSourcesResponse(sourcesResponse: SourcesResponse) {
Log.d("Response=>", sourcesResponse.toString())
}
override fun onError(apiError: ApiError?) {
Log.e("Response=>", apiError.toString())
}
})
Method and Parameters
Method | Use |
---|---|
getSources |
This endpoint returns the subset of news publishers that top headlines (/v2/top-headlines) are available from. It's mainly a convenience endpoint that you can use to keep track of the publishers available on the API, and you can pipe it straight through to your users. |
getTopHeadlines |
This endpoint provides live top and breaking headlines for a country, specific category in a country, single source, or multiple sources. You can also search with keywords. Articles are sorted by the earliest date published first. This endpoint is great for retrieving headlines for display on news tickers or similar. |
getEverything |
Search through millions of articles from over 30,000 large and small news sources and blogs. This includes breaking news as well as lesser articles. This endpoint suits article discovery and analysis, but can be used to retrieve articles for display, too. |
For more details on these method follow this
Full Example
App.kt
package `in`.madapps.newsapidemo
import android.app.Application
import org.newsapi.NewsApi
class App : Application() {
override fun onCreate() {
super.onCreate()
NewsApi.initialize("YOUR_API_KEY")
}
}
TopHeadlinesFragment.kt
package `in`.madapps.newsapidemo.fragment
import `in`.madapps.newsapidemo.R
import `in`.madapps.newsapidemo.adapter.ArticlesAdapter
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.snackbar.Snackbar
import kotlinx.android.synthetic.main.fragment_top_headlines.*
import org.newsapi.NewsApi
import org.newsapi.listener.OnArticlesListener
import org.newsapi.model.ApiError
import org.newsapi.model.response.ArticlesResponse
class TopHeadlinesFragment : Fragment(), OnArticlesListener {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_top_headlines, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
NewsApi.getTopHeadlines(onArticlesListener = this, searchTerm = "trump")
}
override fun onArticlesResponse(articlesResponse: ArticlesResponse) {
val adapter = ArticlesAdapter(articlesResponse.articles, context!!)
topHeadlinesRecyclerView.setHasFixedSize(true)
topHeadlinesRecyclerView.layoutManager = LinearLayoutManager(context)
topHeadlinesRecyclerView.adapter = adapter
}
override fun onError(apiError: ApiError?) {
Snackbar.make(topHeadlinesRootView, apiError?.message.toString(), Snackbar.LENGTH_SHORT)
.show()
}
}
SourcesFragment.kt
package `in`.madapps.newsapidemo.fragment
import `in`.madapps.newsapidemo.R
import `in`.madapps.newsapidemo.adapter.SourcesAdapter
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.snackbar.Snackbar
import kotlinx.android.synthetic.main.fragment_sources.*
import org.newsapi.NewsApi
import org.newsapi.listener.OnSourcesListener
import org.newsapi.model.ApiError
import org.newsapi.model.response.SourcesResponse
class SourcesFragment : Fragment(), OnSourcesListener {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_sources, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
NewsApi.getSources(onSourcesListener = this)
}
override fun onSourcesResponse(sourcesResponse: SourcesResponse) {
val adapter = SourcesAdapter(sourcesResponse.sources, context!!)
sourcesRecyclerView.setHasFixedSize(true)
sourcesRecyclerView.layoutManager = LinearLayoutManager(context)
sourcesRecyclerView.adapter = adapter
}
override fun onError(apiError: ApiError?) {
Snackbar.make(sourcesRootView, apiError?.message.toString(), Snackbar.LENGTH_SHORT).show()
}
}
EverythingFragment.kt
package `in`.madapps.newsapidemo.fragment
import `in`.madapps.newsapidemo.R
import `in`.madapps.newsapidemo.adapter.ArticlesAdapter
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.snackbar.Snackbar
import kotlinx.android.synthetic.main.fragment_everything.*
import org.newsapi.NewsApi
import org.newsapi.listener.OnArticlesListener
import org.newsapi.model.ApiError
import org.newsapi.model.response.ArticlesResponse
class EverythingFragment : Fragment(), OnArticlesListener {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_everything, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
NewsApi.getEverything(onArticlesListener = this, searchTerm = "dji")
}
override fun onArticlesResponse(articlesResponse: ArticlesResponse) {
val adapter = ArticlesAdapter(articlesResponse.articles, context!!)
everythingRecyclerView.setHasFixedSize(true)
everythingRecyclerView.layoutManager = LinearLayoutManager(context)
everythingRecyclerView.adapter = adapter
}
override fun onError(apiError: ApiError?) {
Snackbar.make(everythingRootView, apiError?.message.toString(), Snackbar.LENGTH_SHORT)
.show()
}
}
ArticlesAdapter.kt
package `in`.madapps.newsapidemo.adapter
import `in`.madapps.newsapidemo.R
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView
import com.squareup.picasso.Picasso
import org.newsapi.model.Article
class ArticlesAdapter(private val articles: List<Article>, private val context: Context) :
RecyclerView.Adapter<ArticlesAdapter.ArticleViewHolder>() {
override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): ArticleViewHolder {
return ArticleViewHolder(
LayoutInflater.from(viewGroup.context).inflate(
R.layout.articles_item_view, viewGroup, false
)
)
}
override fun onBindViewHolder(holder: ArticleViewHolder, position: Int) {
val article = articles[position]
Picasso.get().load(article.urlToImage).into(holder.articleImageView)
holder.titleTextView.text = article.title
holder.descriptionTextView.text = article.description
holder.publishedAtTextView.text =
String.format(context.getString(R.string.publishedAt), article.publishedAt)
holder.itemView.setOnClickListener {
val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(article.url))
ContextCompat.startActivity(context, browserIntent, null)
}
}
override fun getItemCount(): Int {
return articles.size
}
class ArticleViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var articleImageView: ImageView = itemView.findViewById(R.id.articleImageView)
var titleTextView: TextView = itemView.findViewById(R.id.titleTextView)
var descriptionTextView: TextView = itemView.findViewById(R.id.descriptionTextView)
var publishedAtTextView: TextView = itemView.findViewById(R.id.publishedAtTextView)
}
}
SourcesAdapter.kt
package `in`.madapps.newsapidemo.adapter
import `in`.madapps.newsapidemo.R
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.core.content.ContextCompat.startActivity
import androidx.recyclerview.widget.RecyclerView
import org.newsapi.model.Source
class SourcesAdapter(private val sources: List<Source>, private val context: Context) :
RecyclerView.Adapter<SourcesAdapter.SourcesViewHolder>() {
override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): SourcesViewHolder {
return SourcesViewHolder(
LayoutInflater.from(viewGroup.context).inflate(
R.layout.sources_item_view, viewGroup, false
)
)
}
override fun onBindViewHolder(holder: SourcesViewHolder, position: Int) {
val source = sources[position]
holder.nameTextView.text =
String.format(context.getString(R.string.name), source.name)
holder.descriptionTextView.text =
String.format(context.getString(R.string.description), source.description)
holder.categoryTextView.text =
String.format(context.getString(R.string.category), source.category)
holder.languageTextView.text =
String.format(context.getString(R.string.language), source.language)
holder.countryTextView.text =
String.format(context.getString(R.string.country), source.country)
holder.itemView.setOnClickListener {
val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(source.url))
startActivity(context, browserIntent, null)
}
}
override fun getItemCount(): Int {
return sources.size
}
class SourcesViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var nameTextView: TextView = itemView.findViewById(R.id.nameTextView)
var descriptionTextView: TextView = itemView.findViewById(R.id.descriptionTextView)
var categoryTextView: TextView = itemView.findViewById(R.id.categoryTextView)
var languageTextView: TextView = itemView.findViewById(R.id.languageTextView)
var countryTextView: TextView = itemView.findViewById(R.id.countryTextView)
}
}
ViewPagerAdapter.kt
package `in`.madapps.newsapidemo.adapter
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentPagerAdapter
import java.util.*
class ViewPagerAdapter(manager: FragmentManager?) :
FragmentPagerAdapter(manager!!, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
private val mFragmentList: MutableList<Fragment> = ArrayList()
override fun getItem(position: Int): Fragment {
return mFragmentList[position]
}
override fun getCount(): Int {
return mFragmentList.size
}
fun addFragment(fragment: Fragment) {
mFragmentList.add(fragment)
}
}
MainActivity.kt
package `in`.madapps.newsapidemo.activity
import `in`.madapps.newsapidemo.R
import `in`.madapps.newsapidemo.adapter.ViewPagerAdapter
import `in`.madapps.newsapidemo.fragment.EverythingFragment
import `in`.madapps.newsapidemo.fragment.SourcesFragment
import `in`.madapps.newsapidemo.fragment.TopHeadlinesFragment
import android.annotation.SuppressLint
import android.os.Bundle
import android.view.MenuItem
import androidx.appcompat.app.AppCompatActivity
import androidx.viewpager.widget.ViewPager.OnPageChangeListener
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
var sourceFragment: SourcesFragment? = null
var topHeadlinesFragment: TopHeadlinesFragment? = null
var everythingFragment: EverythingFragment? = null
var prevMenuItem: MenuItem? = null
@SuppressLint("CheckResult")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setupNavigation()
setupViewPager()
}
private fun setupViewPager() {
viewPager.addOnPageChangeListener(object : OnPageChangeListener {
override fun onPageScrolled(
position: Int,
positionOffset: Float,
positionOffsetPixels: Int
) {
}
override fun onPageSelected(position: Int) {
if (prevMenuItem != null) {
prevMenuItem!!.isChecked = false
} else {
bottomNavigationView.menu.getItem(0).isChecked = false
}
bottomNavigationView.menu.getItem(position).isChecked = true
prevMenuItem = bottomNavigationView.menu.getItem(position)
}
override fun onPageScrollStateChanged(state: Int) {}
})
val adapter = ViewPagerAdapter(supportFragmentManager)
sourceFragment = SourcesFragment()
topHeadlinesFragment = TopHeadlinesFragment()
everythingFragment = EverythingFragment()
adapter.addFragment(sourceFragment!!)
adapter.addFragment(topHeadlinesFragment!!)
adapter.addFragment(everythingFragment!!)
viewPager.adapter = adapter
}
private fun setupNavigation() {
bottomNavigationView.setOnNavigationItemSelectedListener { item ->
when (item.itemId) {
R.id.sources -> viewPager.currentItem = 0
R.id.topHeadlines -> viewPager.currentItem = 1
R.id.everything -> viewPager.currentItem = 2
}
false
}
}
}
Reference
Read more here.