Android使用RecyclerView显示最新电影

本文介绍如何使用RecyclerView结合OkHttp实现从服务器获取最新上映电影数据并显示的过程。通过具体代码实例展示了项目搭建步骤、依赖添加、布局文件设计及适配器编写等关键环节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天我们来使用RecyclerView显示最新上映的电影,显示最新上映的电影顾名思义我们需要去请求服务器接口然后解析显示。
效果图如下:
这里写图片描述
新建一个项目名为RecyclerViewTest然后在build.gradle中添加以下依赖库:

 compile 'com.android.support:recyclerview-v7:26.0.0-alpha1'
 compile 'com.squareup.okhttp3:okhttp:3.8.0'
 compile 'com.github.bumptech.glide:glide:3.7.0'

接着在AndroidManifest.xml中添加访问网络权限

 <uses-permission android:name="android.permission.INTERNET"/>

然后开始编写我们的布局文件activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
    tools:context="com.ranlegeran.recyclerviewtest.MainActivity"
    android:background="#FFFFFF">

   <android.support.v7.widget.RecyclerView
       android:id="@+id/mRecyclerView"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
   </android.support.v7.widget.RecyclerView>

</RelativeLayout>

film_item.xml布局文件:

<?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:orientation="vertical" >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="10dp"
        android:layout_marginLeft="2dp"
        android:layout_marginRight="10dp">

    <ImageView
        android:id="@+id/img_item_pic"
        android:layout_width="120dp"
        android:layout_height="120dp"
        android:src="@drawable/bg"/>

    <TextView
        android:id="@+id/text_item_film_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_toRightOf="@id/img_item_pic"
        android:text="后来的我们"
        android:textSize="17sp"/>

    <TextView
        android:id="@+id/text_item_released_time"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp"
        android:layout_below="@+id/text_item_film_name"
        android:layout_toRightOf="@id/img_item_pic"
        android:text="2018-04-28上映"
        android:textSize="16sp"/>

    <TextView
        android:id="@+id/text_item_score"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_marginTop="15dp"
        android:text="8.0分"
        android:textSize="15sp"/>

    <TextView
        android:id="@+id/text_item_starring"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp"
        android:layout_toRightOf="@id/img_item_pic"
        android:layout_below="@+id/text_item_released_time"
        android:text="主演:"
        android:textSize="16sp"/>

</RelativeLayout>
</LinearLayout>

接着我们需要创建一个适配器代码如下:

package com.ranlegeran.recyclerviewtest;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * Created by RANLEGERAN on 2018/4/30.
 */

public class FilmAdapter extends RecyclerView.Adapter<FilmAdapter.ViewHolder> {
    public List<Map<String,Object>> mList = new ArrayList<>();
    private Context mContext;
    private LayoutInflater mLayoutInflater;

    public FilmAdapter(List<Map<String,Object>> list, Context context) {
        this.mList = list;
        this.mContext = context;
        mLayoutInflater = LayoutInflater.from(context);
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = mLayoutInflater.inflate(R.layout.film_item, null);
        ViewHolder holder = new ViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        Glide.with(mContext).load(mList.get(position).get("img")).into(holder.mImgPic);
        holder.mTextFilmName.setText(mList.get(position).get("nm").toString());
        holder.mTextReleasedTime.setText(mList.get(position).get("rt").toString());
        holder.mTextScore.setText(mList.get(position).get("sc").toString());
        holder.mTextStarring.setText(mList.get(position).get("star").toString());
    }

    @Override
    public int getItemCount() {
        return mList.size(); //返回的数量
    }

    class ViewHolder extends RecyclerView.ViewHolder {
        ImageView mImgPic;
        TextView mTextFilmName;
        TextView mTextReleasedTime;
        TextView mTextScore;
        TextView mTextStarring;

        public ViewHolder(View itemView) {
            super(itemView);
            mImgPic = itemView.findViewById(R.id.img_item_pic);
            mTextFilmName = itemView.findViewById(R.id.text_item_film_name);
            mTextReleasedTime = itemView.findViewById(R.id.text_item_released_time);
            mTextScore = itemView.findViewById(R.id.text_item_score);
            mTextStarring = itemView.findViewById(R.id.text_item_starring);
        }
    }
}

用到的网络请求工具类如下:

package com.ranlegeran.recyclerviewtest;

import okhttp3.OkHttpClient;
import okhttp3.Request;

/**
 * Created by RANLEGERAN on 2018/4/30.
 */

public class OkHttpUtils {

    public static void sendOkHttpRequest(String address, okhttp3.Callback callback) {
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder().url(address).build();
        client.newCall(request).enqueue(callback);
    }
}

最后就是我们的MainActivity部分如下:

package com.ranlegeran.recyclerviewtest;

import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;

public class MainActivity extends AppCompatActivity {
    private static final String URL = "http://m.maoyan.com/movie/list.json?type=hot&offset=0&limit=1000";
    private RecyclerView mRecyclerView;
    private String mResult;
    public List<Map<String,Object>> mList = new ArrayList<>();

    public Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 1:
                    mRecyclerView.addItemDecoration(new DividerItemDecoration(MainActivity.this, DividerItemDecoration.VERTICAL));
                    FilmAdapter mAdapter = new FilmAdapter(mList, MainActivity.this);
                    mRecyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
                    mRecyclerView.setAdapter(mAdapter);
                    break;
                default:
                    break;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mRecyclerView = (RecyclerView) findViewById(R.id.mRecyclerView);
        GetData();
    }

    private void GetData() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                OkHttpUtils.sendOkHttpRequest(URL, new Callback() {

                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
                        mResult = response.body().string();
                        ToShowData(mResult);
                    }

                    @Override
                    public void onFailure(Call call, IOException e) {

                    }

                });
            }
        }).start();
    }

    private void ToShowData(String result) {
        try {
            JSONObject obj = new JSONObject(result);
            JSONObject jsonData = obj.getJSONObject("data");
            JSONArray jsonArray = jsonData.getJSONArray("movies");
            for (int i = 0; i < jsonArray.length(); i++) {
                obj = jsonArray.getJSONObject(i);
                Map<String,Object> map = new HashMap<>();
                String img = obj.getString("img");
                String nm = obj.getString("nm");
                String sc = obj.getString("sc");
                String rt = obj.getString("rt");
                String star = obj.getString("star");
                map.put("img", img);
                map.put("nm", nm);
                map.put("sc", sc+"分");
                map.put("rt", rt);
                map.put("star", "主演:"+star);
                mList.add(map);
            }
            Message msg = new Message();
            msg.what = 1;
            handler.sendMessage(msg);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}

好了,运行一下看看吧。

### 如何使用 RecyclerView 开发 '我爱电影' 应用 为了实现一个名为“我爱电影”的应用,可以通过 `RecyclerView` 来展示一系列的电影列表。以下是具体的实现方法以及示例代码。 #### 1. 创建布局文件 首先,在 XML 文件中创建用于显示电影列表的布局结构。通常会有一个根视图容器(如 `ConstraintLayout` 或 `LinearLayout`),其中包含一个 `RecyclerView` 和其他可能需要的控件。 ```xml <!-- activity_main.xml --> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- RecyclerView to display the movie list --> <androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerViewMovies" android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> ``` #### 2. 设计单个电影项的布局 接着,设计每部电影对应的布局文件。该布局将作为 `RecyclerView` 的子项。 ```xml <!-- item_movie.xml --> <?xml version="1.0" encoding="utf-8"?> <androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="8dp" android:elevation="4dp"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:padding="16dp"> <!-- Movie Poster ImageView --> <ImageView android:id="@+id/imageViewPoster" android:layout_width="100dp" android:layout_height="150dp" android:scaleType="centerCrop" android:src="@drawable/default_poster" /> <!-- Movie Details TextViews --> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="vertical" android:paddingLeft="16dp"> <TextView android:id="@+id/textViewTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Movie Title" android:textSize="18sp" android:textStyle="bold" /> <TextView android:id="@+id/textViewDescription" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Short Description of the Movie" android:textSize="14sp" /> <TextView android:id="@+id/textViewRating" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="IMDB Rating: X.X" android:textColor="#FFA726" android:textSize="14sp" /> </LinearLayout> </LinearLayout> </androidx.cardview.widget.CardView> ``` #### 3. 实现 Adapter 类 通过继承 `BaseQuickAdapter` 或原生的 `RecyclerView.Adapter`,编写适配器类来绑定数据到视图。 ```java // MovieAdapter.java import com.chad.library.adapter.base.BaseQuickAdapter; import com.chad.library.adapter.base.viewholder.BaseViewHolder; import java.util.List; public class MovieAdapter extends BaseQuickAdapter<Movie, BaseViewHolder> { public MovieAdapter(int layoutResId, List<Movie> data) { super(layoutResId, data); } @Override protected void convert(BaseViewHolder helper, Movie item) { // Bind data to views helper.setText(R.id.textViewTitle, item.getTitle()) .setText(R.id.textViewDescription, item.getDescription()) .setText(R.id.textViewRating, "IMDB Rating: " + item.getImdbRating()); // Load image using a library like Glide or Picasso helper.setImageResource(R.id.imageViewPoster, item.getPosterResourceId()); } } ``` #### 4. 设置 RecyclerView 并加载数据 在 Activity 中初始化并配置 `RecyclerView` 及其适配器。 ```java // MainActivity.java import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import android.os.Bundle; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { private RecyclerView recyclerViewMovies; private MovieAdapter adapter; private List<Movie> moviesList = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recyclerViewMovies = findViewById(R.id.recyclerViewMovies); recyclerViewMovies.setLayoutManager(new LinearLayoutManager(this)); // Initialize sample data initializeData(); // Set up and attach the adapter adapter = new MovieAdapter(R.layout.item_movie, moviesList); recyclerViewMovies.setAdapter(adapter); } private void initializeData() { // Add some dummy movie objects for demonstration purposes. moviesList.add(new Movie("Inception", "A thief who steals corporate secrets through dream-sharing technology.", 8.8f, R.drawable.inception)); moviesList.add(new Movie("Interstellar", "A team travels through a wormhole in space to ensure humanity's survival.", 8.6f, R.drawable.interstellar)); moviesList.add(new Movie("The Matrix", "A computer hacker learns about the true nature of his reality and his role in the war against its controllers.", 8.7f, R.drawable.the_matrix)); } } // Movie.java (Model Class) class Movie { private String title; private String description; private float imdbRating; private int posterResourceId; public Movie(String title, String description, float imdbRating, int posterResourceId) { this.title = title; this.description = description; this.imdbRating = imdbRating; this.posterResourceId = posterResourceId; } public String getTitle() { return title; } public String getDescription() { return description; } public float getImdbRating() { return imdbRating; } public int getPosterResourceId() { return posterResourceId; } } ``` 以上代码展示了如何利用 `RecyclerView` 构建一个简单的电影列表应用程序[^1]。此程序包含了基本的数据模型、适配器逻辑和 UI 布局的设计。 --- ####
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值