views:

37

answers:

1

I am trying to add ListView items one by one. So if I have say -- 60 items -- the application would add the views to the list view one at a time -- thus showing the user that the application is loading more things.

This is my code:

try {
        JSONArray j = getTaggsJSON();
        Log.v(TAG, String.valueOf(j.length()));
        a = new createSpecialAdapter(this, R.layout.individual_tagg_view,
                R.layout.list_item, view, j);
        ListView v = this.getListView();
        v.setStackFromBottom(true);
        setListAdapter(a);
        new addViewsToList().execute(j);

    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (JSONException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ServiceException e) {
        e.printStackTrace();
    }

}

private class addViewsToList extends AsyncTask<JSONArray, View, List<View>> {

    protected List<View> doInBackground(JSONArray... jsonArrays) {
        List<View> v = new ArrayList<View>();
        Log.v(TAG, String.valueOf(jsonArrays[0].length()));
        for (int x = 0; x < jsonArrays[0].length(); x++) {
            try {
                Log.v(TAG, jsonArrays[0].getJSONObject(x).toString());
                v.add(ViewAdapter.createTaggView(jsonArrays[0]
                        .getJSONObject(x), c));
            } catch (JSONException e) {
                e.printStackTrace();
            }
            publishProgress(v.get(x));
        }
        return v;
    }

    protected void onProgressUpdate(View... v) {
        Log.v(TAG, "I'm updating my progress!");
        a.notifyDataSetChanged();
    }

    protected void onPostExecute(List<View> views) {
        Log.v(TAG, "i'm done!");
        Log.v(TAG, String.valueOf(views.size()));
    }
}

So, it looks like my code is printing out the views correctly, and putting them in the list correctly, however my activity displays nothing. What am I doing wrong? I thought setting the adapter before -- when there are no views in the list -- and then updating the adapter that the list was changed was the right way to go.... Obviously not.. Can anyone help me?

If you need clarification on my questions please let me know.

EDIT: Here is the adapter code to supplement my question.

private class SpecialAdapter extends ArrayAdapter<JSONArray> {

    JSONArray json;

    public SpecialAdapter(Context context, int textViewResourceId,
            int listItem, JSONArray j) {
        super(context, textViewResourceId);
        this.json = j;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        Log.v(TAG,"I'm inside the getView method.");
        try {
            JSONObject info = json.getJSONObject(position);
            Log.v(TAG,info.toString());



        if (convertView == null) {
            LayoutInflater i = (LayoutInflater) RecentTaggs.this
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = i.inflate(R.layout.individual_tagg_view, parent,
                    false);
            holder = new ViewHolder();
            holder.username = (TextView) convertView
                    .findViewById(R.id.userName);
            holder.review = (TextView)convertView.findViewById(R.id.review_text);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.review.setText(info.getString("review"));

        return convertView;

        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

}

My output doesn't output any of my Log.v statements, and doesn't show that its even inside the GetView method.

+1  A: 
  • There is certainly something wrong with your Adapter. You should never save Views that should displayed in a ListView on your own. Only save the data that is needed to create the View and overwrite the getView method of your Adapter to create the needed view.

  • The second thing is the list that you are using in the background task is
    visible in the scope of the
    doInBackground method only. No change to this list can have an effect on
    your UI.

  • You are passing the JsonArray to your Adapter before starting the background thread. If your Adapter would be working correctly the ListView should be fully functional before the background thread even starts working. You should pass an empty JsonArray into the ListView and if you are extending an ArrayAdapter you can use addItem in your publish progress method.

Some a little bit unrelated things about the naming of your Adapter class. You called it createSpecialAdapter. This sounds like a method name but it is a classname. Try to start all class names with an uppercase letter and give them names of the things they represent like SpecialAdapter.

Janusz
Thanks a heap!!!, I'll working on getting this correct and let you know!
hwrdprkns