【问题标题】:How to parse this json objects on recyclerview? [closed]如何在 recyclerview 上解析这个 json 对象? [关闭]
【发布时间】:2018-11-02 13:34:43
【问题描述】:

我想在 recyclerview 中显示这个 json。我该怎么做? 我只想列出“user”和“exchangeName”。

我的 Json;

{ “事件”:{ “101”:{ “id”:“0001”, “类型”:“交换”, “用户”:“BTUser01”, "exchangeName": "BTCTurk", “交易”:{ “发送”:“249”, “得到”:“24.1” }, “证书”: [ “BTUser01证书” ] }, “102”:{ “id”:“0002”, “类型”:“交换”, “用户”:“BTUser02”, "exchangeName": "Koinim", “交易”:{ “发送”:“300”, “得到”:“641” }, “证书”: [ “BTUser02证书” ] }, “103”:{ “id”:“0003”, “类型”:“exchange2”, “用户”:“BTUser03”, "exchangeName": "Koineks", “交易”:{ “发送”:“823”, “得到”:“751” }, “证书”: [ “BTUser03证书” ] }, “104”:{ “id”:“0004”, “类型”:“exchange3”, “用户”:“BTUser04”, "exchangeName": "Paribu", “交易”:{ “发送”:“543”, “得到”:“3.1” }, “证书”: [ “BTUser04证书” ] } } }

主活动;

public class MainActivity extends AppCompatActivity {

    TextView ev, ev2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ev = (TextView) findViewById(R.id.ev);
        ev2 = (TextView) findViewById(R.id.ev2);

        Retrofit retrofit = new Retrofit.Builder().baseUrl("MYAPİ_ADRESS_LINK").addConverterFactory(GsonConverterFactory.create()).build();
        Service service = retrofit.create(Service.class);

        Call<ResponseBody> call = service.getData();
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(@NonNull Call<ResponseBody> call, @NonNull Response<ResponseBody> response) {
                if (response.isSuccessful()) {
                    String res = null;
                    if (response.body() != null) {
                        try {
                            res = response.body().string();
                            parse(res);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }

            @Override
            public void onFailure(@NonNull Call<ResponseBody> call, @NonNull Throwable t) {
                int a = 0;
            }
        });

    }

    Model parse(String str) {
        Model model = new Model();
        try {
            String source = str.replace("\n", "").replace("\t", "").replace("\r", "");
            String s = new Gson().toJson(source);
            s = s.replace("\\","");
            s = s.substring(1,s.length()-1);
            JSONObject object = new JSONObject(s).getJSONObject("events");
            Iterator<String> iter = object.keys();
            while (iter.hasNext()) {
                String key = iter.next();
                try {
                    JSONObject value = new JSONObject(String.valueOf(object.get(key)));
                    model.setExternalId(Integer.parseInt(key));
                    model.setUser(value.getString("user"));
                    model.setSend(value.getString("send"));

                    ev.setText(model.user);
                    ev2.setText(model.send);


                    return model;


                } catch (JSONException e) {
                    // Something went wrong!
                }
            }


        } catch (JSONException e) {
            e.printStackTrace();
        }

        return model;
    }
}

我的模型;

public class Model {

    int externalId;
    int id;
    String type;
    String user;
    String exchangeName;
    Transactions transactions;






    List<certificate> certificateList;

    public int getExternalId() {
        return externalId;
    }

    public void setExternalId(int externalId) {
        this.externalId = externalId;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getUser() {
        return user;
    }

    public void setUser(String user) {
        this.user = user;
    }

    public String getExchangeName() {
        return exchangeName;
    }

    public void setExchangeName(String exchangeName) {
        this.exchangeName = exchangeName;
    }

    public Transactions getTransactions() {
        return transactions;
    }

    public void setTransactions(Transactions transactions) {
        this.transactions = transactions;
    }

    public List<certificate> getCertificateList() {
        return certificateList;
    }

    public void setCertificateList(List<certificate> certificateList) {
        this.certificateList = certificateList;
    }

    class Transactions{
        String send;

        String get;

        public String getSend() {
            return send;
        }

        public void setSend(String send) {
            this.send = send;
        }

        public String getGet() {
            return get;
        }

        public void setGet(String get) {
            this.get = get;
        }
    }

    class certificate{
        String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }

}

【问题讨论】:

    标签: android json parsing android-recyclerview


    【解决方案1】:

    首先,您可以在数百个可用的教程和指南中轻松找到这个答案。

    要实现这一点,您需要为适配器项创建一个自定义适配器和一个自定义视图。

    作为这个答案的序言。我不确定您是否想在RecyclerView 中显示多个Model 项目或其他一些数据。此示例假定您使用 List&lt;Model&gt;,但是,可以轻松更改以使其与另一个对象列表一起使用。

    适配器外观示例

    public class MyAdapter extends RecyclerView.Adapter
    {
        private Context _context;
    
        private List<Model> _items;
    
        public void setItems(List<Model> items)
        {
            this._items = items;
            notifyDataSetChanged();
        }
    
        @NonNull
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
        {
            _context = parent.getContext();
            return new MyAdapter.ItemViewHolder(parent);
        }
    
        @Override
        public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, int position)
        {
            final MyAdapter.ItemViewHolder viewHolder = (MyAdapter.ItemViewHolder) holder;
            final Model item = _items.get(position);
    
            viewHolder._user.setText(item.user);
            viewHolder._exchangeName.setText(item.exchangeName);
        }
    
        @Override
        public int getItemCount()
        {
            return _items != null ? _items.size() : 0;
        }
    
        private static class ItemViewHolder extends RecyclerView.ViewHolder
        {
            private TextView _user;
            private TextView _exchangeName;
    
            private ItemViewHolder(ViewGroup parent)
            {
                super(LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_view, parent, false));
                this._user = itemView.findViewById(R.id.user);
                this._exchangeName = itemView.findViewById(R.id.exchange_name);
            }
        }
    }
    

    R.layout.adapter_view

    这需要是至少包含来自上述MyAdapter 的两个TextView 视图引用的视图。简单例子:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:background="@drawable/content_container"
        android:orientation="vertical"
        android:animateLayoutChanges="true"
        android:padding="@dimen/padding_view_large"
        android:layout_marginBottom="@dimen/padding_view_small">
    
        <TextView
            android:id="@+id/user"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/placeholder"
            android:textColor="@color/black"
            android:textSize="@dimen/text_size_medium"
            android:layout_marginTop="@dimen/padding_view_small"/>
    
        <TextView
            android:id="@+id/exchange_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/placeholder"
            android:textColor="@color/black"
            android:textSize="@dimen/text_size_medium"
            android:layout_marginTop="@dimen/padding_view_small"/>
    
    </LinearLayout>
    

    绑定适配器

    //First we set up the adapter and add our List<Model> object.
    MyAdapter adapter = new MyAdapter();
    adapter.setItems(... List<Model> items);
    
    //Set up our RecyclerView and set the adapter.
    final RecyclerView recyclerView = rootView.findViewById(R.id.model_list);
    recyclerView.setLayoutManager(new LinearLayoutManager(_context));
    recyclerView.setAdapter(adapter);
    recyclerView.setHasFixedSize(true);
    

    【讨论】:

      【解决方案2】:

      您需要先了解(然后创建)以下内容

      1. RecyclerView 适配器

      2. RecyclerView ViewHolder

      阅读完这两件事后,解决方案就会很清楚了。为了给您指明正确的方向,您必须创建一个自定义适配器,您将使用它来填充您的自定义视图。希望这可以帮助您继续前进。随时询问您是否需要更多帮助。

      【讨论】:

      • 可能是因为这是一个相当不完整的答案 - 提示而不是解决方案。也许作为评论会更好。
      • 我猜他想要的是如何做的完整代码,而不是自己做的方向。
      • 这是一个编码网站,人们往往想要基于代码的答案。此外,该网站应该作为未来读者的知识库。有效地说“这里有几个关键字,去其他地方查找”的答案并不能真正提供知识库,恕我直言。其他人可能会有不同的感觉。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-01
      • 2021-06-13
      • 1970-01-01
      • 1970-01-01
      • 2013-02-28
      相关资源
      最近更新 更多