Java 如何显示API-Kotlin-改装的特定数量的图像

Java 如何显示API-Kotlin-改装的特定数量的图像,java,android,api,kotlin,retrofit,Java,Android,Api,Kotlin,Retrofit,我从API调用数据来显示它以供使用,但在我的例子中,我想显示API的最新4个图像,我不想调用所有图像 那么正确的方法是什么呢 这是我的密码: 接口: interface facebookInterface { @GET(" ") fun getServices(): Call<List<facebookData>> companion object Factory { fun create(): facebookInterface {

我从API调用数据来显示它以供使用,但在我的例子中,我想显示API的最新4个图像,我不想调用所有图像

那么正确的方法是什么呢

这是我的密码:

接口:

interface facebookInterface {

@GET(" ")

fun getServices(): Call<List<facebookData>>

companion object Factory {
    fun create(): facebookInterface {
        val retrofit = Retrofit.Builder()
            .addConverterFactory(GsonConverterFactory.create())
            .baseUrl("API_URL")
            .build()

        return retrofit.create(facebookInterface::class.java)
    }
}
}
我正在获取数据,我可以在设备上看到它,但有没有办法只显示API中最新的4幅图像

以及如何链接每个图像的url,以便用户可以转到每个图像的url


“英语不是我的母语,如果你听不懂我的话,我会解释得更多”

正如Teo所说,你最好直接对API调用应用过滤器,但如果不可能,你可以删掉你收到的列表。 我能想到的主要有两种方法,它们可以满足您的需求,首先是生成一个子列表,然后按如下方式分配适配器

val trimmedList=if(list.size>4){
列表.子列表(从索引=0,到索引=3)
}否则{
列表
}
recyclerView.adapter=facebook适配器(trimmedList,this@MainActivity)
在Recycler视图适配器内重写itemCount方法的第二种方法,相同的逻辑应适用于该方法。内容如下

getItemCount():Int{
如果(countryList.size>4)返回{
4.
}否则{
countryList.size
}
}
对于您答案的第二部分,我添加了以下代码供您参考,但我仍然认为您最好了解正在发生的事情

要在浏览器中打开url,首先需要从适配器回调到MainActivity

您的适配器将被修改如下

类facebookAdapter(变量countryList:List,
专用val facebookAdapterCallback:facebookAdapterCallback)
:RecyclerView.Adapter(){
lateinit变量上下文:上下文
重写CreateViewHolder(父级:ViewGroup,viewType:Int):facebookAdapter.ViewHolder{
context=parent.context!!
val view=LayoutInflater.from(context).充气(R.layout.facebook\u list\u项,父项,false)
返回视图保持器(视图)
}
重写getItemCount():Int{
返回countryList.size
}
覆盖BindViewHolder(支架:facebookAdapter.ViewHolder,位置:Int){
holder.name.text=countryList[position]。来源
holder.capital.text=countryList[position].imageLink
holder.thumbnailUrl.setOnClickListener{
facebookAdapterCallback.onFacebookAdapterItemClick(国家/地区列表[位置])
}
毕加索
.load(countryList[position].imageUrl)
.memoryPolicy(memoryPolicy.NO_缓存、memoryPolicy.NO_存储)
.networkPolicy(networkPolicy.NO\u缓存、networkPolicy.NO\u存储)
.into(holder.thumbnailUrl)
}
类ViewHolder(itemView:View):RecyclerView.ViewHolder(itemView){
val名称:TextView=itemView.findViewById(R.id.country_名称)
val capital:TextView=itemView.findViewById(R.id.country\U capital)
val thumbnailUrl:ImageView=itemView.findViewById(R.id.country_标志)
}
接口FacebookAdapterCallback{
FaceBookAdapterItemClick(数据:facebookData)
}
}
接下来,我们必须修改您的活动,如下所示,以在其中实现上述接口

class MainActivity:AppCompatActivity(),facebookAdapter.FacebookAdapterCallback{
覆盖FaceBookAdapterItemClick(数据:facebookData){
openLinkInBrowser(this@MainActivity,data.imageLink)
}
有趣的openLinkInBrowser(上下文:上下文,url:String){
试一试{
val url=if(Uri.parse(url.scheme==null | | |!url.startsWith(“https://”)&!url.startsWith(“http://”)){
“https://$url”
}其他网址
val网页:Uri=Uri.parse(url)
val intent=intent(intent.ACTION_视图,网页)
if(intent.resolveActivity(context.packageManager)!=null){
上下文。起始触觉(意图)
}否则{
Toast.makeText(上下文,“没有可用于此操作的应用程序”,Toast.LENGTH\u SHORT.show()
}
}捕获(e:例外){
e、 printStackTrace()
}
}
}
我还添加了一个助手方法来在浏览器中打开链接,它使用默认的Android意图并检查可执行此操作的应用程序。 我们还检查URL是否附加了
http
https
,否则我们将添加它


虽然我已经向您提供了代码,但我仍然建议您在执行之前了解发生了什么。

您应该在API中应用过滤器,或者您可以获取最新的4幅图像并将其传递到adapter@Teo谢谢,但你能给我举个例子吗?因为我对Kotlin还是个新手你想得到最新的4张图片的参数是什么?时间戳?让我看看你的数据类FaceBookData第二种方法对我有效!,多谢各位much@user2很高兴能帮上忙,我意识到我在第一种方法中打错了。我也把它修好了。以防你需要它。你不会这样做,但它对其他人可能有用。是否可以链接来自同一API的图像?因为我正在获取数据,并且有一个帖子的URL,我如何将每个图片链接到它是URL?@user2你能更清楚地告诉我链接每个图片是什么意思吗?正如在中一样,当您单击每个图像时,是否要在浏览器中打开帖子的URL?确切地说,我已在此处更新了我的帖子,以包含“数据类”,因为我正在从API调用帖子,我希望如果有人单击了帖子,该帖子将打开浏览器并重定向到同一帖子
class facebookAdapter(var countryList: List<facebookData>, var activity: MainActivity): RecyclerView.Adapter<facebookAdapter.ViewHolder>(){
lateinit var context: Context
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): facebookAdapter.ViewHolder {
    context = parent.context!!
    val view = LayoutInflater.from(context).inflate(R.layout.facebook_list_item, parent, false)
    return ViewHolder(view)
}

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

override fun onBindViewHolder(holder: facebookAdapter.ViewHolder, position: Int) {
    holder.name.text = countryList[position].source
    holder.capital.text = countryList[position].imageLink



    Picasso.get()
        .load(countryList[position].imageUrl)
        .memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE)
        .networkPolicy(NetworkPolicy.NO_CACHE, NetworkPolicy.NO_STORE)
        .into(holder.thumbnailUrl)




}

class ViewHolder(itemView: View): RecyclerView.ViewHolder(itemView){
    val name: TextView = itemView.findViewById(R.id.country_name)
    val capital: TextView = itemView.findViewById(R.id.country_capital)
    val thumbnailUrl: ImageView = itemView.findViewById(R.id.country_flag)

}

}
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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:id="@+id/frame_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<androidx.cardview.widget.CardView
    android:id="@+id/list_card"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:cardCornerRadius="4dp"
    app:contentPadding="8dp">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/list_constraint"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/country_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:fontFamily="monospace"
            android:text="TextView"
            android:textSize="24sp"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/country_capital"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="8dp"
            android:layout_marginTop="8dp"
            android:fontFamily="monospace"
            android:text="TextView"
            android:textSize="18sp"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/country_name" />

        <ImageView
            android:id="@+id/country_flag"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_marginTop="8dp"
            android:layout_marginEnd="8dp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
</FrameLayout>
val recyclerView: RecyclerView = findViewById(R.id.list_recycler4)
    recyclerView.layoutManager = LinearLayoutManager(this)
    val facebookInterface = facebookInterface.Factory.create()
    val facebok: Call<List<facebookData>> = facebookInterface.getServices()
    facebok.enqueue(object : Callback<List<facebookData>> {
        override fun onFailure(call: Call<List<facebookData>>, t: Throwable) {
            Log.d("xxxx", t.toString())
            Toast.makeText(this@MainActivity, t.message, Toast.LENGTH_SHORT).show()
        }
        override fun onResponse(
            call: Call<List<facebookData>>,
            response: Response<List<facebookData>>
        ) {
            Log.d("xxxx", response.body().toString())
            val list = response.body()!!
            recyclerView.adapter = facebookAdapter(list, this@MainActivity)
        }
    })
data class facebookData (
val  imageUrl : String,
val imageLink: String,
val source: String
    )