簡體   English   中英

ListView顯示相同的數據

[英]ListView displaying same data

我有一個很大的JSON數組。 我正在從JSON數組讀取數據並將其存儲在列表視圖中,但是列表視圖重復相同的數據。

即來自JSON的最后一個數據,而不是顯示所有數據。

這是我的代碼。

public class HistoryActivity extends AppCompatActivity {
private Toolbar toolbar;
String strServerResponse = null;
ProgressDialog nDialog;
Pojo pojo;
ArrayList<Pojo> history;
HistoryAdapter myAdapter;
ListView list;
public String date, inTime, outTime, inLat, inLong;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_history);
    toolbar = (Toolbar) findViewById(R.id.app_bar);
    toolbar.setTitle("History");
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    list = (ListView) findViewById(R.id.historyList);
    history = new ArrayList<Pojo>();
    new NetCheck().execute();

}

private class NetCheck extends AsyncTask<Void, Void, Void> {


    @Override
    protected void onPostExecute(Void result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);

        nDialog.dismiss();
        // TODO Auto-generated method stub
        myAdapter = new HistoryAdapter(HistoryActivity.this, history);
        list.setAdapter(myAdapter);
    }

    @Override
    protected Void doInBackground(Void... params) {
        // TODO Auto-generated method stub

        try {

            HttpClient httpClient = new DefaultHttpClient();

            HttpPost httpRequest = new HttpPost(

                    "http://myurl");
            httpRequest.setHeader("Content-Type", "application/json");
            SharedPreferences mmm = getSharedPreferences(
                    "MyPref", MODE_PRIVATE);

            String logempid = mmm.getString("id", null);

            JSONObject json = new JSONObject();

            json.put("empid", logempid);

            Log.e("JSON Object", json.toString());

            StringEntity se = new StringEntity(json.toString());

            se.setContentEncoding("UTF-8");
            se.setContentType("application/json");

            httpRequest.setEntity(se);
            HttpResponse httpRes = httpClient.execute(httpRequest);

            java.io.InputStream inputStream = httpRes.getEntity()
                    .getContent();
            InputStreamReader inputStreamReader = new InputStreamReader(
                    inputStream);

            BufferedReader reader = new BufferedReader(inputStreamReader);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            inputStream.close();
            strServerResponse = sb.toString();
            Log.e("Server Response", "" + strServerResponse.toString());

            if (strServerResponse != null) {
                try {

                    JSONArray arr = new JSONArray(strServerResponse);

                    for (int k = 0; k < arr.length(); k++) {

                        JSONObject jsonObj1 = arr.getJSONObject(k);

                        pojo = new Pojo();
                        date = jsonObj1.optString("login_date");
                        inTime = jsonObj1.optString("login_time");
                        outTime = jsonObj1.optString("logout_time");

                        Log.e("login time from server",""+inTime);
                        Log.e("login out from server",""+outTime);
                        Log.e("login date from server",""+date);
                        pojo.setDate(date);
                        pojo.setLoginTime(inTime);
                        pojo.setLogoutTime(outTime);

                        JSONArray subArrayLat = jsonObj1.getJSONArray("lati_long");
                        for (int i = 0; i < subArrayLat.length(); i++) {
                            String lat = subArrayLat.getJSONObject(i).getString("Latitude").toString();
                            String loong = subArrayLat.getJSONObject(i).getString("Longitude").toString();
                            Log.e("jsonarray lat", "" + lat);
                            Log.e("jsonarray longg", "" + loong);
                            pojo.setLat(lat);
                            pojo.setLong(loong);
                        }

                        history.add(pojo);
                    }

                } catch (JSONException e) {
                    e.printStackTrace();
               }
      }

這是適配器。

 public class HistoryAdapter extends BaseAdapter {
private Context activity;
TextView tv_date;
TextView tv_loginTime;
TextView tv_logoutTime;
TextView tv_details;
Pojo pojo;
ArrayList<Pojo> list;
private ArrayList<Pojo> arraylist = null;
public static LayoutInflater inflater;
private Context context;

public HistoryAdapter(Context context) {
    this.context = context;
}


public HistoryAdapter(Context a, ArrayList<Pojo> history) {
    // TODO Auto-generated constructor stub
    activity = a;
    list = history;
    inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    this.arraylist = new ArrayList<Pojo>();
    this.arraylist.addAll(list);

}

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

@Override
public Object getItem(int position) {
    // TODO Auto-generated method stub
    return list.get(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
    View v = convertView;


    v = inflater.inflate(R.layout.history_item, parent, false);
    pojo = list.get(position);
    tv_date = (TextView) v.findViewById(R.id.historyDate);
    tv_loginTime = (TextView) v.findViewById(R.id.historyLoginTime);
    tv_logoutTime = (TextView) v.findViewById(R.id.historyLogoutTime);
    tv_details = (TextView) v.findViewById(R.id.historyDetails);

    tv_date.setText(pojo.getDate());
    tv_loginTime.setText(pojo.getLoginTime());
    tv_logoutTime.setText(pojo.getLogoutTime());
    final String lat = pojo.getLat().toString();
    String longg = pojo.getLong().toString();
    Log.e("adapter latitude", "" + lat);
    Log.e("adapter longitude", "" + longg);
    tv_details.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i = new Intent(context, MapActivity.class);
            i.putExtra("lat", "" + lat);
            i.putExtra("longg", "+longg");
            context.startActivity(i);
        }
    });

    return v;

}

 }

這是JSON數據

[
  {
    "login_time": "10:30:28",
    "logout_time": "10:31:47",
    "login_date": "2015- 09-30",
    "lati_long": [
      {
        "date_time": "2015:09:30  11:14:53",
        "Latitude": "21.121776",
        "Longitude": "79.047563"
      },
      {
        "date_time": "2015:09:30 11:15:01",
        "Latitude": "21.121776",
        "Longitude": "79.047563"
      },
      {
        "date_time": "2015:09:30 11:15:15",
        "Latitude": "21.121776",
        "Longitude": "79.047563"
      },
      {
        "date_time": "2015:09:30 11:14:53",
        "Latitude": "21.121776",
        "Longitude": "79.047563"
      },
      {
        "date_time": "2015:09:30 11:15:01",
        "Latitude": "21.121776",
        "Longitude": "79.047563"
      },
      {
        "date_time": "2015:09:30 11:15:15",
        "Latitude": "21.121776",
        "Longitude": "79.047563"
      },
      {
        "date_time": "2015:09:30 11:15:52",
        "Latitude": "21.121776",
        "Longitude": "79.047563"
      },
      {
        "date_time": "2015:09:30 11:17:16",
        "Latitude": "21.121776",
        "Longitude": "79.047563"
      }
    ]
  },
  {
    "login_time": "10:42:56",
    "logout_time": "10:44:41",
    "login_date": "2015-09-30",
    "lati_long": [
      {
        "date_time": "2015:09:30 11:14:53",
        "Latitude": "21.121776",
        "Longitude": "79.047563"
      },
      {
        "date_time": "2015:09:30 11:15:01",
        "Latitude": "21.121776",
        "Longitude": "79.047563"
      },
      {
        "date_time": "2015:09:30 11:15:15",
        "Latitude": "21.121776",
        "Longitude": "79.047563"
      },
      {
        "date_time": "2015:09:30 11:14:53",
        "Latitude": "21.121776",
        "Longitude": "79.047563"
      },
      {
        "date_time": "2015:09:30 11:15:01",
        "Latitude": "21.121776",
        "Longitude": "79.047563"
      },
      {
        "date_time": "2015:09:30 11:15:15",
        "Latitude": "21.121776",
        "Longitude": "79.047563"
      },
      {
        "date_time": "2015:09:30 11:15:52",
        "Latitude": "21.121776",
        "Longitude": "79.047563"
      },
      {
        "date_time": "2015:09:30 11:17:16",
        "Latitude": "21.121776",
        "Longitude": "79.047563"
      },
      {
        "date_time": "2015:09:30 11:14:53",
        "Latitude": "21.121776",
        "Longitude": "79.047563"
      },
      {
        "date_time": "2015:09:30 11:15:01",
        "Latitude": "21.121776",
        "Longitude": "79.047563"
      },
      {
        "date_time": "2015:09:30 11:15:15",
        "Latitude": "21.121776",
        "Longitude": "79.047563"
      },
      {
        "date_time": "2015:09:30 11:14:53",
        "Latitude": "21.121776",
        "Longitude": "79.047563"
      },
      {
        "date_time": "2015:09:30 11:15:01",
        "Latitude": "21.121776",
        "Longitude": "79.047563"
      },
      {
        "date_time": "2015:09:30 11:15:15",
        "Latitude": "21.121776",
        "Longitude": "79.047563"
      },
      {
        "date_time": "2015:09:30 11:15:52",
        "Latitude": "21.121776",
        "Longitude": "79.047563"
      },
      {
        "date_time": "2015:09:30 11:17:16",
        "Latitude": "21.121776",
        "Longitude": "79.047563"
      }
    ]
  }
]

這里有什么問題嗎? 請幫我。

您已經聲明了CustomObject Pojo's變量是全局變量。 聲明為局部變量

for (int k = 0; k < arr.length(); k++) {

         JSONObject jsonObj1 = arr.getJSONObject(k);
         Pojo pojo = new Pojo();
         date = jsonObj1.optString("login_date");
         inTime = jsonObj1.optString("login_time");
         outTime = jsonObj1.optString("logout_time");

         Log.e("login time from server",""+inTime);
         Log.e("login out from server",""+outTime);
         Log.e("login date from server",""+date);
         pojo.setDate(date);
         pojo.setLoginTime(inTime);
         pojo.setLogoutTime(outTime);

         JSONArray subArrayLat = jsonObj1.getJSONArray("lati_long");
         for (int i = 0; i < subArrayLat.length(); i++) {
                 String lat = subArrayLat.getJSONObject(i).getString("Latitude").toString();
                 String loong = subArrayLat.getJSONObject(i).getString("Longitude").toString();
                 Log.e("jsonarray lat", "" + lat);
                 Log.e("jsonarray longg", "" + loong);
                 pojo.setLat(lat);
                 pojo.setLong(loong);
          }

         history.add(pojo);
}
pojo = new Pojo();

應該在for循環內聲明,例如Pojo pojo = new Pojo();

首先在這一行檢查myAdapter = new HistoryAdapter(HistoryActivity.this, history); 該歷史記錄具有正確的數據(不一樣,等等)。

其次,編輯適配器的getView函數

替換為:

View v = convertView;
v = inflater.inflate(R.layout.history_item, parent, false);

對此:

View v = convertView;
if(convertView == null) {
   v = inflater.inflate(R.layout.history_item, parent, false);
}

UPD:替換為:

 inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

對此:

inflater = LayoutInflater.from(a);

請關於結果回答

我發現了你的問題。

初始/外部JSONArray只有1個 JSONObject,如下所示

[
  { // object 1 start
    "login_time": "10:30:28",
    "logout_time": "10:31:47",
    "login_date": "2015- 09-30",
    "lati_long": [
      {
        "date_time": "2015:09:30  11:14:53",
        "Latitude": "21.121776",
        "Longitude": "79.047563"
      },
      {
        "date_time": "2015:09:30 11:15:01",
        "Latitude": "21.121776",
        "Longitude": "79.047563"
      },
      {
        "date_time": "2015:09:30 11:15:15",
        "Latitude": "21.121776",
        "Longitude": "79.047563"
      },
      {
        "date_time": "2015:09:30 11:14:53",
        "Latitude": "21.121776",
        "Longitude": "79.047563"
      },
      {
        "date_time": "2015:09:30 11:15:01",
        "Latitude": "21.121776",
        "Longitude": "79.047563"
      },
      {
        "date_time": "2015:09:30 11:15:15",
        "Latitude": "21.121776",
        "Longitude": "79.047563"
      },
      {
        "date_time": "2015:09:30 11:15:52",
        "Latitude": "21.121776",
        "Longitude": "79.047563"
      },
      {
        "date_time": "2015:09:30 11:17:16",
        "Latitude": "21.121776",
        "Longitude": "79.047563"
      }
    ]
  } // object 1 end
]

因此,你的for循環外面for (int k = 0; k < arr.length(); k++) {只調用一次,從而使你在列表視圖僅1個項目。

另外,下面列出了您僅看到最新的long和lat值的原因

for (int i = 0; i < subArrayLat.length(); i++) {
    String lat = subArrayLat.getJSONObject(i).getString("Latitude").toString();
    String loong = subArrayLat.getJSONObject(i).getString("Longitude").toString();
    Log.e("jsonarray lat", "" + lat);
    Log.e("jsonarray longg", "" + loong);

    // These two are called everytime but set the same pojo field
    // The result is that at the end of the loop, only the last set value is retained
    pojo.setLat(lat);
    pojo.setLong(loong);
}

因此,您有一個帶有最新long和lat值的pojo對象。

按照我想您要實現的目標,我將說說使用從解析服務器響應中的內部json數組獲得的“ sub” arraylist來填充您的列表視圖。

更新 -更具體的答案

在內部for循環內創建pojo

if (strServerResponse != null) {
    try {

    JSONArray arr = new JSONArray(strServerResponse);

    for (int k = 0; k < arr.length(); k++) {

        JSONObject jsonObj1 = arr.getJSONObject(k);

        // Comment these out:

        //1 pojo = new Pojo();
        date = jsonObj1.optString("login_date");
        inTime = jsonObj1.optString("login_time");
        outTime = jsonObj1.optString("logout_time");

        Log.e("login time from server",""+inTime);
        Log.e("login out from server",""+outTime);
        Log.e("login date from server",""+date);
        //2 pojo.setDate(date);
        //3 pojo.setLoginTime(inTime);
        //4 pojo.setLogoutTime(outTime);

        JSONArray subArrayLat = jsonObj1.getJSONArray("lati_long");
        for (int i = 0; i < subArrayLat.length(); i++) {

            // And put them here

            pojo = new Pojo();

            pojo.setDate(date);
            pojo.setLoginTime(inTime);
            pojo.setLogoutTime(outTime);

            String lat = subArrayLat.getJSONObject(i).getString("Latitude").toString();
            String loong = subArrayLat.getJSONObject(i).getString("Longitude").toString();
            Log.e("jsonarray lat", "" + lat);
            Log.e("jsonarray longg", "" + loong);
            pojo.setLat(lat);
            pojo.setLong(loong);

            // Same with this too
            history.add(pojo);
        }

        // history.add(pojo);
    }
}  

很少有適合您的情況的更改

第一 [Pojo班]

更改Pojo類定義以將緯度和經度存儲在列表中

class Pojo{
   List<String> lat;
   List<String> longi;

   private List<String> getLat(){
       return this.lat;
   }

   private List<String> getLongi(){
       return this.longi;  
   }

   private void setLat(List<String> lat){
     this.lat = lat;
   }

   private void setLongi(List<String> longi){
    this.longi = longi;

   }

第二 [循環邏輯]

List<String> lati = new ArrayList<String>();
List<String> longi = new ArrayList<String>();
  for (int i = 0; i < subArrayLat.length(); i++) {
         String lat = subArrayLat.getJSONObject(i).getString("Latitude").toString();
         String loong = subArrayLat.getJSONObject(i).getString("Longitude").toString();
         lati.add(lat);
         longi.add(loong);
   }
    pojo.setLat(lati);//adding latitude list
    pojo.setLongi(longi); //adding longitude list

第三 [內部getview]

通過以下方式訪問這些列表

List<String> lat = pojo.getLat();
List<String> longg = pojo.getLongi();

希望能幫助到你!

將此代碼放在您的getView()中

View v = convertView;
    ViewHolder holder;

    v = inflater.inflate(R.layout.history_item, parent, false);
    if(v==null)
    {
        holder=new ViewHolder();
        pojo = list.get(position);
        holder.date = (TextView) v.findViewById(R.id.historyDate);
        holder.logintime = (TextView) v.findViewById(R.id.historyLoginTime);
        holder.lougouttime = (TextView) v.findViewById(R.id.historyLogoutTime);
        holder.details = (TextView) v.findViewById(R.id.historyDetails);
        v.setTag(holder);
    }else{
        holder=(ViewHolder)v.getTag();
    }
    holder.date.setText(pojo.getDate());
    holder.logintime.setText(pojo.getLoginTime());
    holder.lougouttime.setText(pojo.getLogoutTime());
    final String lat = pojo.getLat().toString();
    String longg = pojo.getLong().toString();
    Log.e("adapter latitude", "" + lat);
    Log.e("adapter longitude", "" + longg);
    holder.details .setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent i = new Intent(context, MapActivity.class);
            i.putExtra("lat", "" + lat);
            i.putExtra("longg", "+longg");
            context.startActivity(i);
        }
    });

    return v;

視圖持有人類

protected  class ViewHolder{
        TextView date,logintime,lougouttime,details;

    }

將此粘貼到您的適配器類中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM