【问题标题】:how parse JSON and set into in control. ListView or RecyclerView and click on that item can start another activity in android?如何解析 JSON 并控制它。 ListView 或 RecyclerView 并单击该项目可以在 android 中启动另一个活动?
【发布时间】:2017-02-27 07:18:57
【问题描述】:

如何解析 JSON 并设置为可控。 ListView 或 RecyclerView 并单击该项目可以在 android 中启动另一个活动?

http://beta.json-generator.com/api/json/get/VJ9snXcFG

假设我们使用 json (beta.json-generator.com/api/json/get/VJ9snXcFG) 打印列表视图中的所有标题。下一个标题将单击打开 json 中的第一个 url(beta.json-generator.com /api/json/get/VJ9snXcFG),第二个标题将是点击打开json上的第二个url(beta.json-generator.com/api/json/get/VJ9snXcFG)等等

【问题讨论】:

    标签: android json listview


    【解决方案1】:

    要解析 JSON,请使用改造。这是一个很好的例子:https://square.github.io/retrofit/ 在 RecyclerView 的 onBindViewHolder 函数中添加一个 onClicklistener 并在那里开始你的活动。

    例子:

    Json 有这样的数据:

    [{"id":302,"latitude":-23.725,"longitude":34.2773,"place":"Panda Mozambik null"},{"id":312,"latitude":46.7681,"longitude":20.8186,"place":"Kondoros Magyarország null"},{"id":322,"latitude":8,"longitude":3,"place":"rr"}]
    

    数据类:

    public class Data {
        public int id;
        public String place;
        public float  longitude;
        public float  latitude;
    
        public Data(){}
    }
    

    网络API

    public interface NetApi {
       @GET("/")
       Call<List<Data>> getData();
    }
    

    在活动中:

    private Retrofit retrofit;
    private NetApi netApi;
    private RecyclerView recyclerView;
    ItemAdapter adapter;
    public List<Data> items = new ArrayList<Data>();
    private static final String ENDPOINT_ADDRESS = "https://endpoint.com/";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        retrofit = new Retrofit.Builder().baseUrl(ENDPOINT_ADDRESS).client(new OkHttpClient.Builder().build()).addConverterFactory(GsonConverterFactory.create()).build();
        netApi = retrofit.create(NetApi.class);
        initRecycleView()
        getData();
    }
    public void getData() {
        netApi.getData().enqueue(new Callback<List<Data>>() {
            @Override
            public void onResponse(Call<List<Data>> call, Response<List<Data>> response) {
                if (response.isSuccessful()) {
                    Log.d(TAG, response.body().toString());
                    items = new ArrayList<Data>((response.body()));
                    adapter.update(items);
                } else {
                     Toast.makeText(MainActivity.this, "Error: " + response.message(), Toast.LENGTH_SHORT).show();
                }
            }
    
            @Override
            public void onFailure(Call<List<Data>> call, Throwable t) {
    
            }
        });
    }
    private void initRecycleView() {
        recyclerView = (RecyclerView) view.findViewById(R.id.MainRecyclerView);
        adapter = new ItemAdapter();
        recyclerView.setLayoutManager(new LinearLayoutManager(view.getContext()));
        recyclerView.setAdapter(adapter);
    
    }
    

    ItemAdapter 是这样的:

    public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ItemViewHolder> {
    
    public final List<Data> items;
    
    public ItemAdapter() {
        items = new ArrayList<>();
    }
    
    
    @Override
    public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView =
                LayoutInflater.from(parent.getContext()).
                        inflate(R.layout.item_recyclerview, parent, false);
        ItemViewHolder viewHolder = new ItemViewHolder(itemView);
        return viewHolder;
    }
    
    @Override
    public void onBindViewHolder(ItemViewHolder holder, int position) {
        Data item = items.get(position);
        holder.longitude.setText(Float.toString(item.longitude));
        holder.latitude.setText(Float.toString(item.latitude));
        holder.place.setText(item.place);
        holder.place.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(v.getContext(),"Clicked",Toast.LENGTH_LONG).show();
            }
        });
    
    }
    
    public void addItem(Data item) {
        items.add(item);
        notifyItemInserted(items.size() - 1);
    
    }
    
    
    
    @Override
    public int getItemCount() {
        return items.size();
    }
    
    public void update(List<Data> itemsrec) {
        items.clear();
        items.addAll(itemsrec);
        notifyDataSetChanged();
    
    }
    
    public class ItemViewHolder extends RecyclerView.ViewHolder {
    
        TextView place;
        TextView longitude;
        TextView latitude;
    
        public ItemViewHolder(View itemView) {
            super(itemView);
            place = (TextView) itemView.findViewById(R.id.place);
            longitude = (TextView) itemView.findViewById(R.id.longitude);
            latitude = (TextView) itemView.findViewById(R.id.latitude);
    
        }
    
    
    }
    

    }

    【讨论】:

    • 给我发例子
    • 我加了一个例子
    • 请给我一个使用这个url的例子......beta.json-generator.com/api/json/get/VJ9snXcFG假设我们使用json打印列表视图中的所有标题(beta.json-generator.com/api/json/ get/VJ9snXcFG)。下一个标题将点击打开 json 中的第一个 url(beta.json-generator.com/api/json/get/VJ9snXcFG),第二个标题将点击打开 json 中的第二个 url (beta.json-generator .com/api/json/get/VJ9snXcFG) 等
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    相关资源
    最近更新 更多