如何使用来自不同 xml 布局文件的列表视图
How to use listview from different xml layout file
我正在研究 android ListView,我正在获取一个 issue.I 创建一个列表视图到 XML 文件 installation.xml,我想将该列表视图用于我的 Searchdata.java。所以基本上我想要的是,当我点击 searchdata 按钮 时,数据是从网络服务中获取的,解析后,当我点击 [=25] 时,它会保存到 listview.and =] 安装视图 按钮比新的 window 将出现在我可以看到列表数据的地方。
SearchData.java
public class SearchData extends Activity {
EditText Keyword;
JSONParser jsonparser = new JSONParser();
ListView Datalist;
HorizontalScrollView VideoDatalist;
ArrayList<HashMap<String, String>> DataList;
ArrayList<HashMap<String, String>> VideoDataList;
JSONArray contacts = null;
private ProgressDialog pDialog;
ImageButton searchdata,InstallationView;
String Keyvalue = new String();
private static final String TAG_InnerText = "InnerText";
private static final String TAG_Title = "Title";
private static final String TAG_URL = "URL";
private static final String TAG_VIDEO_URL = "URL";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search_data);
InstallationView=(ImageButton)findViewById(R.id.InstallationView);
Keyword = (EditText) findViewById(R.id.KeyData);
Datalist=(ListView)findViewById(R.layout.activity_installation);
VideoDatalist=(HorizontalScrollView)findViewById(R.id.Horizontallist);
searchdata=(ImageButton)findViewById(R.id.searchicon);
String Keyvalue = new String();
DataList = new ArrayList<HashMap<String, String>>();
VideoDataList = new ArrayList<HashMap<String, String>>();
searchdata.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
new ReadData().execute();
}
});
InstallationView.setOnClickListener(new View.OnClickListener(){
public void onClick(View v)
{
startActivity(new Intent(SearchData.this, Installation.class));
}
});
}
public class ReadData extends AsyncTask<Void, Void, Void>
{
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(SearchData.this);
pDialog.setMessage("Please wait...");
pDialog.setCancelable(false);
pDialog.show();
}
protected Void doInBackground(Void... arg0) {
try{
Keyvalue=Keyword.getText().toString();
String Jsonstr = jsonparser.makeHttpRequest("http://10.47.93.26:8080/Search/api/Search/"+Keyvalue);
try {
if (Jsonstr != null) {
JSONArray jsonObj = new JSONArray (Jsonstr);
for (int i = 0; i < jsonObj.length(); i++) {
JSONObject c = jsonObj.getJSONObject(i);
String name = c.optString(TAG_Title);
String url = c.optString(TAG_URL);
HashMap<String, String> info = new HashMap<String, String>();
if( !name.isEmpty() )
{
info.put(TAG_Title, name);
}
else
{
info.put(TAG_Title,"User Manual");
}
if(url.contains("youtube"))
{
info.put(TAG_URL, url);
VideoDataList.add(info);
}
else
{
info.put(TAG_URL, url);
DataList.add(info);
}
}
}
else {
Log.e("ServiceHandler", "Couldn't get any data from the url");
}
}
catch (JSONException e) {
e.printStackTrace();
}
}
catch(Exception ex)
{
ex.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
if (pDialog.isShowing())
pDialog.dismiss();
SimpleAdapter adapter = new SimpleAdapter(
SearchData.this, DataList,
R.layout.list_item, new String[]
{
TAG_Title
}, new int[] {
R.id.InnerText });
Datalist.setAdapter(adapter);
}
}
}
Web 服务 运行 并且解析代码 运行 正确。我在 post 方法中遇到错误,所以你能帮我解决这个问题吗?
错误
在您的 SearchData Activity
的 onCreate(...)
方法中,以下永远不会工作,并且将始终 return 'null'(因此您的 NullPointerException)...
Datalist=(ListView)findViewById(R.layout.activity_installation);
调用 findViewById(...)
仅适用于调用 setContentView(...)
时已膨胀的任何 UI 元素。在这种情况下,您使用 R.layout.activity_search_data
作为您的布局文件,它不包含 ID 为 R.layout.activity_installation
的 ListView
,顺便说一下,这是布局文件的资源 ID,而不是UI 元素的资源 ID。
您可以做您需要做的事情的唯一方法是将您的数据作为额外内容放入您调用时使用的 Intent
...
startActivity(new Intent(SearchData.this, Installation.class));
...创建安装 Activity
后,它将需要获取数据并创建自己的适配器。
编辑:HashMap
是 Serializable
并且可以作为 Intent
额外传递。按如下方式传递您的 DataList HashMap
...
Intent i = new Intent(SearchData.this, Installation.class);
i.putExtra("data_list", DataList);
startActivity(i);
在安装中 Activity
然后你可以使用...
getIntent().getSerializableExtra("data_list");
在 onClick() 方法中调用您的安装 activity:
并通过 Intent 传递 ArrayList 数据,
InstallationView.setOnClickListener(new View.OnClickListener(){
public void onClick(View v)
{
Intent intent= new Intent(SearchData.this, Installation.class);
intent.putParcelableArrayListExtra("HASH_MAP",DataList);
startActivity(intent);
}
});
在您的安装 activity class 中,在 onCreate() 中设置视图并从 xml 文件初始化列表视图:
setContentView(R.layout.activity_installation);
ListView listView = (ListView)findViwById(R.id.listview);
并尝试从意图中获取数据:
ArrayList<HashMap<String,String>> hashmap_dataList = getIntent.getParcelableArrayListExtra("HASH_MAP");
然后用 listview 和 hashmap 做任何你想做的事。
我正在研究 android ListView,我正在获取一个 issue.I 创建一个列表视图到 XML 文件 installation.xml,我想将该列表视图用于我的 Searchdata.java。所以基本上我想要的是,当我点击 searchdata 按钮 时,数据是从网络服务中获取的,解析后,当我点击 [=25] 时,它会保存到 listview.and =] 安装视图 按钮比新的 window 将出现在我可以看到列表数据的地方。
SearchData.java
public class SearchData extends Activity {
EditText Keyword;
JSONParser jsonparser = new JSONParser();
ListView Datalist;
HorizontalScrollView VideoDatalist;
ArrayList<HashMap<String, String>> DataList;
ArrayList<HashMap<String, String>> VideoDataList;
JSONArray contacts = null;
private ProgressDialog pDialog;
ImageButton searchdata,InstallationView;
String Keyvalue = new String();
private static final String TAG_InnerText = "InnerText";
private static final String TAG_Title = "Title";
private static final String TAG_URL = "URL";
private static final String TAG_VIDEO_URL = "URL";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search_data);
InstallationView=(ImageButton)findViewById(R.id.InstallationView);
Keyword = (EditText) findViewById(R.id.KeyData);
Datalist=(ListView)findViewById(R.layout.activity_installation);
VideoDatalist=(HorizontalScrollView)findViewById(R.id.Horizontallist);
searchdata=(ImageButton)findViewById(R.id.searchicon);
String Keyvalue = new String();
DataList = new ArrayList<HashMap<String, String>>();
VideoDataList = new ArrayList<HashMap<String, String>>();
searchdata.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
new ReadData().execute();
}
});
InstallationView.setOnClickListener(new View.OnClickListener(){
public void onClick(View v)
{
startActivity(new Intent(SearchData.this, Installation.class));
}
});
}
public class ReadData extends AsyncTask<Void, Void, Void>
{
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(SearchData.this);
pDialog.setMessage("Please wait...");
pDialog.setCancelable(false);
pDialog.show();
}
protected Void doInBackground(Void... arg0) {
try{
Keyvalue=Keyword.getText().toString();
String Jsonstr = jsonparser.makeHttpRequest("http://10.47.93.26:8080/Search/api/Search/"+Keyvalue);
try {
if (Jsonstr != null) {
JSONArray jsonObj = new JSONArray (Jsonstr);
for (int i = 0; i < jsonObj.length(); i++) {
JSONObject c = jsonObj.getJSONObject(i);
String name = c.optString(TAG_Title);
String url = c.optString(TAG_URL);
HashMap<String, String> info = new HashMap<String, String>();
if( !name.isEmpty() )
{
info.put(TAG_Title, name);
}
else
{
info.put(TAG_Title,"User Manual");
}
if(url.contains("youtube"))
{
info.put(TAG_URL, url);
VideoDataList.add(info);
}
else
{
info.put(TAG_URL, url);
DataList.add(info);
}
}
}
else {
Log.e("ServiceHandler", "Couldn't get any data from the url");
}
}
catch (JSONException e) {
e.printStackTrace();
}
}
catch(Exception ex)
{
ex.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
if (pDialog.isShowing())
pDialog.dismiss();
SimpleAdapter adapter = new SimpleAdapter(
SearchData.this, DataList,
R.layout.list_item, new String[]
{
TAG_Title
}, new int[] {
R.id.InnerText });
Datalist.setAdapter(adapter);
}
}
}
Web 服务 运行 并且解析代码 运行 正确。我在 post 方法中遇到错误,所以你能帮我解决这个问题吗?
错误
在您的 SearchData Activity
的 onCreate(...)
方法中,以下永远不会工作,并且将始终 return 'null'(因此您的 NullPointerException)...
Datalist=(ListView)findViewById(R.layout.activity_installation);
调用 findViewById(...)
仅适用于调用 setContentView(...)
时已膨胀的任何 UI 元素。在这种情况下,您使用 R.layout.activity_search_data
作为您的布局文件,它不包含 ID 为 R.layout.activity_installation
的 ListView
,顺便说一下,这是布局文件的资源 ID,而不是UI 元素的资源 ID。
您可以做您需要做的事情的唯一方法是将您的数据作为额外内容放入您调用时使用的 Intent
...
startActivity(new Intent(SearchData.this, Installation.class));
...创建安装 Activity
后,它将需要获取数据并创建自己的适配器。
编辑:HashMap
是 Serializable
并且可以作为 Intent
额外传递。按如下方式传递您的 DataList HashMap
...
Intent i = new Intent(SearchData.this, Installation.class);
i.putExtra("data_list", DataList);
startActivity(i);
在安装中 Activity
然后你可以使用...
getIntent().getSerializableExtra("data_list");
在 onClick() 方法中调用您的安装 activity:
并通过 Intent 传递 ArrayList 数据,
InstallationView.setOnClickListener(new View.OnClickListener(){
public void onClick(View v)
{
Intent intent= new Intent(SearchData.this, Installation.class);
intent.putParcelableArrayListExtra("HASH_MAP",DataList);
startActivity(intent);
}
});
在您的安装 activity class 中,在 onCreate() 中设置视图并从 xml 文件初始化列表视图:
setContentView(R.layout.activity_installation);
ListView listView = (ListView)findViwById(R.id.listview);
并尝试从意图中获取数据:
ArrayList<HashMap<String,String>> hashmap_dataList = getIntent.getParcelableArrayListExtra("HASH_MAP");
然后用 listview 和 hashmap 做任何你想做的事。