1. 项目中设计到的技术点
- 使用banner实现轮播图
- 使用okgo通过get请求获取豆瓣影片数据
- 使用RecyclerView+adapter实现影片列表数据
2.具体代码实现过程
- fragment_home.xml布局文件
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat 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:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".fragment.HomeFragment">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/purple_200"
app:title="首页"
app:titleTextColor="@color/white" />
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.youth.banner.Banner
android:id="@+id/banner"
android:layout_width="match_parent"
android:layout_height="128dp"
android:layout_margin="10dp" />
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:padding="10dp">
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:layout_width="32dp"
android:layout_height="32dp"
android:src="@mipmap/img_dyp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="电影票"
android:textSize="12sp" />
</androidx.appcompat.widget.LinearLayoutCompat>
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:layout_width="32dp"
android:layout_height="32dp"
android:src="@mipmap/img_yc" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="演出/玩乐"
android:textSize="12sp" />
</androidx.appcompat.widget.LinearLayoutCompat>
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:layout_width="32dp"
android:layout_height="32dp"
android:src="@mipmap/img_zb" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="周边"
android:textSize="12sp" />
</androidx.appcompat.widget.LinearLayoutCompat>
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:layout_width="32dp"
android:layout_height="32dp"
android:src="@mipmap/img_ms" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="密室"
android:textSize="12sp" />
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.appcompat.widget.LinearLayoutCompat>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="最近热门电影"
android:textColor="#333333"
android:textSize="17sp"
android:textStyle="bold" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/home_list_item" />
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.core.widget.NestedScrollView>
</androidx.appcompat.widget.LinearLayoutCompat>
- HomeFragment.java实现逻辑
public class HomeFragment extends Fragment {
private View rootView;
private Banner banner;
private RecyclerView recyclerView;
private List<BannerDataInfo> mBannerDataInfoList = new ArrayList<>();
private HomeListAdapter mHomeListAdapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.fragment_home, container, false);
banner = rootView.findViewById(R.id.banner);
recyclerView = rootView.findViewById(R.id.recyclerView);
mHomeListAdapter = new HomeListAdapter();
recyclerView.setLayoutManager(new GridLayoutManager(getContext(), 3));
recyclerView.setAdapter(mHomeListAdapter);
mHomeListAdapter.setOnItemClickListener(new HomeListAdapter.OnItemClickListener() {
@Override
public void onItemClick(int position, MovieInfo.SubjectsDTO subjectsDTO) {
Intent intent = new Intent(getActivity(), MovieDetailActivity.class);
intent.putExtra("subjectsDTO", subjectsDTO);
startActivity(intent);
}
});
loadBannerData();
loadMovieHotData();
return rootView;
}
private void loadBannerData() {
mBannerDataInfoList.add(new BannerDataInfo("", "https://img3.doubanio.com/view/movie_gallery_frame_hot_rec/m/public/1a7819799e31f32.jpg"));
mBannerDataInfoList.add(new BannerDataInfo("", "https://img3.doubanio.com/view/movie_gallery_frame_hot_rec/m/public/742d8ac674f1053.jpg"));
mBannerDataInfoList.add(new BannerDataInfo("", "https://img9.doubanio.com/view/movie_gallery_frame_hot_rec/m/public/8c0893af11f50a6.jpg"));
mBannerDataInfoList.add(new BannerDataInfo("", "https://img9.doubanio.com/view/movie_gallery_frame_hot_rec/m/public/576e69730fa1604.jpg"));
banner.setAdapter(new BannerImageAdapter<BannerDataInfo>(mBannerDataInfoList) {
@Override
public void onBindView(BannerImageHolder holder, BannerDataInfo data, int position, int size) {
Glide.with(getActivity()).load(data.getImgUrl()).into(holder.imageView);
}
});
banner.addBannerLifecycleObserver(this);
banner.setIndicator(new CircleIndicator(getActivity()));
banner.setBannerGalleryEffect(10, 10);
}
private void loadMovieHotData() {
OkGo.<String>get("https://movie.douban.com/j/search_subjects?type=movie&tag=热门&page_limit=50&page_start=0")
.execute(new StringCallback() {
@Override
public void onStart(Request<String, ? extends Request> request) {
super.onStart(request);
ProgressDialogUtils.showProgressDialog(getActivity());
}
@Override
public void onSuccess(Response<String> response) {
Gson gson = new Gson();
MovieInfo movieInfo = gson.fromJson(response.body(), MovieInfo.class);
if (null != mHomeListAdapter) {
mHomeListAdapter.setMovieList(movieInfo.getSubjects());
}
}
@Override
public void onFinish() {
super.onFinish();
ProgressDialogUtils.hideProgressDialog();
}
});
}
}
- BannerDataInfo实体类
public class BannerDataInfo {
private String title;
private String imgUrl;
public BannerDataInfo(String title, String imgUrl) {
this.title = title;
this.imgUrl = imgUrl;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getImgUrl() {
return imgUrl;
}
public void setImgUrl(String imgUrl) {
this.imgUrl = imgUrl;
}
}
- MovieInfo实体类
public class MovieInfo {
private List<SubjectsDTO> subjects;
public List<SubjectsDTO> getSubjects() {
return subjects;
}
public void setSubjects(List<SubjectsDTO> subjects) {
this.subjects = subjects;
}
public static class SubjectsDTO implements Serializable {
private String episodes_info;
private String rate;
private Integer cover_x;
private String title;
private String url;
private Boolean playable;
private String cover;
private String id;
private Integer cover_y;
private Boolean is_new;
public String getEpisodes_info() {
return episodes_info;
}
public void setEpisodes_info(String episodes_info) {
this.episodes_info = episodes_info;
}
public String getRate() {
return rate;
}
public void setRate(String rate) {
this.rate = rate;
}
public Integer getCover_x() {
return cover_x;
}
public void setCover_x(Integer cover_x) {
this.cover_x = cover_x;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public Boolean getPlayable() {
return playable;
}
public void setPlayable(Boolean playable) {
this.playable = playable;
}
public String getCover() {
return cover;
}
public void setCover(String cover) {
this.cover = cover;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Integer getCover_y() {
return cover_y;
}
public void setCover_y(Integer cover_y) {
this.cover_y = cover_y;
}
public Boolean getIs_new() {
return is_new;
}
public void setIs_new(Boolean is_new) {
this.is_new = is_new;
}
}
}
3.项目运行效果
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/2e5bc6c59412427db4fbf43ef90c7c3f.png)