![](/img/trans.png)
[英]Same data displaying in Listview using custom adapterview from the sqlite
[英]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.