将JSON从SQL填充到Android Listview

时间:2016-03-07 22:44:09

标签: php android sql json listview

为此,我想使用PHP从phpmyadmin中提取数据来填充我的ListView。 与Populating JSON from this link to android Listview

非常相似

有人能指出我正确的方向吗?整个周末都有这个问题。

社会搜索课

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) {
               // ServerRequests.rowCount; // TODO this produces an error getrowcount

                ListView lv = (ListView) findViewById(R.id.ListView);
                List<ListViewItem> items = new ArrayList<>();
                for (int i=0; i <10; i++){
                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;
    }
}

CustomListViewAdapter类:

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;
    }
}

ServerRequests类的相关部分:

public class ServerRequests {

    ProgressDialog progressDialog;
    public static final int CONNECTION_TIMEOUT = 1000 * 15;
    public static final String SERVER_ADDRESS = "http://10.0.2.2:80/";//Connects to the emulator

    public ServerRequests(Context context) {
        progressDialog = new ProgressDialog(context);
        progressDialog.setCancelable(false);
        progressDialog.setTitle("Processing");
        progressDialog.setMessage("Please wait...");
    }

    public void GetSocietyDataAsyncTask(Society society, GetSocietyCallback societyCallBack) {
        progressDialog.show();
        new getSocietyDataAsyncTask(society, societyCallBack).execute();
    }


    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;
            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);


                JSONObject jObject = new JSONObject(line);
                if (jObject.length() == 0) {
                    returnedSociety = null;
                } else {
                    //Storing each Json in a variable
                    int society_id = jObject.getInt("society_id");
                    String socName = jObject.getString("name");
                    String socEmail = jObject.getString("email");
                    String socDes = jObject.getString("description");


                    returnedSociety = new Society(society_id, socName, socEmail, socDes);
                    System.out.println(returnedSociety);
                    return returnedSociety;
                }


            } catch (Exception e) {
                e.printStackTrace();
                Log.e("Buffer Error", "Error converting result " + 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);
        }
    }

对象保存数据:

public class Society {

    String socName, socEmail, socDes;
    int society_id;

    public Society(int society_id, String socName, String socEmail, String socDes) {

        this.society_id = society_id;
        this.socName = socName;
        this.socEmail = socEmail;
        this.socDes = socDes;

    }

    public int getSociety_id(){
        return this.society_id;
    }

    public String getSocName(){
        return this.socName;
}
    public String getSocEmail(){
        return this.socEmail;
    }
    public String getSocDes(){
        return this.socDes;
    }
}

item_row.xml(ListView的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>

GetSocietyData PHP代码:

<?php

        $user = 'root';
        $pass = '';
        $db = 'uopuser';

        $con=mysqli_connect('localhost', $user, $pass, $db) or die('Unable to connect');


        $statement = mysqli_prepare($con, 'SELECT * FROM society');
        mysqli_stmt_execute($statement);

        mysqli_stmt_store_result($statement);
        mysqli_stmt_bind_result($statement, $society_id, $name, $email, $description);

    $society = array();
    $key = 0;
    while(mysqli_stmt_fetch($statement))
    { 
        $society[$key]['society_id'] = $society_id; 
        $society[$key]['name'] = $name;
        $society[$key]['email'] = $email;
        $society[$key]['description'] = $description; 
        $key++;
    }
    echo json_encode($society); 

        mysqli_stmt_close($statement);

        mysqli_close($con);
    ?>

1 个答案:

答案 0 :(得分:1)

因此,根据与kmil的讨论,我们发现有两个主要问题。首先是代码的一部分,这个循环是:

ListView lv = (ListView) findViewById(R.id.ListView);
                List<ListViewItem> items = new ArrayList<>();
                for (int i=0; i <10; i++){
                items.add(new ListViewItem() {{
                    ThumbnailResource = R.drawable.test;
                    Title = returnedSociety.socName;
                    Subtitle = returnedSociety.socDes;
                }});
                CustomListViewAdapter adapter = new CustomListViewAdapter(SocietySearch.this, items);
                lv.setAdapter(adapter);}
            }

看到listview适配器不断重置 - 新的CustomListViewAdapter(...) 它被移动到for循环之外,只有在循环之后才被调用所有数据。其次是解析从数据库收到的数据,该数据是 JSONArray 。成功解析后,一切顺利。 :d