微信tab界面添加新闻列表

新闻列表界面

任务

1.在上一个界面中的微信发现tab页面中添加RecyclerView,以新闻列表页面为例
2.在该基础上进行点击跳转设计,即点击某一行能够跳转到新闻详情页面。

设计流程及代码详解

  1. 在已经创建的fragment_3.xml中添加一个RecyclerView
    插入recyclerview
<androidx.recyclerview.widget.RecyclerView
        android:id="@+id/news_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
  1. 创建一个用于展示新闻列表的布局文件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" />
  1. 创建一个用于展示新闻列表的类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;}
}
  1. 创建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);
}
  1. 在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);
}
  1. 创建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());
            }
        }
    }
}

运行结果



跳转至详情信息界面

注意事项

  1. 要注意每个界面布局的控件id要和java文件中对应,否则会出现空值报错
  2. 最开始要给news变量赋初值,否则界面中没有结果

源码开源地址

项目源码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值