2016-03-08 101 views
0

我想用循环填充我的Listview,最近我试图通过对SQL中的数据进行多次调用,以非常低效的方式填充它。当我意识到它的效率有多低时,我开始通过使用数组从一台服务器上获取数据。我无法更改我的代码以使其工作。从数组填充ListView

我需要做的是找到一种循环遍历下面的JSONArray数组(这对我来说不难),但要做到这一点,我需要让我的GetSocietyDataASyncTask返回上面的数组,并找到一种方法将其传递给SocietySearch.java中的OnCreate/done方法(我的代码中的许多社会对象可以忽略,并以某种方式替换为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

用这段代码,我可以在listview中填充单个条目,但不能超过这个。它只适用于最后一个条目。 – kmil

回答

1

ArrayAdapter,特别#notifyDataSetChanged看一看。 (notifyDataSetChanged example)。您可以像#onCreate一样设置ListView,并存储对基础Adapter的引用。最初,Adapter将为空,但是当数据进入时,只需将其添加到Adapter,并按示例中的指导致电#notifyDataSetChanged即可。

+0

我刚刚遇到了ArrayAdapter,现在正在尝试我的手,在这一点上我的技能没有超级成功,但希望我能到达那里。你认为你可以发布一些代码来指向正确的方向吗? – kmil

+0

https://github.com/codepath/android_guides/wiki/Using-an-ArrayAdapter-with-ListView for general usage以及http://stackoverflow.com/a/33890027/608347用新数据更新适配器 –

+0

Still没有多少运气,我是否应该让我的getSocietyDataAsyncTask返回一个社团或列表? – kmil