【发布时间】:2020-07-23 00:54:54
【问题描述】:
我在 GSON 和 Retrofit 中解析了以下 JSON。我想在一个 TextView 中显示相同 id 的值。现在发生的事情是所有值都添加到数组中,并且它们显示在单独的 TextView 中。我想在一个 TextView 中显示所有具有相同 id 的值。例如。 id: 240 ab 值应该在一个 TextView 中。目前,所有ab 值都在单独的TextView 中。
这是数据当前的显示方式:
JSON::
{
"abc": {
"1": {
"1": {
"ab": "some content",
"id": "240",
"key": "value"
},
"2": {
"ab": "some content",
"id": "240",
"key": "value"
},
"3": {
"ab": "some content",
"id": "240",
"key": "value"
}
},
"2": {
"1": {
"ab": "more content",
"id": "241",
"key": "value"
},
"2": {
"ab": "more content 1",
"id": "241",
"key": "value"
},
"3": {
"ab": "more content 2",
"id": "241",
"key": "value"
}
}
}
}
POJO内容::
public class POJOContent {
@SerializedName("ab")
public String content;
@SerializedName("id")
public String id;
@SerializedName("key")
public String key;
@Override
public String toString() {
return content;
}
//getters and setters
}
MyContentWrapper::
public class MyContentWrapper {
public Map<Integer, MyMap> abc;
}
我的地图::
public class MyMap extends HashMap<Integer, POJOContent> {
@Override
public POJOContent put(Integer key, POJOContent value) {
if(null==value.getContent() || value.getContent().isBlank()) {
return null;
}
// Added only if content = "ab" is not blank.
return super.put(key, value);
}
}
回调:
Callback<MyContentWrapper> myCallback = new Callback<MyContentWrapper>() {
@Override
public void onResponse(Call<MyContentWrapper> call, Response<MyContentWrapper> response) {
if (response.isSuccessful()) {
Log.d("Callback", " Message: " + response.raw());
Log.d("Callback", " Message: " + response.body().abc.values());
MyContentWrapper contentWrapper = response.body();
List<POJOContent> pojo = new ArrayList<>();
for (Map.Entry<Integer, MyMap> entry : contentWrapper.abc.entrySet()) {
Integer key = entry.getKey();
MyMap map = entry.getValue();
if (!map.isEmpty()){
Log.d("Callback", " Key: " + key);
Log.d("Callback", " Value: " + map.values());
pojo.addAll(map.values());
}
}
MyContentViewAdapter adapter = new MyContentViewAdapter(pojo);
recyclerView.setAdapter(adapter);
} else {
Log.d("Callback", "Code: " + response.code() + " Message: " + response.message());
}
}
@Override
public void onFailure(Call<MyContentWrapper> call, Throwable t) {
t.printStackTrace();
}
};
RecyclerAdapter::
public class MyContentViewAdapter extends RecyclerView.Adapter<MyContentViewAdapter.ViewHolder> {
private List<POJOContent> data;
private MyClickListener clickListener;
public class ViewHolder extends RecyclerView.ViewHolder {
public TextView text;
private LinearLayout itemLayout;
public ViewHolder(View v) {
super(v);
text = (TextView) v.findViewById(R.id.text_content);
}
}
public MyContentViewAdapter(List<POJOContent> data) {
this.data = data;
Log.d("Recyclerview Data", data.toString());
}
@Override
public MyContentViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v;
v = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_content_card, parent, false);
return new MyContentViewAdapter.ViewHolder(v);
}
@Override
public void onBindViewHolder(MyContentViewAdapter.ViewHolder holder, int position) {
POJOContent pojo = data.get(position);
Log.d("Recyclerview", pojo.getContent());
holder.text.setText(pojo.getContent());
holder.itemView.setTag(pojo.getContent());
}
public void setOnItemClickListener(MyClickListener clickListener) {
this.clickListener = clickListener;
}
@Override
public int getItemCount() {
return data.size();
}
}
【问题讨论】:
-
您能分享一下您现在拥有的以及您正在努力实现的目标的屏幕截图吗?我不明白你的问题是什么......因为你在 ViewHolder 中只有一个 TextView,你说它们显示在单独的 TexViews 中是什么意思?也许您希望在单个 ViewHolder 中显示具有相同 id 的值?
-
@Rinat,是的,这就是我想要的。
-
在“abc”键之后的 json 中,在“1”下:键有 3 个 id 为 240 的元素,在“2”键下有 3 个 id 为 241 的元素。我的问题是它保证所有具有相同 id 的元素都以相同的模式分组?
-
以及像“1”、“2”、“3”这样的嵌套数字键,你是否重命名了它们,这样你就不会泄露敏感信息,或者它是来自服务器的真实 json 响应的真实结构?因为如果他们有像“产品”“子产品”这样的常量名称,可能会更容易达到预期的结果
-
@Rinat,保证所有具有相同 id 的元素都被分组。那些嵌套的数字键就像“1”、“2”、“3”……我没有重命名它们。不幸的是,我无法控制 json 的结构。
标签: android android-recyclerview pojo