2016-06-15 2 views
1

Я работаю над проектом android с андроид-студией Я использую веб-службы У меня проблема с получением данных из моей базы данных и показом этих данных (чтобы проверить, что я использую backend и у меня есть «getProspectServlet» Итак, у меня есть таблица, которая называется перспектива, чтобы получить список потенциальных клиентов и показать перспективы в списке с расширением, вот код класса, который получает перспективу из базы данных и хранит их в списке " Liste»Отображение данных из базы данных в ListView

import android.app.Activity; 
import android.content.Context; 
import android.os.AsyncTask; 
import android.util.Log; 
import android.view.View; 
import android.widget.ProgressBar; 
import android.widget.Toast; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.UnsupportedEncodingException; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.util.ArrayList; 
import java.util.List; 

/** 
* Created by DKTIQUE on 19/05/2016. 
*/ 
public class getProspect extends AsyncTask<Void,Void,String> { 
    private Context context; 
    List<Prospect> liste; 

    public List<Prospect> getListe() { 
     return liste; 
    } 
    // ProgressBar pb; 

    public getProspect(Context context) { 
     this.context = context; 
    } 



    /* public getProspect(Context context, List<Prospect> liste) { 
     this.context = context; 
     this.liste = liste; 
    }*/ 

    /* @Override 
    protected void onPreExecute() { 
     pb = (ProgressBar) ((Activity)context).findViewById(R.id.progressBar); 
     pb.setVisibility(View.VISIBLE); 
    }*/ 

    @Override 
    protected String doInBackground(Void... params) { // c un tableau 

     String data; 
     StringBuilder result= new StringBuilder(); 

     try { 
      // URL url = new URL ("http://10.0.2.163:8080/Prospects/GET"); 
      URL url = new URL ("http://192.168.43.249:8080/getProspect"); 

      // URL url = new URL ("http://10.0.19.196:8080/getProspect"); 

      // URL url = new URL ("http:// 10.0.19.196:8080/Prospects/GET"); 


      HttpURLConnection httpURLConnection=(HttpURLConnection) url.openConnection(); 
      httpURLConnection.setConnectTimeout(5000); 
      InputStream is = httpURLConnection.getInputStream(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8")); 
      while ((data = reader.readLine()) != null) { 
       result.append(data); 
      } 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     Log.v("resut", result.toString()); 
     return result.toString(); 
    } 

    @Override 
    protected void onPostExecute(String s) {//afficher le resultat 
     // List<Prospect> 
       liste = new ArrayList<>(); 
//  pb.setVisibility(View.VISIBLE); 

     // Gson gson = new Gson(); 
     // if (!s.equals("")) { 

     try { 
      JSONArray jsonArray = new JSONArray(s); 

      for (int i = 0; i < jsonArray.length(); i++) { 
       JSONObject jsonObject = jsonArray.getJSONObject(i); 
       Prospect prospect= new Prospect(); 
       prospect.setNom(jsonObject.get("nom").toString()); 
       prospect.setPrenom(jsonObject.get("prenom").toString()); 
       // prospect.setTitle(jsonObject.get("idProspect").toString()); 

       ListeProspect.listee.add(prospect); 
       liste.add(prospect); 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 


     if (ListeProspect.listee.size()==0){Toast.makeText(context,"emptyyyyyyyyyyy",Toast.LENGTH_SHORT).show();} 
     // TextView textView = (Activity)context.findViewbyId(); 
    /* for(int i=0;i<liste.size();i++){ 

      Toast.makeText(context,liste.get(i).getNom(), Toast.LENGTH_SHORT).show(); 
     }*/ 
    } 

    // } 
} 

я хочу, чтобы получить этот список объектов и показать их в этом списке, но я держать имея пустой список в ListProspect в getProspect список не пуст (я тест с тостом), но когда я тр у, чтобы получить список в ListProspect я ничего не получаю , как вы можете видеть, я использовал также статический список в ListProspect, чтобы получить перспективу, но он пустой и я использовал также getListe() вот код для ListView

public class ListeProspect extends AppCompatActivity { 

    static List<Prospect> listee = new ArrayList(); 

     ExpandableListAdapter listAdapter; 
     ExpandableListView expListView; 
     List<String> listDataHeader; 
     HashMap<String, List<String>> listDataChild; 

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

     // getProspect p= new getProspect(this).execute(); 
     // getProspect p= new getProspect(this); 

    new getProspect(this).execute(); 
     //p = new getProspect(this); 
     // p.execute(); 
     // p.onPostExecute(); 

     if (ListeProspect.listee.size()==0){Toast.makeText(this,"empty",Toast.LENGTH_SHORT).show();} 

     else{Toast.makeText(this,"not empty",Toast.LENGTH_SHORT).show(); 
      for(int i=0;i<ListeProspect.listee.size();i++){ 

       Toast.makeText(this,ListeProspect. listee.get(i).getPrenom(), Toast.LENGTH_SHORT).show(); 
      } 


     } 





// get the listview 
     expListView = (ExpandableListView) findViewById(R.id.lvExp); 

     // preparing list data 
     prepareListData(); 

     listAdapter = new ExpandableListAdapter(this, listDataHeader, listDataChild); 

     // setting list adapter 
     expListView.setAdapter(listAdapter); 

     // Listview Group click listener 
     expListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() { 

      @Override 
      public boolean onGroupClick(ExpandableListView parent, View v, 
             int groupPosition, long id) { 
       // Toast.makeText(getApplicationContext(), 
       // "Group Clicked " + listDataHeader.get(groupPosition), 
       // Toast.LENGTH_SHORT).show(); 
       return false; 
      } 
     }); 

     // Listview Group expanded listener 
     expListView.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() { 

      @Override 
      public void onGroupExpand(int groupPosition) { 
       Toast.makeText(getApplicationContext(), 
         listDataHeader.get(groupPosition) + " Expanded", 
         Toast.LENGTH_SHORT).show(); 
      } 
     }); 

     // Listview Group collasped listener 
     expListView.setOnGroupCollapseListener(new ExpandableListView.OnGroupCollapseListener() { 

      @Override 
      public void onGroupCollapse(int groupPosition) { 
       Toast.makeText(getApplicationContext(), 
         listDataHeader.get(groupPosition) + " Collapsed", 
         Toast.LENGTH_SHORT).show(); 

      } 
     }); 

     // Listview on child click listener 
     expListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() { 

      @Override 
      public boolean onChildClick(ExpandableListView parent, View v, 
             int groupPosition, int childPosition, long id) { 
       // TODO Auto-generated method stub 
       Toast.makeText(
         getApplicationContext(), 
         listDataHeader.get(groupPosition) 
           + " : " 
           + listDataChild.get(
           listDataHeader.get(groupPosition)).get(
           childPosition), Toast.LENGTH_SHORT) 
         .show(); 
       return false; 
      } 
     }); 
    } 

    /* 
    * Preparing the list data 
    */ 
    private void prepareListData() { 
     listDataHeader = new ArrayList<String>(); 
     listDataChild = new HashMap<String, List<String>>(); 

     // Adding child data 
     listDataHeader.add("Prospect 1"); 
     listDataHeader.add("Prospect 2"); 
     listDataHeader.add("Prospect 3"); 

     // Adding child data 
     List<String> top250 = new ArrayList<String>(); 
     top250.add("Age1"); 
     top250.add("Assuré1"); 
     top250.add("Type de stomie1"); 
     top250.add("Nombre de poche par jour"); 


     List<String> nowShowing = new ArrayList<String>(); 
     nowShowing.add("Age2"); 
     nowShowing.add("Assuré"); 
     nowShowing.add("Type de stomie"); 
     nowShowing.add("Nombre de poche par jour"); 


     List<String> comingSoon = new ArrayList<String>(); 
     comingSoon.add("Age"); 
     comingSoon.add("Assuré"); 
     comingSoon.add("Type de stomie"); 
     comingSoon.add("Nombre de poche par jour"); 


     listDataChild.put(listDataHeader.get(0), top250); // Header, Child data 
     listDataChild.put(listDataHeader.get(1), top250); // Header, Child data 
     listDataChild.put(listDataHeader.get(2), top250); // Header, Child data 
     // listDataChild.put(listDataHeader.get(1), nowShowing); 
     // listDataChild.put(listDataHeader.get(2), comingSoon); 
    } 
} 

как я могу решить это, как я сказал в классе «getProspect», я могу показать свои перспективы в тосте, но когда я перехожу к «ListeProspect», у меня есть пустой список

+0

Совет: Сохраните работу по написанию AsyncTasks и используйте JsonArrayRequest для Volley –

+0

Или попробуйте не использовать статические переменные и использовать [обратные вызовы из асинтезы] (http://stackoverflow.com/questions/9963691/android-asynctask-sending- callbacks-to-ui) –

ответ

1

Причина, по которой список показывается пустым, когда вы проверяете это, потому что вы заполняете его в asyncTask, который работает в фоновом потоке и сразу же проверяет его после вызова asyncTask в основном потоке. Короче говоря, вы не позволили своей фоновой задаче заполнить список, прежде чем пытаться отобразить его или распечатать. onPostExecute запускается в основном потоке и запускается после завершения doInBackground, поэтому сделайте все, что вы хотите сделать после завершения фоновой задачи в onPostExecute.

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

+0

Rob85 thnk вы так много для объяснения, но я не очень хорошо понял, поэтому я должен использовать этот «p = new getProspect (this); p.onPostExecute();« Я попытался, но не работал, плюс я не могу отправить список в намерении, я нажимаю на кнопку, я перехожу к активности expandbleList, там мне нужно иметь myList, я не вижу, как я могу использовать намерение здесь, можете ли вы объяснить мне больше, как я могу решить эту проблему? – user123

+0

i я не уверен, что могу быть намного яснее, вы запускаете процесс в фоновом потоке (заполняете список), этот процесс требует времени. но сразу после запуска этого процесса вы проверяете, что результат в основном потоке (onCreate), ваш фоновый поток еще не закончился, поэтому, конечно, ваш список будет пустым. помните, что onCreate не является циклом, он только вызывается один раз – Rob85

+0

, так как я могу узнать, когда закончилась BackgroundTask? – user123

Смежные вопросы