android之网络请求 -- 获取RecyclerView的列表项(图片 + 文字)

示意图,网络请求的地址,插件及依赖

示意图:
在这里插入图片描述

网络请求的地址:

http://www.qubaobei.com/ios/cf/dish_list.php?stage_id=1&limit=20&page=1

插件:GsonFormat,用来解析Gson,在设置中的Plugins下载

依赖:在解析图片地址时,我用的是Glide,要添加它的依赖。

implementation ‘com.github.bumptech.glide:glide:4.3.1’
annotationProcessor ‘com.github.bumptech.glide:compiler:4.3.1’

代码架构

  1. 主界面:MainActivity.java , activity_main.xml
  2. RecyclerTask.java ,这个异步任务得到从网络上请求到的Json字符串。
  3. NetworkAdapter.java , 这个适配器用来展示ui界面。
  4. networkitem.xml, 适配器中每一项的布局情况。
  5. NetworkJson.java, 这个就是网络上获得的Json的Bean类。就是用GsonFormat来解析从网络上得到的JSON字符串,它可以用插件自动生成。
  6. 顺便说一下ActivityManifest中,首先添加一个权限,
<uses-permission android:name="android.permission.INTERNET" />

还要在Application下写一句话:android:networkSecurityConfig="@xml/network_security_config"
这是关于网络安全的,必须写!!!所以还需要写network_security_config.xml
在这里插入图片描述

代码内容

一些比较细节的地方或需要注意的地方我都写了注释

MainActivity.java

package com.example.myapplication;
import android.graphics.Rect;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.example.myapplication.Adapter.NetworkAdapter;
import com.example.myapplication.Bean.NetworkJson;
import com.example.myapplication.Task.RecyclerTask;
import java.util.List;

public class MainActivity extends AppCompatActivity implements RecyclerTask.NetBeanListener {
   
    private RecyclerView recycler;
    private Handler mHandler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
   
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recycler = findViewById(R.id.recycler);
        //findViewById(R.id.button).setOnClickListener(this);
        RecyclerTask task = new RecyclerTask();
        task.setNetBeanListener(this);
        //开始线程
        task.execute();
        mHandler = new Handler();
        //如果不用Handler,直接获取的话, 你就没有给asyncTask一些时间来得到List<NetworkJson.DataBean>这个数组
        //那么你传给适配器的数组就会为空,就会报错
        mHandler.postDelayed(run, 2000);
    }
    private List<NetworkJson.DataBean> mDataBeanList;
    @Override
    public void getNetBean(List<NetworkJson.DataBean> bean) {
   
        mDataBeanList = bean;
        Log.d("bean", "bean -- >" + mDataBeanList.get(0).getId());
    }

   public Runnable run = new Runnable() {
   
        @Override
        public void run() {
   
            LinearLayoutManager llm = new LinearLayoutManager(MainActivity.this, RecyclerView.VERTICAL, false);
            recycler.setLayoutManager(llm);
            recycler.setItemAnimator(new DefaultItemAnimator());
            recycler.addItemDecoration(new RecyclerView.ItemDecoration() {
   
                @Override
                public void getItemOffsets(@NonNull Rect outRect, int itemPosition, @NonNull RecyclerView parent) {
   
                    super.getItemOffsets(outRect, itemPosit
  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现这个功能需要以下步骤: 1. 在ViewModel中定义一个方法,用于请求另一个接口的数据,并将数据添加到列表中。 2. 在RecyclerView的Adapter中,为列表中的按钮添加点击事件,并在事件处理中调用ViewModel中定义的方法。 3. 在ViewModel中,通过另一个接口获取数据,并将数据添加到列表中。 4. 在获取到数据后,通过LiveData将数据返回给RecyclerView的Adapter,让Adapter更新列表显示。 下面是代码示例: 在ViewModel中定义方法: ```java public class MyViewModel extends ViewModel { private MutableLiveData<List<MyData>> dataList = new MutableLiveData<>(); public LiveData<List<MyData>> getData() { return dataList; } public void loadData() { // 请求另一个接口的数据 List<MyData> newDataList = api.getData(); // 将数据添加到列表中 List<MyData> oldDataList = dataList.getValue(); oldDataList.addAll(newDataList); dataList.setValue(oldDataList); } } ``` 在RecyclerView的Adapter中,为列表中的按钮添加点击事件: ```java public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { private List<MyData> dataList; private MyViewModel viewModel; public MyAdapter(List<MyData> dataList, MyViewModel viewModel) { this.dataList = dataList; this.viewModel = viewModel; } @NonNull @Override public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { // 创建ViewHolder } @Override public void onBindViewHolder(@NonNull MyViewHolder holder, int position) { // 绑定数据 holder.button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { viewModel.loadData(); } }); } @Override public int getItemCount() { return dataList.size(); } static class MyViewHolder extends RecyclerView.ViewHolder { TextView textView; Button button; public MyViewHolder(@NonNull View itemView) { super(itemView); textView = itemView.findViewById(R.id.text_view); button = itemView.findViewById(R.id.button); } } } ``` 在Activity或Fragment中,将ViewModel与RecyclerView的Adapter关联起来: ```java public class MyFragment extends Fragment { private MyAdapter adapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MyViewModel viewModel = new ViewModelProvider(this).get(MyViewModel.class); viewModel.loadData(); viewModel.getData().observe(this, new Observer<List<MyData>>() { @Override public void onChanged(List<MyData> dataList) { adapter.notifyDataSetChanged(); } }); adapter = new MyAdapter(viewModel.getData().getValue(), viewModel); } @Override public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); RecyclerView recyclerView = view.findViewById(R.id.recycler_view); recyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); recyclerView.setAdapter(adapter); } } ``` 当用户点击列表中的按钮时,就会调用ViewModel中的loadData方法,通过另一个接口获取数据,并将数据添加到列表中。获取到数据后,通过LiveData将数据返回给RecyclerView的Adapter,让Adapter更新列表显示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值