Android 如何使用onItemClick将特定值传递给新活动
我使用myIntent.putExtra(“name”),尝试了各种不同的方法;无法检索我在列表视图中单击的项目的“标记名称”。它打开新活动时不会出现问题,但传递的值为null。第二个活动与此活动几乎相同,因此我也不会将其放置。唯一的区别是我声明了多少个json节点,以及我想使用一个基于我从主活动中获取的类别名称的开关。因此,根据单击的内容,json将为数据使用不同的URL 我需要帮助计算如何传递按下的类别名称(TAG_name) 编辑:快速注释-下面的代码可以完美地使用url中提供的数据显示列表视图。另外,当点击并没有使用传递的数据(并且总是空的),而是使用一个静态url时,第二个活动的代码也像一个符咒一样工作。我唯一的问题是传递的变量Android 如何使用onItemClick将特定值传递给新活动,android,json,listview,Android,Json,Listview,我使用myIntent.putExtra(“name”),尝试了各种不同的方法;无法检索我在列表视图中单击的项目的“标记名称”。它打开新活动时不会出现问题,但传递的值为null。第二个活动与此活动几乎相同,因此我也不会将其放置。唯一的区别是我声明了多少个json节点,以及我想使用一个基于我从主活动中获取的类别名称的开关。因此,根据单击的内容,json将为数据使用不同的URL 我需要帮助计算如何传递按下的类别名称(TAG_name) 编辑:快速注释-下面的代码可以完美地使用url中提供的数据显示列
public class Main_activity extends ListActivity {
//URL to get JSON Array
private static String url = "http://localhost/category";
//JSON Node Names
private static final String CAT ="categories";
private static final String TAG_NAME = "name"; //copy-paste to other same static string variables
JSONArray categories = null;
private ArrayList<HashMap<String, String>> oslist;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
oslist = new ArrayList<HashMap<String, String>>();
new JSONParse().execute();
ListView lv = getListView();
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent myIntent = new Intent(view.getContext(), happy_products.class);
startActivityForResult(myIntent,0);
// display happy_products.class
}
});
}
private class JSONParse extends AsyncTask<Void, Void, Void> {
private ProgressDialog pDialog;
@Override
protected void onPreExecute() {
super.onPreExecute();
// Showing progress dialog
pDialog = new ProgressDialog(Main_happy.this);
pDialog.setMessage("Please wait...");
pDialog.setCancelable(false);
pDialog.show();
}
@Override
protected Void doInBackground(Void... args) {
// Creating service handler class instance
ServiceHandler sh = new ServiceHandler();
// Making a request to url and getting response
String jsonStr = sh.makeServiceCall(url, ServiceHandler.GET);
Log.d("Response: ", "> " + jsonStr);
if (jsonStr != null) {
try {
// Getting JSON from URL
JSONObject jsonObj = new JSONObject(jsonStr);
categories = jsonObj.getJSONArray(CAT);
for(int i = 0; i < categories.length(); i++){
JSONObject c = categories.getJSONObject(i);
// Storing JSON item in a Variable
String id = c.getString(TAG_ID);
String name = c.getString(TAG_NAME);
// Adding value HashMap key => value
HashMap<String, String> map = new HashMap<String, String>();
map.put(TAG_NAME, name);
oslist.add(map);
}
} catch (JSONException e) {
e.printStackTrace();
}
} else {
Log.e("ServiceHandler", "Couldn't get any data from the url");
}
return null;
}
@Override
protected void onPostExecute(Void r) {
super.onPostExecute(r);
// Dismiss the progress dialog
if (pDialog.isShowing())
pDialog.dismiss();
/**
* Updating parsed JSON data into ListView
* */
ListAdapter adapter = new SimpleAdapter(Main_happy.this, oslist,
R.layout.category_list,
new String[] {TAG_ID, TAG_NAME,TAG_UPDATE}, new int[] {R.id.id,R.id.name, R.id.lastUpdated});
setListAdapter(adapter);
}
}
}
公共类主活动扩展了ListActivity{
//获取JSON数组的URL
专用静态字符串url=”http://localhost/category";
//JSON节点名称
私有静态最终字符串CAT=“categories”;
私有静态最终字符串标记\u NAME=“NAME”;//复制粘贴到其他相同的静态字符串变量
JSONArray categories=null;
私人ArrayList oslist;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
oslist=newarraylist();
新建JSONParse().execute();
ListView lv=getListView();
lv.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、int位置、长id){
Intent myIntent=newintent(view.getContext(),happy_products.class);
startActivityForResult(myIntent,0);
//显示happy_products.class
}
});
}
私有类JSONParse扩展了异步任务{
私人对话;
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
//显示进度对话框
pDialog=newprogressdialog(Main\u happy.this);
setMessage(“请稍候…”);
pDialog.setCancelable(假);
pDialog.show();
}
@凌驾
受保护的Void doInBackground(Void…args){
//创建服务处理程序类实例
ServiceHandler sh=新的ServiceHandler();
//向url发出请求并获得响应
字符串jsonStr=sh.makeServiceCall(url,ServiceHandler.GET);
Log.d(“响应:”、“>”+jsonStr);
if(jsonStr!=null){
试一试{
//从URL获取JSON
JSONObject jsonObj=新的JSONObject(jsonStr);
categories=jsonObj.getJSONArray(CAT);
对于(int i=0;ivalue
HashMap=newHashMap();
地图放置(标签名称、名称);
添加(地图);
}
}捕获(JSONException e){
e、 printStackTrace();
}
}否则{
Log.e(“ServiceHandler”,“无法从url获取任何数据”);
}
返回null;
}
@凌驾
受保护的void onPostExecute(void r){
super.onPostExecute(r);
//关闭进度对话框
if(pDialog.isShowing())
pDialog.disclose();
/**
*将解析的JSON数据更新到ListView中
* */
ListAdapter=new SimpleAdapter(Main_.this,oslist,
R.布局。类别列表,
新字符串[]{TAG_ID,TAG_NAME,TAG_UPDATE},新int[]{R.ID.ID,R.ID.NAME,R.ID.lastUpdated});
setListAdapter(适配器);
}
}
}
根据第一条评论进行编辑:
可能是我用的钥匙不对。错误与返回的null值有关,因此doInBackground无法获取数据,因为url为null。
"
HashMap=(HashMap)lv.getItemAtPosition(位置);
字符串值=map.get(TAG_NAME);
"
06-11 13:10:24.191:E/AndroidRuntime(2173):java.lang.RuntimeException:执行doInBackground()时出错
06-11 13:10:24.191:E/AndroidRuntime(2173):在android.os.AsyncTask$3.done(AsyncTask.java:300)
06-11 13:10:24.191:E/AndroidRuntime(2173):在java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
06-11 13:10:24.191:E/AndroidRuntime(2173):位于java.util.concurrent.FutureTask.setException(FutureTask.java:222)
06-11 13:10:24.191:E/AndroidRuntime(2173):在java.util.concurrent.FutureTask.run(FutureTask.java:242)
06-11 13:10:24.191:E/AndroidRuntime(2173):在android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
06-11 13:10:24.191:E/AndroidRuntime(2173):位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
06-11 13:10:24.191:E/AndroidRuntime(2173):位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
06-11 13:10:24.191:E/AndroidRuntime(2173):在java.lang.Thread.run(Thread.java:841)
06-11 13:10:24.191:E/AndroidRuntime(2173):由以下原因引起:java.lang.NullPointerException
06-11 13:10:24.191:E/AndroidRuntime(2173):位于java.net.URI.parseURI(URI.java:353)
06-11 13:10:24.191:E/AndroidRuntime(2173):位于java.net.URI(URI.java:204)
06-11 13:10:24.191:E/AndroidRuntime(2173):在java.net.URI.create(URI.java:725)
06-11 13:10:24.191:E/AndroidRun
HashMap<String,String> map =(HashMap<String,String>)lv.getItemAtPosition(position);
String value = map.get(TAG_NAME);
06-11 13:10:24.191: E/AndroidRuntime(2173): java.lang.RuntimeException: An error occured while executing doInBackground()
06-11 13:10:24.191: E/AndroidRuntime(2173): at android.os.AsyncTask$3.done(AsyncTask.java:300)
06-11 13:10:24.191: E/AndroidRuntime(2173): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
06-11 13:10:24.191: E/AndroidRuntime(2173): at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
06-11 13:10:24.191: E/AndroidRuntime(2173): at java.util.concurrent.FutureTask.run(FutureTask.java:242)
06-11 13:10:24.191: E/AndroidRuntime(2173): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
06-11 13:10:24.191: E/AndroidRuntime(2173): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
06-11 13:10:24.191: E/AndroidRuntime(2173): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
06-11 13:10:24.191: E/AndroidRuntime(2173): at java.lang.Thread.run(Thread.java:841)
06-11 13:10:24.191: E/AndroidRuntime(2173): Caused by: java.lang.NullPointerException
06-11 13:10:24.191: E/AndroidRuntime(2173): at java.net.URI.parseURI(URI.java:353)
06-11 13:10:24.191: E/AndroidRuntime(2173): at java.net.URI.<init>(URI.java:204)
06-11 13:10:24.191: E/AndroidRuntime(2173): at java.net.URI.create(URI.java:725)
06-11 13:10:24.191: E/AndroidRuntime(2173): at org.apache.http.client.methods.HttpGet.<init>(HttpGet.java:75)
06-11 13:10:24.191: E/AndroidRuntime(2173): at apphap.ServiceHandler.makeServiceCall(ServiceHandler.java:68)
06-11 13:10:24.191: E/AndroidRuntime(2173): at apphap.ServiceHandler.makeServiceCall(ServiceHandler.java:34)
06-11 13:10:24.191: E/AndroidRuntime(2173): at apphap._products$JSONParse.doInBackground(_products.java:76)
06-11 13:10:24.191: E/AndroidRuntime(2173): at apphap._products$JSONParse.doInBackground(_products.java:1)
06-11 13:10:24.191: E/AndroidRuntime(2173): at android.os.AsyncTask$2.call(AsyncTask.java:288)
06-11 13:10:24.191: E/AndroidRuntime(2173): at java.util.concurrent.FutureTask.run(FutureTask.java:237)