【问题标题】:How do I remove all null and empty string values from an object in json java android from retrofit?如何从改造中的 json java android 中的对象中删除所有 null 和空字符串值?
【发布时间】:2021-04-11 14:02:40
【问题描述】:

如何从改造中的 JSON java android 中的对象中删除所有 null 和空字符串值?

过滤掉“name”为空或为空的所有项目。

这是我的主要活动

   Api api = retrofit.create(Api.class);
    Call<List<MainData>> call = api.getData();
    call.enqueue(new Callback<List<MainData>>() {
        @Override
        public void onResponse (Call<List<MainData>> call, Response<List<MainData>> response) {
            if (!response.isSuccessful()) {
                Toast.makeText(MainActivity.this, response.code(), Toast.LENGTH_SHORT).show();
                return;
            }
            List<MainData> postList = response.body();





            // Filter out any items where "name" is blank or null.
            List<MainData> tempList = new ArrayList<>();
            for(MainData data :postList)
            {

                if(null!= data.getName() && !data.getName().isEmpty()) {

                     //sort by name
                    Collections.sort(tempList, (mainData, t1) -> mainData.getName().compareTo(t1.getName()));

                   //sort by ListId
                    Collections.sort(tempList, (mainData, t1) -> mainData.getListId().compareTo(t1.getListId()) );

                    tempList.add(data);


                }

            }


            RecyclerViewAdapter recyclerViewAdapter = new RecyclerViewAdapter(tempList, MainActivity.this);
            recyclerView.setAdapter(recyclerViewAdapter);
        }

        @Override
        public void onFailure (Call<List<MainData>> call, Throwable t) {
            Toast.makeText(MainActivity.this, t.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });

这是我的适配器

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
//initialize variables

List<MainData> dataArrayList;
Context context;
//create constructor

public RecyclerViewAdapter (Context context, List<MainData> dataArrayList) {
    this.dataArrayList = dataArrayList;
    this.context = context;
}
    
@NonNull
@Override
public ViewHolder onCreateViewHolder (@NonNull ViewGroup parent, int viewType) {
    //this method recycling the view holder
    View view = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.list_item, parent, false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder (@NonNull ViewHolder holder, int position) {
    //initialize Main data
    MainData data = dataArrayList.get(position);
    //set name on text view
    holder.listId.setText(String.format("list_id : %s", data.getListId()));
    holder.name.setText(String.format("name : %s", data.getName()));
    holder.id.setText(String.format("id : %s", data.getId()));
}

@Override
public int getItemCount () {
    return dataArrayList.size();
}


public class ViewHolder extends RecyclerView.ViewHolder {
    //initialize variables


    TextView listId, name, id;

    public ViewHolder (@NonNull View itemView) {
        super(itemView);

        //assign variables


        listId = itemView.findViewById(R.id.list_id);
        name = itemView.findViewById(R.id.name);
        id = itemView.findViewById(R.id.id);

    }

}

}

这是数据

公共类 MainData {

public String listId, name, id;



public String getListId () {
    return listId;
}

public  String getName () {
    return name;
}

public  String getId () {
    return id;
}

}

这就是 API

public interface Api {

@GET("hiring.json")
Call<List<MainData>> getData();

}

这是我要删除 null 和 emp 的应用 enter image description here

【问题讨论】:

    标签: java android json retrofit2


    【解决方案1】:

    有两种方法

    (1) 在膨胀数据时,您可以过滤这些不需要的值 (2) 创建一个临时列表并从主列表中仅添加所需的值。 示例代码:

    List<MainData> tempList = new ArrayList<>();
        for(MainData data :postList)
        {
          if(null!= data.getName() && !data.getName().isEmpty())
           {   tempList.add(data);
    
            }
        }
    

    然后将这个 tempList 传递给适配器。

    最终代码如下所示。

     Api api = retrofit.create(Api.class);
    Call<List<MainData>> call = api.getData();
    call.enqueue(new Callback<List<MainData>>() {
        @Override
        public void onResponse (Call<List<MainData>> call, Response<List<MainData>> response) {
            if (!response.isSuccessful()) {
                Toast.makeText(MainActivity.this, response.code(), Toast.LENGTH_SHORT).show();
                return;
            }
            List<MainData> postList = response.body();
    
            //sort by ListId
            Collections.sort(postList, (mainData, t1) -> mainData.getListId().compareTo(t1.getListId()));
    
            // Filter out any items where "name" is blank or null.
          List<MainData> tempList = new ArrayList<>();
        for(MainData data :postList)
        {
          if(null!= data.getName() && !data.getName().isEmpty())
           {   tempList.add(data);
    
            }
        }
            
    
            RecyclerViewAdapter recyclerViewAdapter = new RecyclerViewAdapter(MainActivity.this, tempList );
            recyclerView.setAdapter(recyclerViewAdapter);
        }
    
        @Override
        public void onFailure (Call<List<MainData>> call, Throwable t) {
            Toast.makeText(MainActivity.this, t.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });
    

    }

    如有不清楚之处,请随时询问。

    【讨论】:

    • 兄弟,当我将 tempList 添加到适配器时,顶部适配器中的 postlist 变红并显示无法解析符号'postList'
    • 像这样:错误:找不到符号适配器 = new RecyclerViewAdapter(MainActivity.this, postList, dataArrayList); ^ 符号:变量 postList 位置:类 MainActivity
    • 嘿,我已经更新了答案,试试看。我刚刚在你之前的代码中适当的地方添加了过滤器代码。
    • 兄弟非常感谢,我真的哭了?兄弟,我为此苦苦挣扎了三天,不停地编码和失败。非常感谢你,我真的很想拥抱你兄弟
    • 你有Instagram我想关注你,谢谢兄弟
    猜你喜欢
    • 2014-07-09
    • 2021-01-04
    • 2014-10-29
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    相关资源
    最近更新 更多