新闻列表界面
任务
1.在上一个界面中的微信发现tab页面中添加RecyclerView,以新闻列表页面为例
2.在该基础上进行点击跳转设计,即点击某一行能够跳转到新闻详情页面。
设计流程及代码详解
- 在已经创建的fragment_3.xml中添加一个RecyclerView
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/news_list"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
- 创建一个用于展示新闻列表的布局文件item_news.xml, 展示RecyclerView中的每一条新闻数据
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="title"
android:textSize="30sp"
/>
<TextView
android:id="@+id/date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="date"
android:textColor="#888"
android:layout_marginLeft="20dp"
android:textSize="20sp" />
- 创建一个用于展示新闻列表的类News.java, 其中包括了新闻的标题、内容和日期信息
public class News implements Serializable{
private String title;
private String date;
private String content;
public News(String title, String date,String content) {
this.title = title;
this.date = date;
this.content=content;
}
public String getTitle() {
return title;
}
public String getDate() {
return date;
}
public String getContent(){return content;}
}
- 创建Myadapter2.java继承RecyclerView.Adapter
- 包含了一个内部 ViewHolder 类用于保存 RecyclerView 中每个 item 的视图,并在构造函数中使用 findViewById() 方法初始化了视图的标题和日期视图
public class ViewHolder extends RecyclerView.ViewHolder {
TextView title;
TextView date;
ViewHolder(View view) {
super(view);
title = view.findViewById(R.id.title);
date = view.findViewById(R.id.date);
}
}
- onCreateViewHolder() 方法中,为每个 item 设置了一个点击事件监听器,并在点击事件发生时,使用 Intent 跳转到 newsdetail Activity 并传递对应的数据
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_news, parent, false);
ViewHolder holder = new ViewHolder(view);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = holder.getAdapterPosition();
News news = mNewsList.get(position);
Intent intent = new Intent(mContext, newsdetail.class);
intent.putExtra("title", news.getTitle());
intent.putExtra("date", news.getDate());
mContext.startActivity(intent);
}
});
return holder;
}
- onBindViewHolder() 方法,将数据从 News 对象中提取出来,并将其绑定到 ViewHolder 中
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
News news = mNewsList.get(position);
holder.title.setText(news.getTitle());
holder.date.setText(news.getDate());
}
- getItemCount() 方法,返回新闻列表中的元素数量
public int getItemCount() {
return mNewsList.size();
}
- OnItemClickListener接口,用于处理 RecyclerView 中每个 item 的点击事件
public interface OnItemClickListener {
void OnItemClick(View view, int position);
void onItemLongClick(View view, int pos);
}
- 在Fragment3中绑定Adapter2, 并实现跳转点击到详情界面。
- onCreateView()函数
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_3, container, false);
recyclerView = view.findViewById(R.id.news_list);
myadapter = new Myadapter2(data, getActivity());
recyclerView.setAdapter(myadapter);
LinearLayoutManager manager = new LinearLayoutManager(getContext());
recyclerView.setLayoutManager(manager);
myadapter.setOnItemClickListener(this);
data.add(new News("Title 1", "Time 1","Content 1"));
data.add(new News("Title 2", "Time 2","Content 2"));
data.add(new News("Title 3", "Time 3","Content 3"));
data.add(new News("Title 4", "Time 4","Content 4"));
data.add(new News("Title 5", "Time 5","Content 5"));
data.add(new News("Title 6", "Time 6","Content 6"));
data.add(new News("Title 1", "Time 1","Content 1"));
data.add(new News("Title 2", "Time 2","Content 2"));
data.add(new News("Title 3", "Time 3","Content 3"));
data.add(new News("Title 4", "Time 4","Content 4"));
data.add(new News("Title 5", "Time 5","Content 5"));
data.add(new News("Title 6", "Time 6","Content 6"));
return view;
}
- OnItemClick()函数是自定义的RecyclerView条目点击事件监听器,当某个条目被点击时,该函数会被调用,根据点击位置获取对应的新闻对象,然后创建Intent对象并传递新闻对象,最后跳转到新闻详情页面。
@Override
public void OnItemClick(View view, int position) {
News news = data.get(position);
Intent intent = new Intent(getActivity(), newsdetail.class);
intent.putExtra("news", news);
startActivity(intent);
}
- 创建Activity,命名为newsdetail,用于显示新闻详情界面,接受从主页面即Fragment3传来的News对象,将该对象的标题、内容和日期显示在界面上。
public class newsdetail extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_newsdetail);
Intent intent = getIntent();
if (intent != null) {
News news = intent.getParcelableExtra("news");
if (news != null) {
TextView titleView = findViewById(R.id.news_title);
titleView.setText(news.getTitle());
TextView dateView = findViewById(R.id.news_date);
dateView.setText(news.getDate());
TextView contentView=findViewById(R.id.news_content);
contentView.setText(news.getContent());
}
}
}
}
运行结果
跳转至详情信息界面
注意事项
- 要注意每个界面布局的控件id要和java文件中对应,否则会出现空值报错
- 最开始要给news变量赋初值,否则界面中没有结果