Как заполнить просмотр списка данными из разных json - PullRequest
0 голосов
/ 28 июня 2018

Я работаю над приложением, в котором мне нужно получить данные из двух разных json, и мне нужно заполнить представление списка в Android. В первом Json у меня есть массив объектов, у меня есть объект id и URL-адрес, по которым нужно получить данные для этого объекта.

Как я могу это сделать? Я могу извлечь объект и заполнить представление списка этим объектом, но я не знаю, как взять данные для одного объекта и показать их в одной строке.

Вид списка должен быть таким:

enter image description here

Это Json1:

[
    {
        "id": "S1",
        "url": "MyUrl1"
    },
    {
        "id": "S2",
        "url": "MyUrl2"
    },
    {
        "id": "S3",
        "url": "MyUrl3"
    }
]

Это отличается для каждого объекта. Это Json2:

{
    "id": "S1",
    "temp": "20.03",
    "time": "28 June 2018, 9:12:13"
}

Итак, я могу получить идентификатор и показать все объекты идентификатора в listView, но я не могу получить для каждого объекта значения «temp» и «time».

Это мой код:

Адаптер

public class SensorAdapter extends BaseAdapter{
ArrayList<String> id= new ArrayList<String>();
ArrayList<String> labelno_array = new ArrayList<String>();
Context context;
LayoutInflater inflater;


public SensorAdapter2(Context c, ArrayList<String> label_array)
{
    context = c;
    id= label_array;
   // temp=temp_array;
   // time=time_array;
    //labelno_array = no_array;
    inflater = LayoutInflater.from(context);
}

@Override
public int getCount() {
    // TODO Auto-generated method stub
    return id.size();
}

@Override
public Object getItem(int position) {
    // TODO Auto-generated method stub
    return position;
}

@Override
public long getItemId(int position)
{
    // TODO Auto-generated method stub
    return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    View v = convertView;
    Holder holder;
    // TODO Auto-generated method stub
    if (v == null) {
        v = inflater.inflate(R.layout.columns_sensor, null);
        holder = new Holder();
        holder.tv_labelname = (TextView)v.findViewById(R.id.idsensor);

        v.setTag(holder);
    } else {
        holder = (Holder) v.getTag();
    }


    holder.tv_labelname.setText(id.get(position));

    return v;
}
public class Holder
{
    TextView tv_labelname,tv_labelno, tv_temp, tv_time;
}

А это мой код для получения номера датчика:

Код

 class RetrieveFeedTask2 extends AsyncTask<Void, Void, String> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }



    protected String doInBackground(Void... urls) {
        String API_URL = "MyUrl";

        try {
            URL url = new URL(API_URL);
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            try {
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
                StringBuilder stringBuilder = new StringBuilder();
                String line;
                while ((line = bufferedReader.readLine()) != null) {
                    stringBuilder.append(line).append("\n");
                }
                bufferedReader.close();
                return stringBuilder.toString();
            }
            finally{
                urlConnection.disconnect();
            }
        }
        catch(Exception e) {
            Log.e("ERROR", e.getMessage(), e);
            return null;
        }
    }

    protected void onPostExecute(String response) {
        if(response == null) {
            response = "THERE WAS AN ERROR";
        }
        //            progressBar.setVisibility(View.GONE);
        Log.i("INFO", response);

        try
        {

            JSONArray array=new JSONArray(response);

            for(int i = 0; i < array.length(); i++)
            {
                JSONObject obj = array.getJSONObject(i);

                String mysenso=obj.getString("id");
                String myurl=obj.getString("url");
                //partire nuova chiamata con l'url.
                label_no.add(myurl);
                label_name.add(mysenso);


            }


        }
        catch (JSONException e)
        {
            e.printStackTrace();
        }
        SensorAdapter2 adapter = new SensorAdapter2(Principale.this, label_name);
        listView.setAdapter(adapter);


    }

}

Итак, как я могу подключиться к URL-адресу объекта и обновить данные для этого объекта в той же строке?

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Если бы я был в вашем сценарии, я бы сначала получил данные (если они небольшие по размеру), а затем беспокоился о их отображении.

Если данные должны быть большими, я попытался бы получить дополнительную информацию, пытаясь просмотреть ее

Итак, продолжим.

Подсказка: я собираюсь предположить, что вы уже знаете, как получить ваши данные (на основе класса RetrieveFeedTask2 - хотя вам, вероятно, следует отключить соединение перед возвратом)

ОБЩИЙ СЛУЧАЙ:

Во всех случаях вам нужно
1. класс говорят

class MyObject {
   String id,time,temp,url;
}

2. Метод получения вашего First JSON и сохранения его в списке, скажем

public List&#60;MyObject&#62; fetchThenParseIntoList() {
   . . .
}

и теперь вы будете использовать его, чтобы получить свой первый JSON и разобрать его в список

List&#60;MyObject&#62; myObjects = fetchThenParseIntoList()

Итак, теперь у вас будет список объектов "MyObject" только с идентификаторами и URL-адресами

3. Поток, которому можно дать объект для получения дополнительной информации об объекте. скажем

class ExtraInfoThread extends Thread {
    private MyObject myObject;
    public ExtraInfoThread(final MyObject myObject) {
        this.myObject = myObject
    }

    @Override
    public void run() {
        . . .
    }
}

Случай 1: Небольшие данные (скажем, менее 1000 объектов)

Цикл каждого объекта и извлечение дополнительной информации

for(MyObject myObject: myObjects) {
    new ExtraInfoThread(myObject).start()
}

Теперь у вас есть объект со всеми данными, и вы можете отображать его как хотите

Случай 2: большие данные

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

public View getView() {
  new ExtraInfoThread(myObject).start()
  . . .
}

если вы сможете реализовать представления и выборку JSON, вы обязательно достигнете того, что ищете

0 голосов
/ 28 июня 2018

Прежде всего, создайте два POJO, как это

First.java

public class First {
    String id,url;

    public String getId() {
        return id;
    }

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

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }
}

Second.java

public class Second{
    String id,temp,time;

    public String getId() {
        return id;
    }

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

    public String getTemp() {
        return temp;
    }

    public void setTemp(String temp) {
        this.temp = temp;
    }

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }
}

Тогда в твоей асинктаске класс RetrieveFeedTask2 расширяет AsyncTask {

@Override
protected void onPreExecute() {
    super.onPreExecute();
}



protected String doInBackground(Void... urls) {
    String API_URL = "MyUrl";

    try {
        URL url = new URL(API_URL);
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
        try {
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
            StringBuilder stringBuilder = new StringBuilder();
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                stringBuilder.append(line).append("\n");
            }
            bufferedReader.close();
            return stringBuilder.toString();
        }
        finally{
            urlConnection.disconnect();
        }
    }
    catch(Exception e) {
        Log.e("ERROR", e.getMessage(), e);
        return null;
    }
}

protected void onPostExecute(String response) {
    if(response == null) {
        response = "THERE WAS AN ERROR";
    }
    //            progressBar.setVisibility(View.GONE);
    Log.i("INFO", response);
     ArrayList<First> firstList = new ArrayList<>();
    try
    {

        JSONArray array=new JSONArray(response);

        for(int i = 0; i < array.length(); i++)
        {
            JSONObject obj = array.getJSONObject(i);

            String mysenso=obj.getString("id");
            String myurl=obj.getString("url");
            First first = new First();
            first.setId(mysenso);
            first.setUrl(myurl);
            firstList.add(first);

        }


    }
    catch (JSONException e)
    {
        e.printStackTrace();
    }
    SensorAdapter2 adapter = new SensorAdapter2(Principale.this, firstList);
    listView.setAdapter(adapter);


}

}

Тогда в вашем адаптере

public class SensorAdapter extends BaseAdapter{
ArrayList<FirstList> firstList;

Context context;
LayoutInflater inflater;


public SensorAdapter2(Context c, ArrayList<FirstList> firstList)
{
    context = c;
    this.firstList=firstList;
   // temp=temp_array;
   // time=time_array;
    //labelno_array = no_array;
    inflater = LayoutInflater.from(context);
}

@Override
public int getCount() {
    // TODO Auto-generated method stub
    return firstList.size();
}

@Override
public Object getItem(int position) {
    // TODO Auto-generated method stub
    return position;
}

@Override
public long getItemId(int position)
{
    // TODO Auto-generated method stub
    return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    View v = convertView;
    Holder holder;
    // TODO Auto-generated method stub
    if (v == null) {
        v = inflater.inflate(R.layout.columns_sensor, null);
        holder = new Holder();
        holder.tv_labelname = (TextView)v.findViewById(R.id.idsensor);

        v.setTag(holder);
    } else {
        holder = (Holder) v.getTag();
    }


    holder.tv_labelname.setText(firstList.get(position).getId());

    return v;
}
public class Holder
{
    TextView tv_labelname,tv_labelno, tv_temp, tv_time;
}

Таким образом, ваша первая часть настроена. Теперь вам нужно получить значение элемента, по которому щелкнули, и оттуда вам нужно получить URL, а затем передать этот URL в другую асинхронную задачу, установить его значение в классе Second.java и показать его оттуда. Чтобы получить выбранный элемент, вам нужно использовать следующий код в классе, в котором вы находите ViewViewById для просмотра списка.

listView.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
        String url = (String) listView.getItemAtPosition(position);
        Toast.makeText(this,"You selected : " + url,Toast.LENGTH_SHORT).show();         
//here you will get the url and then now send it to another asynctask and parse it and set the value to Second.java and start another activity or fragment to display data from Second.java


    }
});
...