2015-04-03 2 views
0

Я создал пользовательский адаптер, имеющий один текстовый просмотр и один веб-просмотр как элемент строки в списке. Я извлекаю данные с сервера. Но я не уверен, почему он показывает только одну строку, хотя должно быть два ряда.Android listview показывает одну строку item

класс активности

import android.os.AsyncTask; 
import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.ListView; 

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

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


public class GoldenTipsActivity extends ActionBarActivity { 

    ListView listView; 
    List<PatientUtility> patientUtilityArrayList; 
    CustomPatientUtilityAdapter adapter; 

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

     listView = (ListView) findViewById(R.id.listView); 
     getData(); 
    } 

    public void getData(){ 
     GetData getData = new GetData(); 
     getData.execute(); 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_golden_tips, menu); 
     return true; 
    } 

    public List<PatientUtility> parseData(String jsonStringData) throws JSONException{ 
     JSONObject object = new JSONObject(jsonStringData); 
     JSONArray array = object.getJSONArray("pat_data"); 

     String title; 
     String data; 

     PatientUtility patientUtility = null; 
     for (int i = 0; i < array.length(); i++){ 

      patientUtilityArrayList = new ArrayList<>(); 
      JSONObject object1 = array.getJSONObject(i); 
      title = object1.getString("title"); 
      data = object1.getString("data"); 

      patientUtility = new PatientUtility(); 
      patientUtility.setTitle(title); 
      patientUtility.setData(data); 

      Log.v("Title", patientUtility.getTitle()); 
      Log.v("Data", patientUtility.getData()); 

      patientUtilityArrayList.add(patientUtility); 
     } 
     return patientUtilityArrayList; 
    } 


    private class GetData extends AsyncTask<Void, Void, List<PatientUtility>>{ 

     final String LOG_TAG = GetData.class.getSimpleName(); 

     public String html2text(String html) { 
      return Jsoup.parse(html).text(); 
     } 


     @Override 
     protected List<PatientUtility> doInBackground(Void... params) { 

      // These two need to be declared outside the try/catch 
      // so that they can be closed in the finally block. 
      HttpURLConnection urlConnection = null; 
      BufferedReader reader = null; 

      // Will contain the raw JSON response as a string. 
      String dataJsonString = null; 

      try { 

       final String BASE_URL = "http://mycityortho.com/display_golden_tips.php"; 
       URL url = new URL(BASE_URL); 
       Log.v(LOG_TAG, url.toString()); 

       urlConnection = (HttpURLConnection) url.openConnection(); 
       urlConnection.setRequestMethod("GET"); 
       urlConnection.connect(); 

       // Read the input stream into a String 
       InputStream inputStream = urlConnection.getInputStream(); 
       StringBuffer buffer = new StringBuffer(); 
       if (inputStream == null) { 
        // Nothing to do. 
        return null; 
       } 
       reader = new BufferedReader(new InputStreamReader(inputStream)); 

       String line; 
       while ((line = reader.readLine()) != null) { 
        // Since it's JSON, adding a newline isn't necessary (it won't affect parsing) 
        // But it does make debugging a *lot* easier if you print out the completed 
        // buffer for debugging. 
        buffer.append(line + "\n"); 
       } 

       if (buffer.length() == 0) { 
        // Stream was empty. No point in parsing. 
        return null; 
       } 

       dataJsonString = buffer.toString(); 
       Log.v(LOG_TAG, dataJsonString); 

      } catch (IOException e) { 
       Log.e(LOG_TAG, "Error ", e); 
       // If the code didn't successfully get the weather data, there's no point in attemping 
       // to parse it. 
       return null; 
      } finally { 
       if (urlConnection != null) { 
        urlConnection.disconnect(); 
       } 
       if (reader != null) { 
        try { 
         reader.close(); 
        } catch (final IOException e) { 
         Log.e(LOG_TAG, "Error closing stream", e); 
        } 
       } 
      } 

      try { 
       String textData = html2text(dataJsonString); 
       return parseData(textData); 
      }catch (JSONException e){ 
       e.printStackTrace(); 
      } 

      return null; 
     } 

     @Override 
     protected void onPostExecute(List<PatientUtility> result) { 
      if (result != null){ 
       adapter = new CustomPatientUtilityAdapter(GoldenTipsActivity.this ,result); 
       listView.setAdapter(adapter); 
      } 
     } 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
} 

и вот мой пользовательский адаптер класса

import android.app.Activity; 
import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.webkit.WebView; 
import android.widget.BaseAdapter; 
import android.widget.TextView; 
import java.util.List; 

public class CustomPatientUtilityAdapter extends BaseAdapter{ 

    private List<PatientUtility> list; 
    private Activity activity; 
    private LayoutInflater inflater; 

    public CustomPatientUtilityAdapter(Activity activity, List<PatientUtility> list){ 
     this.activity = activity; 
     this.list = list; 
    } 

    @Override 
    public int getCount() { 
     return list.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return list.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     if (inflater == null){ 
      inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     } 

     if (convertView == null){ 
      convertView = inflater.inflate(R.layout.list_row_patient_utility_section, null); 
     } 

     TextView titleTextView = (TextView) convertView.findViewById(R.id.titleTextView); 
     WebView dataTextView = (WebView) convertView.findViewById(R.id.dataTextView); 

     PatientUtility p = list.get(position); 
     titleTextView.setText(p.getTitle()); 
     dataTextView.loadData(p.getData(), "text/html", "utf-8"); 

     return convertView; 
    } 
} 

Я уверен, что там будет небольшая проблема, но я не в состоянии получить этот вопрос и потраченных часов, чтобы решить эта ошибка.

ответ

0

Привет Я думаю, что вы допустили ошибку в public List<PatientUtility> parseData(String jsonStringData) {..} function. см. инициализацию неправильно.

patientUtilityArrayList = new ArrayList<>(); 

Список массивов, который вы инициализируете внутри цикла for. поэтому у вас есть только один элемент в представлении списка. см. обновленную функцию parseData.

public List<PatientUtility> parseData(String jsonStringData) throws JSONException{ 
     JSONObject object = new JSONObject(jsonStringData); 
     JSONArray array = object.getJSONArray("pat_data"); 

     String title; 
     String data; 

     PatientUtility patientUtility = null; 

     patientUtilityArrayList = new ArrayList<>(); 

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


      JSONObject object1 = array.getJSONObject(i); 
      title = object1.getString("title"); 
      data = object1.getString("data"); 

      patientUtility = new PatientUtility(); 
      patientUtility.setTitle(title); 
      patientUtility.setData(data); 

      Log.v("Title", patientUtility.getTitle()); 
      Log.v("Data", patientUtility.getData()); 

      patientUtilityArrayList.add(patientUtility); 
     } 
     return patientUtilityArrayList; 
    } 
+0

Спасибо bro..u спас мою жизнь .. – aquib23

+0

пожалуйста, вы можете голосовать этот ответ. –

0

заменить этот

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

     patientUtilityArrayList = new ArrayList<>(); 

     ................. 
     ................. 
    } 
return patientUtilityArrayList; 

к этому

patientUtilityArrayList = new ArrayList<>(); 

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


     ................. 
     ................. 
    } 
return patientUtilityArrayList; 

На самом деле сейчас вы создаете новый ArrayList объект в каждом цикле. SO вместо добавления данных в предыдущий список, каждый раз создается новый список и добавляется в этот список.

0

Это ответ на ваш стиль кодирования. Google рекомендует нам, что мы должны переопределить getView из BaseAdapter так:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    if (convertView == null){ 
     convertView = inflater.inflate(R.layout.list_row_patient_utility_section, null); 
     holder = new ViewHolder(); 
     holder.tv = (TextView) convertView.findViewById(R.id.titleTextView); 
     holder.wv = (WebView) convertView.findViewById(R.id.dataTextView); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder)converview.getTag(); 
    } 

    PatientUtility p = list.get(position); 
    holder.tv.setText(p.getTitle()); 
    holder.wv.loadData(p.getData(), "text/html", "utf-8"); 

    return convertView; 
} 

public class ViewHolder{ 
    TextView tv; 
    WebView wv; 
} 
Смежные вопросы