所以我有一个从Web服务的xml文件中填充的ListView。该列表填写正常。好吧,它使用一种糟糕的方法来填充,我知道它应该使用AsyncTask,而是填充在UI线程上。我尝试过尝试使用AsyncTask,但是我输了!我知道我知道!!如果你有一个解决方案,我喜欢听到它! 无论如何,当单击列表项时,我开始一个新活动并使用intent.putExtra传递信息 这有效,但它始终显示列表中第一项的信息。 例如:
A
乙
C
d
电子
是列表中的项目。按下其中任何一个都可以获得以下活动中与A相关的所有信息 我该如何解决这个问题?
ListView活动:
public class ColorPacksMain extends Activity {
// All static variables
static final String URL = "https://dl.dropbox.com/u/43058382/BeanPickerColorToolUpdates/ColorPacksList.xml";
// XML node keys
static final String KEY_COLORPACK = "ColorPack"; // parent node
static final String KEY_ID = "id";
static final String KEY_USER = "user";
static final String KEY_THEME = "theme";
static final String KEY_THEMECOLOR = "themeColor";
static final String KEY_TEXTCOLORPRIMARY = "primaryTextColor";
static final String KEY_TEXTCOLORSECONDARY = "secondaryTextColor";
static final String KEY_THUMB_URL = "thumb_url";
static final String KEY_DL_URL_GSM = "dl_url_gsm";
static final String KEY_DL_URL_LTE = "dl_url_lte";
static final String KEY_SCREEN1 = "screen1";
static final String KEY_SCREEN2 = "screen2";
static final String KEY_SCREEN3 = "screen3";
static final String KEY_SCREEN4 = "screen4";
ListView list;
LazyAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.color_packs_activity);
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
ArrayList<HashMap<String, String>> colorPacksList = new ArrayList<HashMap<String, String>>();
XMLParser parser = new XMLParser();
String xml = parser.getXmlFromUrl(URL); // getting XML from URL
Document doc = parser.getDomElement(xml); // getting DOM element
NodeList nl = doc.getElementsByTagName(KEY_COLORPACK);
// looping through all song nodes <song>
for (int i = 0; i < nl.getLength(); i++) {
// creating new HashMap
HashMap<String, String> map = new HashMap<String, String>();
Element e = (Element) nl.item(i);
// adding each child node to HashMap key => value
map.put(KEY_ID, parser.getValue(e, KEY_ID));
map.put(KEY_USER, parser.getValue(e, KEY_USER));
map.put(KEY_THEME, parser.getValue(e, KEY_THEME));
map.put(KEY_THEMECOLOR, parser.getValue(e, KEY_THEMECOLOR));
map.put(KEY_TEXTCOLORPRIMARY, parser.getValue(e, KEY_TEXTCOLORPRIMARY));
map.put(KEY_TEXTCOLORSECONDARY, parser.getValue(e, KEY_TEXTCOLORSECONDARY));
map.put(KEY_DL_URL_GSM, parser.getValue(e, KEY_DL_URL_GSM));
map.put(KEY_DL_URL_LTE, parser.getValue(e, KEY_DL_URL_LTE));
map.put(KEY_SCREEN1, parser.getValue(e, KEY_SCREEN1));
map.put(KEY_SCREEN2, parser.getValue(e, KEY_SCREEN2));
map.put(KEY_SCREEN3, parser.getValue(e, KEY_SCREEN3));
map.put(KEY_SCREEN4, parser.getValue(e, KEY_SCREEN4));
map.put(KEY_THUMB_URL, parser.getValue(e, KEY_THUMB_URL));
// adding HashList to ArrayList
colorPacksList.add(map);
}
list = (ListView) findViewById(R.id.colorPacksList);
// Getting adapter by passing xml data ArrayList
adapter=new LazyAdapter(this, colorPacksList);
list.setAdapter(adapter);
// Click event for single list row
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// Launching new Activity on selecting single List Item
Intent i = new Intent(getApplicationContext(), ListClickedItem.class);
// sending data to new activity
String user = ((TextView) findViewById(R.id.user)).getText().toString();
String theme = ((TextView) findViewById(R.id.theme)).getText().toString();
String themeColor = ((TextView) findViewById(R.id.themeColor)).getText().toString();
String tcP = ((TextView) findViewById(R.id.primaryTextColor)).getText().toString();
String tcS = ((TextView) findViewById(R.id.secondaryTextColor)).getText().toString();
String dlGSM = ((TextView) findViewById(R.id.GSMurl)).getText().toString();
String dlLTE = ((TextView) findViewById(R.id.LTEurl)).getText().toString();
String screen1 = ((TextView) findViewById(R.id.screen1url)).getText().toString();
String screen2 = ((TextView) findViewById(R.id.screen2url)).getText().toString();
String screen3 = ((TextView) findViewById(R.id.screen3url)).getText().toString();
String screen4 = ((TextView) findViewById(R.id.screen4url)).getText().toString();
i.putExtra("UserName", user);
i.putExtra("ThemeName", theme);
i.putExtra("ThemeColor", themeColor);
i.putExtra("TextColorPrimary", tcP);
i.putExtra("TextColorSecondary", tcS);
i.putExtra("GSM", dlGSM);
i.putExtra("LTE", dlLTE);
i.putExtra("Screenshot 1", screen1);
i.putExtra("Screenshot 2", screen2);
i.putExtra("Screenshot 3", screen3);
i.putExtra("Screenshot 4", screen4);
startActivity(i);
}
});
}
单击项目后显示的活动:
public class ListClickedItem extends Activity{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.list_clicked_activity);
TextView txtUser = (TextView) findViewById(R.id.userName);
TextView txtTheme = (TextView) findViewById(R.id.themeName);
TextView txtThemeColor = (TextView) findViewById(R.id.themeColor);
TextView txtColor1 = (TextView) findViewById(R.id.textColor1);
TextView txtColor2 = (TextView) findViewById(R.id.textColor2);
TextView txtLTEurl = (TextView) findViewById(R.id.lteUrl);
TextView txtGSMurl = (TextView) findViewById(R.id.gsmUrl);
ImageView screenShot1 = (ImageView) findViewById(R.id.screen1);
ImageView screenShot2 = (ImageView) findViewById(R.id.screen2);
ImageView screenShot3 = (ImageView) findViewById(R.id.screen3);
ImageView screenShot4 = (ImageView) findViewById(R.id.screen4);
Bundle extras = getIntent().getExtras();
if(extras!=null){
String user=extras.getString("UserName");
String themeName=extras.getString("ThemeName");
String themeColor=extras.getString("ThemeColor");
String tcPrimary=extras.getString("TextColorPrimary");
String tcSecondary=extras.getString("TextColorSecondary");
String linkGsm=extras.getString("GSM");
String linkLte=extras.getString("LTE");
String screen1=extras.getString("Screenshot 1");
String screen2=extras.getString("Screenshot 2");
String screen3=extras.getString("Screenshot 3");
String screen4=extras.getString("Screenshot 4");
txtUser.setText("User Name: " + user);
txtTheme.setText("Theme Name: " + themeName);
txtThemeColor.setText("Theme Color: " + themeColor);
txtColor1.setText("Primary Text Color: " + tcPrimary);
txtColor2.setText("Secondary Text Color: " + tcSecondary);
txtLTEurl.setText(linkLte);
txtGSMurl.setText(linkGsm);
Drawable s1;
try {
InputStream is = (InputStream) new URL(screen1).getContent();
s1 = Drawable.createFromStream(is, "src name");
screenShot1.setBackgroundDrawable(s1);
} catch (Exception e) {
}
Drawable s2;
try {
InputStream is = (InputStream) new URL(screen2).getContent();
s2 = Drawable.createFromStream(is, "src name");
screenShot2.setBackgroundDrawable(s2);
} catch (Exception e) {
}
Drawable s3;
try {
InputStream is = (InputStream) new URL(screen3).getContent();
s3 = Drawable.createFromStream(is, "src name");
screenShot3.setBackgroundDrawable(s3);
} catch (Exception e) {
}
Drawable s4;
try {
InputStream is = (InputStream) new URL(screen4).getContent();
s4 = Drawable.createFromStream(is, "src name");
screenShot4.setBackgroundDrawable(s4);
} catch (Exception e) {
}
}
}
而且,我的Adapter类,因为我知道它会被要求:
public class LazyAdapter extends BaseAdapter {
private Activity activity;
private ArrayList<HashMap<String, String>> data;
private static LayoutInflater inflater=null;
public ImageLoader imageLoader;
public LazyAdapter(Activity a, ArrayList<HashMap<String, String>> d) {
activity = a;
data=d;
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
imageLoader=new ImageLoader(activity.getApplicationContext());
}
public int getCount() {
return data.size();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
View vi=convertView;
if(convertView==null)
vi = inflater.inflate(R.layout.list_row, null);
TextView user = (TextView)vi.findViewById(R.id.user); // username
TextView theme = (TextView)vi.findViewById(R.id.theme); // theme name
TextView themeColor = (TextView)vi.findViewById(R.id.themeColor); // theme color
TextView primaryTextColor = (TextView)vi.findViewById(R.id.primaryTextColor); // main text color
TextView secondaryTextColor = (TextView)vi.findViewById(R.id.secondaryTextColor); // secondary text color
TextView gsmURL = (TextView)vi.findViewById(R.id.GSMurl); // Maguro URL
TextView lteURL = (TextView)vi.findViewById(R.id.LTEurl); // Toro/ToroPlus URL
TextView screenShot1 = (TextView)vi.findViewById(R.id.screen1url); // Screenshot url
TextView screenShot2 = (TextView)vi.findViewById(R.id.screen2url); // Screenshot url
TextView screenShot3 = (TextView)vi.findViewById(R.id.screen3url); // Screenshot url
TextView screenShot4 = (TextView)vi.findViewById(R.id.screen4url); // Screenshot url
ImageView thumb_image=(ImageView)vi.findViewById(R.id.list_image); // thumb image
HashMap<String, String> colorPack = new HashMap<String, String>();
colorPack = data.get(position);
// Setting all values in listview
user.setText(colorPack.get(ColorPacksMain.KEY_USER));
theme.setText(colorPack.get(ColorPacksMain.KEY_THEME));
themeColor.setText(colorPack.get(ColorPacksMain.KEY_THEMECOLOR));
primaryTextColor.setText(colorPack.get(ColorPacksMain.KEY_TEXTCOLORPRIMARY));
secondaryTextColor.setText(colorPack.get(ColorPacksMain.KEY_TEXTCOLORSECONDARY));
gsmURL.setText(colorPack.get(ColorPacksMain.KEY_DL_URL_GSM));
lteURL.setText(colorPack.get(ColorPacksMain.KEY_DL_URL_LTE));
screenShot1.setText(colorPack.get(ColorPacksMain.KEY_SCREEN1));
screenShot2.setText(colorPack.get(ColorPacksMain.KEY_SCREEN2));
screenShot3.setText(colorPack.get(ColorPacksMain.KEY_SCREEN3));
screenShot4.setText(colorPack.get(ColorPacksMain.KEY_SCREEN4));
imageLoader.DisplayImage(colorPack.get(ColorPacksMain.KEY_THUMB_URL), thumb_image);
return vi;
}
非常感谢任何帮助!
答案 0 :(得分:3)
在每行中编写view.findViewById。就像下面一样。
public void onItemClick(AdapterView<?> arg0, View view, int arg2,
long arg3) {
// Launching new Activity on selecting single List Item
Intent i = new Intent(getApplicationContext(), ListClickedItem.class);
// sending data to new activity
String user = ((TextView) view.findViewById(R.id.user)).getText().toString();
String theme = ((TextView) view.findViewById(R.id.theme)).getText().toString();
startActivity(i);
}
答案 1 :(得分:2)
您正在通过i.putExtra("UserName", user);
填充数据,但是您正在通过extras.getString("UserName");
而是在ListClickedItem
活动中获得如下所示的值。
String user = getIntent().getStringExtra("UserName");
当您使用Bundle填充数据并在其他活动中获取数据时,最有可能使用getExtras()。希望这会有所帮助。
注意:除了上述更正之外,正如您所说,您应该使用asynctask,我可以再建议一下 - 当您使用Asynctask时,获取所需数据后在doInBackground()
方法中的网络服务中,您应该使用onPostExecute()
方法将数据填充到列表视图中。您可以使用runOnUIThread()
填充onPostExecute()方法中的数据,甚至可以在此方法中将onClickListener
设置为listview。
答案 2 :(得分:1)
use an AsyncTask but instead it populates on the UI thread. I tried and tried with an AsyncTask, but I lost the fight!
使用Arraylists而不是hashmap。我使用了Arraylist并在asyncTask中添加了Elements。
public class Home extends Activity {
/** Called when the activity is first created. */
static final String URL = "https://dl.dropbox.com/u/43058382/BeanPickerColorToolUpdates/ColorPacksList.xml";
static final String KEY_ITEM = "Book"; // parent node
static final String KEY_BOOKAUTHOR = "book_author";
static final String KEY_BOOKRATING = "BookRating";
static final String KEY_BOOKID = "BookID";
static final String KEY_BOOKDESC = "BookDescription";
static final String KEY_BOOKDATEPUBLISHED = "DatePublished";
static final String KEY_BOOKTITLE = "BookTitle";
static final String KEY_BOOKCODE = "BookCode";
static ArrayList<String> BookTitle = null;
static ArrayList<Integer> BookRating = null;
static ArrayList<String> BookDescription = null;
static ArrayList<String> BookCoverPhotos = null;
static ArrayList<String> BookAuther = null;
ConnectivityManager cm;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
// First Check the Internet Connectivity
if (cm.getActiveNetworkInfo() != null
&& cm.getActiveNetworkInfo().isAvailable()
&& cm.getActiveNetworkInfo().isConnected()) {
// Avoid to reload the page again and again
if (BookTitle == null) {
BookTitle = new ArrayList<String>();
BookRating = new ArrayList<Integer>();
BookDescription = new ArrayList<String>();
BookIDs = new ArrayList<String>();
BookCode = new ArrayList<String>();
BookCoverPhotos = new ArrayList<String>();
BookAuther = new ArrayList<String>();
// Execute the AsyncTask
new myBackGroundTask().execute(URL);
} else {
ImageAdapter adapter2 = new ImageAdapter(getBaseContext(),
act);
adapter2.notifyDataSetChanged();
gridView.setAdapter(adapter2);
}
这里是asyncTask显示我们如何在后台解析XML
private class myAsyncTask extends AsyncTask<String, Integer, String> {
ProgressDialog progressDialog;
ImageAdapter adapter = new ImageAdapter(getBaseContext(), act);
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog = ProgressDialog.show(getParent(),
"Your Title ...",
"This may Take a few seconds.\nPlease Wait...");
}
@Override
protected String doInBackground(String... params) {
String URL = params[0];
XMLParser parser = new XMLParser();
String XMLString = null;
XMLString = parser.getXmlFromUrl_FeaturedBooks(URL, lIndex);
if (XMLString != null) {
Document doc = parser.getDomElement(XMLString);
NodeList nl = doc.getElementsByTagName(KEY_ITEM);
// looping through all item nodes <item>
for (int i = 0; i < nl.getLength(); i++) {
Element e = (Element) nl.item(i);
try {
BookRating.add(Integer.valueOf(parser.getValue(e,
KEY_BOOKRATING)));
} catch (Exception e2) {
BookRating.add(0);
}
BookDescription.add(parser.getValue(e, KEY_BOOKDESC));
BookTitle.add(parser.getValue(e, KEY_BOOKTITLE));
BookCoverPhotos
.add("http://shiaislamicbooks.com/books_Snaps/"
+ parser.getValue(e, KEY_BOOKCODE)
+ "/1_thumb.jpg");
int tempCount = BookCoverPhotos.size() - 1;
BookAuther.add(parser.getValue(e, KEY_BOOKAUTHOR));
publishProgress(i + 1);
}
} else {
// Request Time
publishProgress(5000);
}
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
progressDialog.setMessage(values[0]
+ " Book(s) found \nPlease wait...");
adapter.notifyDataSetChanged();
if (values[0] == 5000) {
Toast.makeText(context,
"Rrequest Time out!\nNo or Slow Internet Connection!",
Toast.LENGTH_LONG).show();
}
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
progressDialog.dismiss();
adapter.notifyDataSetChanged();
gridView.setAdapter(adapter);
}
}
这是扩展BaseAdapter类
的imageAdapterpublic class ImageAdapter extends BaseAdapter {
public ImageAdapter(Context c) {
context = c;
}
// ---returns the number of images---
public int getCount() {
return BookTitle.size();
}
public ImageAdapter(Context ctx, Activity act) {
inflater = (LayoutInflater) act
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
// ---returns the ID of an item---
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
// ---returns an ImageView view---
public View getView(int position, View convertView, ViewGroup parent) {
// ImageView bmImage;
final ViewHolder holder;
View vi = convertView;
if (convertView == null) {
vi = inflater.inflate(R.layout.grid_style, parent, false);
holder = new ViewHolder();
holder.txt_BooksTitle = (TextView) vi
.findViewById(R.id.txt_BookTitle);
holder.img_BookCoverPhoto = (ImageView) vi
.findViewById(R.id.imgBookCover);
vi.setTag(holder);
} else {
holder = (ViewHolder) vi.getTag();
}
holder.txt_BooksTitle.setText(BookTitle.get(position) + "");
holder.img_BookCoverPhoto.setImageBitmap(bitmapArray.get(position));
return vi;
}
}
class ViewHolder {
TextView txt_BooksTitle;
ImageView img_BookCoverPhoto;
}