Я хочу получить 2 API-адреса URL от JSON, чтобы связать их в один просмотр списка в Android - PullRequest
0 голосов
/ 08 ноября 2018

Я хочу получить 2 api url от json, чтобы связать их в один listview в android. Один API считывает данные подробно, а другой - считывает изображение, чтобы они оба отображались в одном и том же listview для отображения подробной информации.

Вот мой первый API, чтобы получить детализацию текста

public class NationalNewsFragment extends Fragment
{
    SwipeRefreshLayout swipeRefreshLayout;
    private ProgressDialog progressDialog;
    ListView listView;
    ImageView frontbanner;

    //NEWS API
    RequestQueue queue;
    ArrayList<HashMap<String, String>> dataList = new ArrayList<HashMap<String, 
    String>>();
    static final String KEY_TITLE = "Title";
    static final String KEY_INFO1 = "info1";
    static final String KEY_C_DATE = "C_date";
    static final String KEY_News_ID = "News_ID";
    static final String KEY_C_BY = "C_by";
    static final String KEY_C_VIEWS = "C_views";

    //FrontBanner API
    RequestQueue requestQueue;
    static final String FRONT_BANNER = "Adv";

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_national_news, container, 
    false);

        listView = (ListView)view.findViewById(R.id.list_source);
        swipeRefreshLayout = 
    (SwipeRefreshLayout)view.findViewById(R.id.refresh_layout);
        //NEWS API
        queue = Volley.newRequestQueue(getContext());
        requestQueue = Volley.newRequestQueue(getContext());

        progressDialog = new ProgressDialog(getContext());
        progressDialog.setMessage("Loading...");
        progressDialog.setCanceledOnTouchOutside(false);
        progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        progressDialog.show();
        String url = "my api url here";
        JsonArrayRequest jsonArrayRequest = new 
     JsonArrayRequest(Request.Method.GET, url, null,
                new Response.Listener<JSONArray>()
                {
                    @Override
                    public void onResponse(JSONArray response)
                    {

                        for (int i = 0; i < response.length(); i++)
                        {
                            try
                            {
                                JSONObject news = response.getJSONObject(i);

                                HashMap<String, String> map = new 
    HashMap<String, String>();

                                map.put(KEY_TITLE, 
    news.optString(KEY_TITLE).toString());
                                map.put(KEY_INFO1, 
    news.optString(KEY_INFO1).toString());
                                map.put(KEY_C_DATE, 
    news.optString(KEY_C_DATE).toString());
                                map.put(KEY_News_ID, 
    news.optString(KEY_News_ID).toString());
                                map.put(KEY_C_BY, 
    news.optString(KEY_C_BY).toString());
                                map.put(KEY_C_VIEWS, 
    news.optString(KEY_C_VIEWS).toString());


    //System.out.println(news.optString(KEY_TITLE).toString());
                                dataList.add(map);


                                ListNewsAdapter adapter = new 
    ListNewsAdapter(getActivity(), dataList);
                                listView.setAdapter(adapter);

                            } catch (JSONException e)
                            {
                                e.printStackTrace();
                            }
                        }
                        progressDialog.cancel();
                    }
                }, new Response.ErrorListener()
        {
            @Override
            public void onErrorResponse(VolleyError error)
            {
                error.printStackTrace();
            }
        });

        queue.add(jsonArrayRequest);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {
                Intent i = new Intent(getActivity(), 
    FreshNewsDetailActivity.class);
                i.putExtra("News_ID", dataList.get(position).get(KEY_News_ID));
                startActivity(i);
                //Toast.makeText(MainActivity.this, 
    dataList.get(position).get(KEY_News_ID), Toast.LENGTH_SHORT).show();
            }
        });

        //Refresh layout
        swipeRefreshLayout.setOnRefreshListener(new 
    SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                swipeRefreshLayout.setRefreshing(false);
                progressDialog = new ProgressDialog(getContext());
                progressDialog.setMessage("Loading...");
                progressDialog.setCanceledOnTouchOutside(false);
                progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
                progressDialog.show();
                String url = "my api url here";
                JsonArrayRequest jsonArrayRequest = new 
                JsonArrayRequest(Request.Method.GET, url, null,
                        new Response.Listener<JSONArray>()
                        {
                            @Override
                            public void onResponse(JSONArray response)
                            {

                                for (int i = 0; i < response.length(); i++)
                                {
                                    try
                                    {
                                        JSONObject news = 
        response.getJSONObject(i);

                                        HashMap<String, String> map = new 
        HashMap<String, String>();

                                        map.put(KEY_TITLE, 
        news.optString(KEY_TITLE).toString());
                                        map.put(KEY_INFO1, 
        news.optString(KEY_INFO1).toString());
                                        map.put(KEY_C_DATE, 
        news.optString(KEY_C_DATE).toString());
                                        map.put(KEY_News_ID, 
        news.optString(KEY_News_ID).toString());


        //System.out.println(news.optString(KEY_TITLE).toString());
                                        dataList.add(map);

                                        ListNewsAdapter adapter = new 
        ListNewsAdapter(getActivity(), dataList);
                                        listView.setAdapter(adapter);

                                    } catch (JSONException e)
                                    {
                                        e.printStackTrace();
                                    }
                                }
                                progressDialog.cancel();
                            }
                        }, new Response.ErrorListener()
                {
                    @Override
                    public void onErrorResponse(VolleyError error)
                    {
                        error.printStackTrace();
                    }
                });

                queue.add(jsonArrayRequest);
                listView.setOnItemClickListener(new 
        AdapterView.OnItemClickListener() {
                    public void onItemClick(AdapterView<?> parent, View view,
                                            int position, long id) {
                        Intent i = new Intent(getActivity(), 
        FreshNewsDetailActivity.class);
                        i.putExtra("News_ID", 
        dataList.get(position).get(KEY_News_ID));
                        startActivity(i);
                        //Toast.makeText(MainActivity.this, 
        dataList.get(position).get(KEY_News_ID), Toast.LENGTH_SHORT).show();
                    }
                });
            }
        });
        return view;
    }
}

Вот мой код адаптера данных. Должен ли я использовать один adapter? Если так, как объединить два источника данных в один и тот же адаптер данных. Или я должен использовать 2 dataAdapter и как связать два dataAdapter в один ListView в Android?

class ListNewsAdapter extends BaseAdapter {
private Activity activity;
private ArrayList<HashMap<String, String>> data;

public ListNewsAdapter(Activity a, ArrayList<HashMap<String, String>> d) {
    activity = a;
    data=d;
}
public int getCount() {
    return data.size();
}
public Object getItem(int position) {
    return position;
}
public long getItemId(int position) {
    return position;
}
public View getView(int position, View convertView, ViewGroup parent)
{
    ListNewsViewHolder holder = null;
    if (convertView == null)
    {
        holder = new ListNewsViewHolder();
        convertView = 
LayoutInflater.from(activity).inflate(R.layout.source_layout, parent, 
false);

        holder.title = (TextView) convertView.findViewById(R.id.title);
        holder.c_by = (TextView) convertView.findViewById(R.id.c_by);
        holder.c_views = (TextView) convertView.findViewById(R.id.c_views);
        holder.c_date = (TextView) convertView.findViewById(R.id.c_date);

        convertView.setTag(holder);
    }
    else
    {
        holder = (ListNewsViewHolder) convertView.getTag();
    }

    holder.title.setId(position);
    holder.c_by.setId(position);
    holder.c_views.setId(position);
    holder.c_date.setId(position);

    HashMap<String, String> song = new HashMap<String, String>();
    song = data.get(position);

    try
    {
        holder.c_by.setText("ដោយ 
"+song.get(NationalNewsFragment.KEY_C_BY));
        holder.c_views.setText("/ 
"+song.get(NationalNewsFragment.KEY_C_VIEWS)+" views");
        String sourceString = "<p align=\\\"justify\\\"><b><font 
color=#000000>" + song.get(NationalNewsFragment.KEY_TITLE) + "</font></b> " 
+ song.get(NationalNewsFragment.KEY_INFO1)+"</p>";
        holder.title.setText(Html.fromHtml(sourceString));
        holder.c_date.setText("ថ្ងៃទី ៖ 
"+song.get(NationalNewsFragment.KEY_C_DATE));
    }
    catch(Exception e) {}
    return convertView;
  }
}

class ListNewsViewHolder
{
    TextView title, info1, c_date, c_by, c_views;
}

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Из файлов, которыми вы поделились, я узнал, что вы используете ClassCallApi для получения обоих API. Если так,

Создать новую модель класса

public class CombinedApi {

private ArrayList<HashMap<String, String>> dataListOne;
private ArrayList<HashMap<String, String>> dataListTwo;

public ArrayList<HashMap<String, String>> getDataListOne() {
    return dataListOne;
}

public void setDataListOne(ArrayList<HashMap<String, String>> dataListOne) {
    this.dataListOne = dataListOne;
}

public ArrayList<HashMap<String, String>> getDataListTwo() {
    return dataListTwo;
}

public void setDataListTwo(ArrayList<HashMap<String, String>> dataListTwo) {
    this.dataListTwo = dataListTwo;
}

}

Внесите некоторые изменения в ClassCallApi

ArrayList<CombinedApi> dataList = new ArrayList();
ArrayList<HashMap<String, String>> dataListOne = new ArrayList<HashMap<String, String>>();
ArrayList<HashMap<String, String>> dataListTwo = new ArrayList<HashMap<String, String>>();

Как только вы завершите ПЕРВЫЙ API CALL, сохраните данные в dataListOne и один раз после того, как вы завершите ВТОРОЙ API CALL, успешно добавьте эти данные в dataListTwo

 dataListOne.add(map); //Data from api call one
 dataListTwo.add(map); //Data from api call two

Пожалуйста, используйте вашу логику для подачи вышеуказанных массивов.

Как только у вас будут обе данные. Создайте простую функцию внутри ClassCallApi для подачи адаптера

private void feedAdapter() {


    for (int i = 0; i < dataListOne.size(); i++) {
        CombinedApi mCombinedApi = new CombinedApi();
        mCombinedApi.setDataListOne(dataListOne.get(i));
        mCombinedApi.setDataListTwo(dataListTwo.get(i)); //Here i am assuming that both ArrayList have same size
        dataList.add(mCombinedApi);
    }


    ListNewsAdapter adapter = new ListNewsAdapter(getActivity(), dataList);
    listView.setAdapter(adapter);
}

Небольшое изменение в адаптере.

private  ArrayList<CombinedApi> data;

public ListNewsAdapter(Activity a, ArrayList<CombinedApi> d) {
    activity = a;
    data=d;
}

Все готово:)

Чтобы получить песню

    HashMap<String, String> song = new HashMap<String, String>();
    song = data.get(position);
    instead use
    song = data.get(position).getDataListOne();
    or
    song = data.get(position).getDataListTwo();
0 голосов
/ 08 ноября 2018

Следует использовать один адаптер. При наличии сложного источника данных (например, необходимо извлекать данные из нескольких API-интерфейсов) вам следует провести некоторое исследование о реактивном программировании. Если вы примените Reactive Java + Android, вы можете сделать это с помощью нескольких строк кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...