2016-03-08 2 views
0

Я хотел бы заполнить свой Listview с помощью цикла, я недавно попытался заполнить его очень неэффективно, сделав несколько вызовов для данных из SQL. Когда я понял, насколько это неэффективно, я начал извлекать данные с сервера за один раз, используя массивы. У меня возникли проблемы с изменением кода для этого.Заполнение ListView из массива

Что мне нужно сделать, это найти способ прокрутки ниже массива JSONArrays (для меня это не сложная часть), но для этого мне нужно, чтобы моя GetSocietyDataASyncTask возвращала вышеупомянутый массив и находила способ о передаче его методу OnCreate/done в SocietySearch.java (многие объекты Общества в моем коде могут быть проигнорированы и каким-то образом заменены сообществами List)

Теперь я считаю, что я включил весь соответствующий код, но если вам нужно увидеть что-нибудь еще, пожалуйста, не стесняйтесь спрашивать меня.

Данные, полученные с помощью Java из моей базы данных выглядит следующим образом:

[{"society_id":1,"name":"TestName1","email":"[email protected]","description":"TestDes1"}, 
{"society_id":2,"name":"TestName2","email":"[email protected]","description":"TestDes2"}] 

SocietySearch Класс:

public class SocietySearch extends AppCompatActivity { 

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


    Society society = new Society(-1, null, null, null); 
    ServerRequests serverRequest1 = new ServerRequests(SocietySearch.this); 
    serverRequest1.GetSocietyDataAsyncTask(society, new GetSocietyCallback() { 
     @Override 
     public void done(final Society returnedSociety) { 
      ListView lv = (ListView) findViewById(R.id.ListView); 
      List<ListViewItem> items = new ArrayList<>(); 
      items.add(new ListViewItem() {{ 
       ThumbnailResource = R.drawable.test; 
       Title = returnedSociety.socName; 
       Subtitle = returnedSociety.socDes; 
      }}); 
      CustomListViewAdapter adapter = new CustomListViewAdapter(SocietySearch.this, items); 
      lv.setAdapter(adapter); 
     } 
    }); 
} 


class ListViewItem { 
    public int ThumbnailResource; 
    public String Title; 
    public String Subtitle; 
} 

соответствующая часть ServerRequests Класс:

public class getSocietyDataAsyncTask extends AsyncTask<Void, Void, Society> { 
     Society society; 
     GetSocietyCallback societyCallback; 

     public getSocietyDataAsyncTask(Society society, GetSocietyCallback societyCallback) { 
      this.society = society; 
      this.societyCallback = societyCallback; 
     } 

     @Override 
     protected Society doInBackground(Void... params) { 
      BufferedReader reader = null; 
      Society returnedSociety = null; 
      List<Society> societies = new ArrayList<>(); 
      try { 
       URL url = new URL(SERVER_ADDRESS + "/getsocietydata.php"); 

       HttpURLConnection con = (HttpURLConnection) url.openConnection(); 

       con.setConnectTimeout(CONNECTION_TIMEOUT); 
       con.setReadTimeout(CONNECTION_TIMEOUT); 

       con.setRequestMethod("POST"); 

       con.setDoOutput(true); 

       StringBuilder sb = new StringBuilder(); 
       reader = new BufferedReader(new InputStreamReader(con.getInputStream())); 

       String line; 
       while ((line = reader.readLine()) != null) { //Read until there is something available 
        sb.append(line + "\n");  //Read and save line by line 
       } 
       line = sb.toString();   //Saving complete data received in string 

       //Check values received in Logcat 
       Log.i("custom_check", "The values received in the store part are as follows:"); 
       Log.i("custom_check", line); 


       JSONArray ja = new JSONArray(line); 
       if (ja != null && ja.length() == 0) { 
        returnedSociety = null; 
       } else { 
        for (int i = 0; i <ja.length(); i++) { 
         JSONObject json = ja.optJSONObject(i); 
         //Storing each Json in a variable 
         int society_id = json.getInt("society_id"); 
         String socName = json.getString("name"); 
         String socEmail = json.getString("email"); 
         String socDes = json.getString("description"); 
         returnedSociety = new Society(society_id, socName, socEmail, socDes); 
         societies.add(returnedSociety); 
        } 
        return returnedSociety; 
       } 


      } catch (Exception e) { 
       e.printStackTrace(); 
       Log.d("Sample", "Error has occurred!\n" + e.toString()); 

      } 


      finally { 

       if (reader != null) { 
        try { 
         reader.close();  //Closing the 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 

      } 
      return returnedSociety; 
     } 

     @Override 
     protected void onPostExecute(Society returnedSociety) { 
      super.onPostExecute(returnedSociety); 
      progressDialog.dismiss(); 
      societyCallback.done(returnedSociety); 
     } 
    } 

CustomListViewAdapter.java:

public class CustomListViewAdapter extends BaseAdapter { 

    LayoutInflater inflater; 
    List<SocietySearch.ListViewItem> items; 

    public CustomListViewAdapter(Activity context, List<SocietySearch.ListViewItem> items) { 
     super(); 

     this.items = items; 
     this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    @Override 
    public int getCount() { 
     //Auto-generated method stub 
     return items.size(); // TODO Maybe this can be my sql count? 
    } 

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

    @Override 
    public long getItemId(int position) { 
     //Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     //Auto-generated method stub 

     ListViewItem item = items.get(position); 

     View vi = convertView; 

     if (convertView == null) 
      vi = inflater.inflate(R.layout.item_row, null); 

     ImageView test = (ImageView) vi.findViewById(R.id.imgThumbnail); 
     TextView txtTitle = (TextView) vi.findViewById(R.id.txtTitle); 
     TextView txtSubTitle = (TextView) vi.findViewById(R.id.txtSubTitle); 

     test.setImageResource(item.ThumbnailResource); 
     txtTitle.setText(item.Title); 
     txtSubTitle.setText(item.Subtitle); 


     return vi; 
    } 
} 

ListView Layour файл (item_row.xml):

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/relativeLayout1" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:padding="5dip"> 

    <ImageView 
     android:id="@+id/imgThumbnail" 
     android:layout_width="78dip" 
     android:layout_height="78dip" 
     android:layout_alignParentLeft="true" 
     android:layout_centerInParent="true" 
     android:layout_marginLeft="-3dip" 
     android:scaleType="centerInside"></ImageView> 

    <TextView 
     android:id="@+id/txtTitle" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="6dip" 
     android:layout_marginTop="6dip" 
     android:layout_toRightOf="@+id/imgThumbnail" 
     android:text="TextView" 
     android:textAppearance="?android:attr/textAppearanceLarge"></TextView> 

    <TextView 
     android:id="@+id/txtSubTitle" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/txtTitle" 
     android:layout_marginLeft="6dip" 
     android:layout_marginTop="3dip" 
     android:layout_toRightOf="@+id/imgThumbnail" 
     android:text="TextView"></TextView> 

</RelativeLayout> 
+0

Все выглядит прекрасно, так что в чем проблема? –

+0

Ну с помощью этого кода я могу заполнить одну запись в списке, но не более того. Он работает только для последней записи. – kmil

ответ

1

Взгляните на ArrayAdapter и конкретно #notifyDataSetChanged. (notifyDataSetChanged example). Вы можете установить ListView в #onCreate, как и у вас, и сохранить ссылку на базовый Adapter. Первоначально Adapter будет пустым, но когда данные поступают, просто добавьте его в Adapter и вызовите #notifyDataSetChanged, как показано в примере.

+0

Я только что наткнулся на ArrayAdapter и сейчас пытаюсь использовать его, но не очень успешный с моими навыками в этот момент, но, надеюсь, я туда доберусь. Считаете ли вы, что вы сможете опубликовать немного кода, чтобы указать мне в правильном направлении? – kmil

+0

https://github.com/codepath/android_guides/wiki/Using-an-ArrayAdapter-with-ListView для общего использования и http://stackoverflow.com/a/33890027/608347 для обновления адаптера с новыми данными –

+0

Still не имея большой удачи, должен ли я получить getSocietyDataAsyncTask, чтобы вернуть Общество или Список? – kmil

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