Android ListView适配器在单击时显示最后一项
我的ListView适配器有问题,所有内容都通过json解析到列表视图中,但当我单击ListView时,它总是显示ListView中最后解析的json的结果 这是我的第一堂课叫乔布斯:Android ListView适配器在单击时显示最后一项,android,android-listview,Android,Android Listview,我的ListView适配器有问题,所有内容都通过json解析到列表视图中,但当我单击ListView时,它总是显示ListView中最后解析的json的结果 这是我的第一堂课叫乔布斯: public class Jobs extends ListActivity { // JSON Node names private static final String jobs = "jobs"; private static final String job = "job"; private sta
public class Jobs extends ListActivity {
// JSON Node names
private static final String jobs = "jobs";
private static final String job = "job";
private static final String pays = "pays";
private static final String ready_at = "ready_at";
private static final String due_by = "due_by";
private static final String customer_reference = "customer_reference";
private static final String pieces = "pieces";
private static final String weight = "weight";
private static final String pickup_name = "pickup_name";
private static final String pickup_addr1 = "pickup_addr1";
private static final String pickup_city = "pickup_city";
private static final String pickup_state = "pickup_state";
private static final String pickup_zip_postal = "pickup_zip_postal";
private static final String deliver_name = "deliver_name";
private static final String deliver_addr1 = "deliver_addr1";
private static final String deliver_city = "deliver_city";
private static final String deliver_state = "deliver_state";
private static final String deliver_zip_postal = "deliver_zip_postal";
private static final String signature_required = "signature_required";
private static final String pickup_to_see = "pickup_to_see";
private static final String pickup_room = "pickup_room";
private static final String pickup_phone = "pickup_phone";
private static final String deliver_to_see = "deliver_to_see";
private static final String deliver_room = "deliver_room";
private static final String pickup_special_instr = "pickup_special_instr";
private static final String deliver_special_instr = "deliver_special_instr";
private static final String deliver_phone = "deliver_phone";
String JOB, PAYS, READY_AT, DUE_BY, CUSTOMER_REFERENCE, PIECES, WEIGHT, PICKUP_NAME, PICKUP_ADDR1, PICKUP_CITY, PICKUP_STATE,
PICKUP_ZIP_POSTAL, DELIVER_NAME, DELIVER_ADDR1, DELIVER_CITY, DELIVER_STATE, DELIVER_ZIP_POSTAL, SIGNATURE_REQUIRED,
PICKUP_TO_SEE, PICKUP_ROOM, PICKUP_PHONE, DELIVER_TO_SEE, DELIVER_ROOM, PICKUP_SPECIAL_INSTR, DELIVER_SPECIAL_INSTR,
DELIVER_PHONE;
// Strings
String username, password, firstName, lastName, lastLatitudeUpdate, dvrcheckin, dvrScheduleToWork, dvrStartTime, jobs_assigned;
int checkedin, Minute, Hour, Minutedvr, Hourdvr, status;
Vibrator vib;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.jobs);
vib = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
new ParseJobs().execute();
TextView assigned = (TextView) findViewById(R.id.assigned);
if (jobs_assigned.matches("0")){
assigned.setText("You have no jobs assigned");
} else {
assigned.setVisibility(View.GONE);
}
// selecting single ListView item
ListView lv = getListView();
// Launching new screen on Selecting Single ListItem
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long ide) {
vib.vibrate(40);
// Starting new intent
Intent in = new Intent(getApplicationContext(),
SingleMenuItemActivity.class);
in.putExtra(pays, PAYS);
in.putExtra(job, JOB);
in.putExtra(ready_at, READY_AT);
in.putExtra(due_by, DUE_BY);
in.putExtra(customer_reference, CUSTOMER_REFERENCE);
in.putExtra(pieces, PIECES);
in.putExtra(weight, WEIGHT);
in.putExtra(pickup_name, PICKUP_NAME);
in.putExtra(pickup_addr1, PICKUP_ADDR1);
in.putExtra(pickup_city, PICKUP_CITY);
in.putExtra(pickup_state, PICKUP_STATE);
in.putExtra(pickup_zip_postal, PICKUP_ZIP_POSTAL);
in.putExtra(deliver_name, DELIVER_NAME);
in.putExtra(deliver_addr1, DELIVER_ADDR1);
in.putExtra(deliver_city, DELIVER_CITY);
in.putExtra(deliver_state, DELIVER_STATE);
in.putExtra(deliver_zip_postal, DELIVER_ZIP_POSTAL);
in.putExtra(signature_required, SIGNATURE_REQUIRED);
in.putExtra(pickup_to_see, PICKUP_TO_SEE);
in.putExtra(pickup_room, PICKUP_ROOM);
in.putExtra(pickup_phone, PICKUP_PHONE);
in.putExtra(deliver_to_see, DELIVER_TO_SEE);
in.putExtra(deliver_room, DELIVER_ROOM);
in.putExtra(pickup_special_instr, PICKUP_SPECIAL_INSTR);
in.putExtra(deliver_special_instr, DELIVER_SPECIAL_INSTR);
in.putExtra(deliver_phone, DELIVER_PHONE);
startActivity(in);
Jobs.this.overridePendingTransition(R.anim.fadein, R.anim.fadeout);
}
});
}
public class ParseJobs extends AsyncTask<Void, Void, Void> {
// Hashmap for ListView
ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>();
// contacts JSONArray
JSONArray JOBS;
ProgressDialog VerifyDriver;
@Override
protected void onPreExecute() {
VerifyDriver = ProgressDialog.show(Jobs.this, "Getting Your Jobs", "Loading Data... Please Wait...");
WindowManager.LayoutParams lp = VerifyDriver.getWindow().getAttributes();
VerifyDriver.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
lp.dimAmount = .65f;
VerifyDriver.getWindow().setAttributes(lp);
Intent i = getIntent();
username = i.getExtras().getString("uid");
password = i.getExtras().getString("pwd");
firstName = i.getExtras().getString("firstName");
lastName = i.getExtras().getString("lastName");
lastLatitudeUpdate = i.getExtras().getString("lastLatitudeUpdate");
Minute = i.getExtras().getInt("Minute");
Hour = i.getExtras().getInt("Hour");
dvrcheckin = i.getExtras().getString("check-in");
Hourdvr = i.getExtras().getInt("Hourdvr");
Minutedvr = i.getExtras().getInt("Minutedvr");
status = i.getExtras().getInt("status");
dvrScheduleToWork = i.getExtras().getString("dvrScheduleToWork");
dvrStartTime = i.getExtras().getString("dvrStartTime");
jobs_assigned = i.getExtras().getString("jobs_assigned");
}
@Override
protected Void doInBackground(Void... params) {
// getting JSON string from URL
JSONObject json = JSONfunction.getJSONfromURL("http://www.jetdelivery.com/mobile/api/getresourcestatus/?type=json&uid=" + (username) + "&pwd=" + (password));
try {
// Getting Array of Contacts
JOBS = json.getJSONArray(jobs);
// looping through All Contacts
for (int i1 = 0; i1 < JOBS.length(); i1++) {
JSONObject c = JOBS.getJSONObject(i1);
// Storing each json item in variable
JOB = c.getString(job);
PAYS = c.getString(pays);
READY_AT = c.getString(ready_at);
DUE_BY = c.getString(due_by);
DELIVER_PHONE = c.getString(deliver_phone);
PIECES = c.getString(pieces);
WEIGHT = c.getString(weight);
PICKUP_NAME = c.getString(pickup_name);
PICKUP_ADDR1 = c.getString(pickup_addr1);
PICKUP_CITY = c.getString(pickup_city);
PICKUP_STATE = c.getString(pickup_state);
PICKUP_ZIP_POSTAL = c.getString(pickup_zip_postal);
DELIVER_NAME = c.getString(deliver_name);
DELIVER_ADDR1 = c.getString(deliver_addr1);
DELIVER_CITY = c.getString(deliver_city);
DELIVER_STATE = c.getString(deliver_state);
DELIVER_ZIP_POSTAL = c.getString(deliver_zip_postal);
SIGNATURE_REQUIRED = c.getString(signature_required);
PICKUP_TO_SEE = c.getString(pickup_to_see);
PICKUP_ROOM = c.getString(pickup_room);
PICKUP_PHONE = c.getString(pickup_phone);
DELIVER_TO_SEE = c.getString(deliver_to_see);
DELIVER_ROOM = c.getString(deliver_room);
PICKUP_SPECIAL_INSTR = c.getString(pickup_special_instr);
DELIVER_SPECIAL_INSTR = c.getString(deliver_special_instr);
CUSTOMER_REFERENCE = c.getString(customer_reference);
// creating new HashMap
HashMap<String, String> map = new HashMap<String, String>();
// adding each child node to HashMap key => value
map.put(job, JOB);
map.put(pays, PAYS);
map.put(ready_at, READY_AT);
// map.put(weight, mobile);
// adding HashList to ArrayList
contactList.add(map);
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
WindowManager.LayoutParams params = getWindow().getAttributes();
Jobs.this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
params.x = 0;
params.height = 520;
params.width = 480;
params.y = 200;
params.dimAmount = .70f;
Jobs.this.getWindow().setAttributes(params);
/** Updating parsed JSON data into ListView */
ListAdapter adapter = new SimpleAdapter(Jobs.this, contactList, R.layout.list_item, new String[] { job, pays, ready_at }, new int[] { R.id.job1, R.id.pays1, R.id.ready_at1 });
setListAdapter(adapter);
VerifyDriver.dismiss();
}
}
@Override
protected void onResume() {
super.onResume();
Jobs.this.overridePendingTransition(R.anim.fadein, R.anim.fadeout);
}
@Override
protected void onPause() {
super.onPause();
Jobs.this.overridePendingTransition(R.anim.fadein, R.anim.fadeout);
}
@Override
public void onBackPressed() {
vib.vibrate(40);
// Send username and password strings into screen1 class
Intent i = new Intent(Jobs.this, screen1.class);
i.putExtra("uid", username);
i.putExtra("pwd", password);
i.putExtra("Minute", Minute);
i.putExtra("Hour", Hour);
i.putExtra("firstName", firstName);
i.putExtra("lastName", lastName);
i.putExtra("check-in", dvrcheckin);
i.putExtra("Hourdvr", Hourdvr);
i.putExtra("Minutedvr", Minutedvr);
i.putExtra("status", status);
i.putExtra("lastLatitudeUpdate", lastLatitudeUpdate);
i.putExtra("dvrScheduleToWork", dvrScheduleToWork);
i.putExtra("dvrStartTime", dvrStartTime);
i.putExtra("jobs_assigned", jobs_assigned);
Jobs.this.finish();
startActivity(i);
Jobs.this.overridePendingTransition(R.anim.fadein, R.anim.fadeout);
}
@Override
protected void onRestart() {
super.onRestart();
Intent i = new Intent(this, AgentPortalActivity.class);
startActivity(i);
Jobs.this.overridePendingTransition(R.anim.fadein, R.anim.fadeout);
}
}
您的
侦听器似乎有问题。您输入的意图将发送到显示您的信息的活动(SingleMenuItemActivity
)。在onItemClick()
方法中,一个位置被传递给它。该位置是用户在ListView中选择的索引。您似乎只是在传递字符串中存储的任何值。问题是,您发送到intent的字符串(作业、工资、就绪时间、到期时间等)被设置为最后一个,因为这是创建的最后一个视图。试一试
Object j = lv.getAdapter().getItem(position);
(其中object是项的任何数据类型)并从中获取字符串值
编辑:更详细的细分
在进一步检查代码之后,我看到了一个易于实现的解决方案。在doInBackground方法中,将每个字符串设置为从JSONArray获得的任何字符串。由于您通过intent发送这些字符串,因此最终将得到下载和映射的最后一个作业。我的建议是:将JSONArray作业声明为JOBS类中的字段变量。在这里,内部异步类和整个Jobs类都可以访问它。现在,将您的侦听器更改为:
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long ide) {
vib.vibrate(40);
// Starting new intent
try {
Intent in = new Intent(getApplicationContext(),
SingleMenuItemActivity.class);
in.putExtra("jobInfo", JOBS.getJSONObject(position).toString());
startActivity(in);
Jobs.this.overridePendingTransition(R.anim.fadein, R.anim.fadeout);
} catch (Exception e) {
e.printStackTrace();
}
}
});
现在,您可以使用JSONObject方法直接访问数据,而不是从intent获取数据并将其存储在字符串变量中,然后使用这些字符串变量设置文本视图(顺便说一句,无论您如何操作,都可以省略整个字符串变量步骤)
myTextView.setText(intent.getStringExtra("nameOfString"))
比如,在您的代码中,它将是:
trackno.setText(in.getStringExtra(job)).
而不是将字符串赋给变量,然后用变量设置它。这样可以减少内存使用和中间人的额外成本。)
这应该可以解决你的问题。我能问一下,为什么你要发送20多个额外的而不是作为一个对象传递它们吗?我对开发应用程序的知识仍然非常有限。我正在学习到的东西。你应该看看Parcelable
界面。这将允许您传递对象
,而不必单独传递每个属性。这里有一个链接可以帮助你:你能帮我把它再细分一点吗?这里有一些我会做的来解决你的问题,还有一些关于编码技巧的建议。我很抱歉花了一段时间才回复你。没有必要道歉,尤其是当你是帮助我的人的时候。我试过你的建议,“intent.getString(“nameOfString”)”,但是字符串总是乱七八糟地返回给我(它在屏幕上显示未分析的数据)哦,等等,我有个错误。对不起,修好了。您仍然在向intent传递单个字符串,还是在传递JSON字符串?我现在只传递JSON字符串,已经放弃了intent。因此,到目前为止,我所做的是1)让我的JSONArray工作;全球可访问。2) 通过传入“jobInfo”JSONObject并在接收端获取JSONObject,做出了一个新的意图。3) 将文本视图设置为in.getStringExtra(READY_AT))等。。。我很快就会发布日志。谢谢你帮我解决了斯库达!你能解释一下我该如何着手解决这个问题吗?我尝试了skUDA的建议,但我认为还缺少一些步骤。
myJsonJob = new JSONObject(getIntent().getStringExtra("jobInfo"));
myTextView.setText(intent.getStringExtra("nameOfString"))
trackno.setText(in.getStringExtra(job)).