在JSON ListView

时间:2016-09-25 12:27:29

标签: android mysql json listview

我有一个自定义ListView通过JSON从Mysql数据库中检索数据,但问题是列表视图只重复显示一个条目。 我该如何解决这个问题?

这是我的代码

package com.example.monsterking.blood;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.widget.SwipeRefreshLayout;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;


public class all_donors extends Fragment {

String myJSON;
private ProgressDialog pDialog;
private static final String TAG_RESULTS = "result";
private static final String TAG_NAME = "Name";
private static final String TAG_BLOOD = "Blood";
private static final String TAG_AREA = "Area";
private static final String TAG_MOBILE = "Mobile";
private static final String TAG_LASTDONATED = "LastDonated";
private static final String TAG_EMAIL = "Email";
private static final String TAG_GENDER = "Gender";
private static final String TAG_DISTRICT = "District";

Button call;
SwipeRefreshLayout mSwipeRefreshLayout;

JSONArray donors = null;

ArrayList<HashMap<String, String>> donorList;
HashMap<String, String> persons = new HashMap<String, String>();
ListView list;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View myFragmentView = inflater.inflate(R.layout.activity_all_donors, container, false);

    list = (ListView) myFragmentView.findViewById(R.id.listViewAll);


    donorList = new ArrayList<HashMap<String, String>>();


    mSwipeRefreshLayout = (SwipeRefreshLayout) myFragmentView.findViewById(R.id.swifeRefresh);
    mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {

            getData();


        }
    });


    return myFragmentView;

}


protected void showList() {
    if (TAG_RESULTS != null) {
        donorList.clear();
        try {
            JSONObject jsonObj = new JSONObject(myJSON);
            donors = jsonObj.getJSONArray(TAG_RESULTS);

            for (int i = 0; i < donors.length(); i++) {
                JSONObject c = donors.getJSONObject(i);
                String Name = c.getString(TAG_NAME);
                String Blood = c.getString(TAG_BLOOD);
                String Area = c.getString(TAG_AREA);
                String Mobile = c.getString(TAG_MOBILE);
                String LastDonated = c.getString(TAG_LASTDONATED);
                String Email = c.getString(TAG_EMAIL);
                String District = c.getString(TAG_DISTRICT);
                String Gender = c.getString(TAG_GENDER);


                persons.put(TAG_NAME, Name);
                persons.put(TAG_BLOOD, Blood);
                persons.put(TAG_AREA, Area);
                persons.put(TAG_MOBILE, Mobile);
                persons.put(TAG_LASTDONATED, LastDonated);
                persons.put(TAG_EMAIL, Email);
                persons.put(TAG_DISTRICT, District);
                persons.put(TAG_GENDER, Gender);
                donorList.add(persons);


            }



        } catch (JSONException e) {
            e.printStackTrace();
        }
    } else {
        // stopping swipe refresh
        mSwipeRefreshLayout.setRefreshing(false);
        Log.e("ServiceHandler", "Couldn't get any data from the url");
    }

}

public void getData() {
    class GetDataJSON extends AsyncTask<String, Void, String> {

        /**
         * Before starting background thread Show Progress Dialog
         * */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(all_donors.this.getActivity());
            pDialog.setMessage("Loading. Please wait...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }

        @Override
        protected String doInBackground(String... params) {


            DefaultHttpClient httpclient = new DefaultHttpClient(new BasicHttpParams());
            HttpPost httppost = new HttpPost("http://monsterking.hol.es/fetchAll.php");

            // Depends on your web service
            httppost.setHeader("Content-type", "application/json");

            InputStream inputStream = null;
            String result = null;


            try {

                HttpResponse response = httpclient.execute(httppost);

                HttpEntity entity = response.getEntity();

                inputStream = entity.getContent();
                // json is UTF-8 by default
                BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8);
                StringBuilder sb = new StringBuilder();

                String line = null;
                while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
                }

                result = sb.toString();
            } catch (Exception e) {
                // Oops
            } finally {
                try {
                    if (inputStream != null) inputStream.close();
                } catch (Exception squish) {
                }
            }
            return result;
        }

        @Override
        protected void onPostExecute(String result) {
            pDialog.dismiss();
            myJSON = result;
            showList();
            mSwipeRefreshLayout.setRefreshing(false);
            list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                public void onItemClick(AdapterView<?> parent, View view,
                                        int position, long id) {


                    // Launching new Activity on selecting single List Item
                    Intent i = new Intent(getActivity().getApplicationContext(), donor_details.class);
                    // sending data to new activity

                    startActivity(i);


                }
            });

            CustomAdapter cus = new CustomAdapter(all_donors.this.getActivity(), donorList);
            list.setAdapter(cus);
        }

    }
    GetDataJSON g = new GetDataJSON();
    g.execute();
}

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
        getData();
    } else {
        // fragment is no longer visible
    }
}

public class CustomAdapter extends BaseAdapter {
    LayoutInflater mInlfater;
    ArrayList<HashMap<String, String>> donorList ;

    public CustomAdapter(Context context, ArrayList<HashMap<String, String>> donorList) {
        mInlfater = LayoutInflater.from(context);
        this.donorList = donorList;

    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return donorList.size();
    }

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

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        ViewHolder holder;
        if (convertView == null) {
            convertView = mInlfater.inflate(R.layout.donor_list, null);
            holder = new ViewHolder();

            holder.call = (Button) convertView.findViewById(R.id.listcall);
            holder.name = (TextView)convertView.findViewById(R.id.name);
            holder.blood = (TextView)convertView.findViewById(R.id.blood);
            holder.area = (TextView)convertView.findViewById(R.id.area);
            convertView.setTag(holder);

        } else {
            holder = (ViewHolder) convertView.getTag();
        }


        HashMap<String,String> map = donorList.get(position);
        holder.name.setText(map.get(TAG_NAME));
        holder.blood.setText(map.get(TAG_BLOOD));
        holder.area.setText(map.get(TAG_AREA));


        holder.call.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent i = new Intent(getActivity().getApplicationContext(), login.class);
                startActivity(i);
            }
        });
        return convertView;
    }

    private class ViewHolder {
        Button call;
        TextView name,blood,area;
        }
    }

}

以下是输出

enter image description here

3 个答案:

答案 0 :(得分:0)

在showList方法中,在start中添加persons = new HashMap<String, String>() for循环。

答案 1 :(得分:0)

修改你的showList方法,如下所示

protected void showList() {
    if (TAG_RESULTS != null) {
        donorList.clear();
        try {
            JSONObject jsonObj = new JSONObject(myJSON);
            donors = jsonObj.getJSONArray(TAG_RESULTS);

            for (int i = 0; i < donors.length(); i++) {
                JSONObject c = donors.getJSONObject(i);
                String Name = c.getString(TAG_NAME);
                String Blood = c.getString(TAG_BLOOD);
                String Area = c.getString(TAG_AREA);
                String Mobile = c.getString(TAG_MOBILE);
                String LastDonated = c.getString(TAG_LASTDONATED);
                String Email = c.getString(TAG_EMAIL);
                String District = c.getString(TAG_DISTRICT);
                String Gender = c.getString(TAG_GENDER);

                persons = new HashMap<String, String>();
                persons.put(TAG_NAME, Name);
                persons.put(TAG_BLOOD, Blood);
                persons.put(TAG_AREA, Area);
                persons.put(TAG_MOBILE, Mobile);
                persons.put(TAG_LASTDONATED, LastDonated);
                persons.put(TAG_EMAIL, Email);
                persons.put(TAG_DISTRICT, District);
                persons.put(TAG_GENDER, Gender);
                donorList.add(persons);


            }



        } catch (JSONException e) {
            e.printStackTrace();
        }
    } else {
        // stopping swipe refresh
        mSwipeRefreshLayout.setRefreshing(false);
        Log.e("ServiceHandler", "Couldn't get any data from the url");
    }

}

答案 2 :(得分:0)

关于功能

@Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return position;
    }
你正在回归这个职位 我不会认为这是你的问题..但是你应该返回&#39; donorList.get(position);&#39;