2016-12-12 6 views
2

Почему я получаю пустой список на своем телефоне. Может ли кто-нибудь помочь? Он показывает правильные 7 позиций, но они пусты. Есть мой php-файл, который, вероятно, хорошо. Я использую json encode.Пустой список Android Studio

public class ClientActivity extends UserAreaActivity { 

private String jsonResult; 
private String url = "http://vinusek.000webhostapp.com/Client2.php"; 
private ListView listView; 
private TextView nazwa; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_client); 
    listView = (ListView) findViewById(R.id.listView1); 
    nazwa = (TextView) findViewById(R.id.textView2) ; 
    accessWebService(); 
} 

// Async Task to access the web 
private class JsonReadTask extends AsyncTask<String, Void, String> { 
    @Override 
    protected String doInBackground(String... params) { 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost(params[0]); 
     try { 
      HttpResponse response = httpclient.execute(httppost); 
      jsonResult = inputStreamToString(
        response.getEntity().getContent()).toString(); 
     } 

     catch (ClientProtocolException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    private StringBuilder inputStreamToString(InputStream is) { 
     String rLine = ""; 
     StringBuilder answer = new StringBuilder(); 
     BufferedReader rd = new BufferedReader(new InputStreamReader(is)); 

     try { 
      while ((rLine = rd.readLine()) != null) { 
       answer.append(rLine); 
      } 
     } 

     catch (IOException e) { 
      // e.printStackTrace(); 
      Toast.makeText(getApplicationContext(), 
        "Error..." + e.toString(), Toast.LENGTH_LONG).show(); 
     } 
     return answer; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     ListDrwaer(); 
    } 
}// end async task 

public void accessWebService() { 
    JsonReadTask task = new JsonReadTask(); 
    // passes values for the urls string array 
    task.execute(new String[] { url }); 
} 

// build hash set for list view 
public void ListDrwaer() { 
    List<Map<String, String>> employeeList = new ArrayList<Map<String, String>>(); 

    try { 

     JSONObject jsonResponse = new JSONObject(jsonResult); 
     JSONArray jsonMainNode = jsonResponse.optJSONArray("result"); 

     for (int i = 0; i < jsonMainNode.length(); i++) { 
      JSONObject jsonChildNode = jsonMainNode.getJSONObject(i); 
      String number = jsonChildNode.getString("id"); 
      String name = jsonChildNode.getString("login"); 
      String pass = jsonChildNode.getString("haslo"); 
      String outPut = number + "-" + name + "-" + pass; 
      employeeList.add(createEmployee("list", outPut)); 
      nazwa.setText(outPut); 
     } 


    } catch (JSONException e) { 
     Toast.makeText(getApplicationContext(), "Error" + e.toString(), 
       Toast.LENGTH_SHORT).show(); 
    } 


    SimpleAdapter simpleAdapter = new SimpleAdapter(ClientActivity.this, employeeList, 
      android.R.layout.simple_list_item_1, 
      new String[] {"list"}, new int[] { android.R.id.text1 }); 
    listView.setAdapter(simpleAdapter); 
} 

private HashMap<String, String> createEmployee(String name, String number) { 
    HashMap<String, String> employeeNameNo = new HashMap<String, String>(); 
    employeeNameNo.put(number, name); 
    return employeeNameNo; 
}} 

Что здесь не так, я получил код здесь http://codeoncloud.blogspot.in/2013/07/android-mysql-php-json-tutorial.html и это работает для своего файла PHP.

ответ

1

Проверьте SimpleAdapter class reference:

Как вы можете видеть, конструктор принимает следующие аргументы:

SimpleAdapter (Context context, 
       List<? extends Map<String, ?>> data, 
       int resource, 
       String[] from, 
       int[] to) 
  1. контекст Контекст: Контекст, где View, связанный с этим SimpleAdapter управлением
  2. данные: список карт. Каждая запись в списке соответствует одной строке в списке. Карты содержат данные для каждой строки и должны содержать все записи, указанные в «from»
  3. resource int: Идентификатор ресурса макета представления, который определяет представления для этого элемента списка. Файл макета должен включать по крайней мере те именованные виды, определенные в «до»
  4. from String: список имен столбцов, которые будут добавлены к карте, связанной с каждым элементом.
  5. to int: Представления, которые должны отображать столбец в параметре «from». Все они должны быть TextViews. В первых N представлениях в этом списке заданы значения первых N столбцов в параметре from.

вы создаете экземпляр SimpleAdapter с:

SimpleAdapter simpleAdapter = new SimpleAdapter(ClientActivity.this, employeeList, 
      android.R.layout.simple_list_item_1, 
      new String[] {"list"}, new int[] { android.R.id.text1 }); 

Это означает, что каждый элемент вашего employeeListList должен быть Map, который содержит ключ «список».

Поэтому

employeeList.add(createEmployee("list", outPut)); 

следует добавить к List в Map, имеющий запись с ключом «список», и значение outPut.

Однако, ваш метод createEmployee() создает HashMap с одной записью, где ключ и значение меняются местами.

Вы должны изменить

к

private HashMap<String, String> createEmployee(String name, String number) { 
    HashMap<String, String> employeeNameNo = new HashMap<String, String>(); 
    employeeNameNo.put(name, number); 
    return employeeNameNo; 
} 
+0

Спасибо :) он работает сейчас – vinusvini

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