1

So I have a ListView that is being populated from a web served xml file. The list populates fine. Well, it uses a bad method to populate, I know it should use an AsyncTask but instead it populates on the UI thread. I tried and tried with an AsyncTask, but I lost the fight! I know I know!! If you have a solution to that Id love to hear it!! Anyways, when a list item is clicked, Im starting a new activity and passing the info using intent.putExtra This works, but it always shows the info from the first item in the list. Example:

A

B

C

D

E

are items in a list. Pressing any one of them gives me all the info pertaining to A in the following activity How do I fix this???

ListView Activity:

    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);

        }
    });     
}   

The Activity that is displayed after an item is clicked:

    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) {

        }

    }

}

And, my Adapter class, becuase I know it will be asked for:

    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;
}

Any help is greatly appreciated!

jb15613
  • 359
  • 4
  • 12

3 Answers3

3

write view.findViewById in everyline. just like below.

 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);

    }
SKK
  • 5,261
  • 3
  • 27
  • 39
  • did you update this line? public void onItemClick(AdapterView> arg0, View view, int arg2, long arg3) i have changed View arg1 to View view. – SKK Jan 09 '13 at 05:06
  • I did not, and sorry I just realized I did not add the extra set of () – jb15613 Jan 09 '13 at 05:11
  • That did it!! Its always the small things!! You are the best man, knew exactly what was going on! I'll mark you as answered!! – jb15613 Jan 09 '13 at 05:15
2

You are populating data to intent through i.putExtra("UserName", user); but you are getting it through extras like extras.getString("UserName");

Instead you get the values like the below in your ListClickedItem activity.

String user = getIntent().getStringExtra("UserName");

getExtras() is most likely to be used when you use Bundle to populate the data and get that in the other activity. Hope this helps.

Note: Besides the above correction, as you said you know that you should use an asynctask, I can suggest you one more thing that -- When you use an Asynctask, after getting the required data from the web service in your doInBackground() method, you should populate the data to the listview in onPostExecute() method. You can make use of runOnUIThread() to populate the data in onPostExecute() method and even you set the onClickListener to the listview in this method itself.

Kanth
  • 6,681
  • 3
  • 29
  • 41
  • I tried to retrieve the values like your example, but I still get #1's data from all other items in list. Also, I will take your advice on the async task, good info!! Thanks – jb15613 Jan 09 '13 at 05:09
  • You are welcome. I just advised you on the data transfer but didn't check your onClick(). Glad your problem got solved with the help of other answerer. – Kanth Jan 09 '13 at 05:23
  • Here we go on round 2 of Turn my working activity into an async task and have it not work for a week...I may be back for some info :) – jb15613 Jan 09 '13 at 05:24
1
use an AsyncTask but instead it populates on the UI thread. I tried and tried with an AsyncTask, but I lost the fight!

Use Arraylists instead of the hashmap. I have used the Arraylist and add Elements in the asyncTask.

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);
                             }

and here is the asyncTask Showing how we can parse the XML in background

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);

    }
}

Edit

Here is the imageAdapter which extends the BaseAdapter class

public 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;
}
Qadir Hussain
  • 8,721
  • 13
  • 89
  • 124