skliz4rel
skliz4rel

Reputation: 198

Problems populating a fragment list

I have a SherlockFragmentActivity class that collects values from a server and loads it in to my database. This SherlockFragmentActivity as 3 Fragment called the Book, Video and Audios. Each of them are meant to show values that were downloaded into the db. By challenge now is when I open my UI i dont get to see the values on the fragments not until I start clicking each fragment before the values get populated into the list in the fragment. And I even notice a continuous addition of this values. My fragment class is pasted below.

    public class BooksFragment extends SherlockListFragment{

    TextView textview = null;
    String CategoryID = null;

    ArrayList<HashMap<String,String>> listBooks = null;

    IDatabaseHelper databaseHelper = null;

    Activity activity = null;
    Context context = null;

    ListAdapter adapter = null;


    public BooksFragment(){

        super();
    }


     @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.books, container, false);
        // do your view initialization heres
        textview = (TextView)view.findViewById(R.id.textView1);



        return view;
      }



     @Override
     public void onCreate(Bundle savedInstanceState){
         super.onCreate(savedInstanceState);

         listBooks = new ArrayList<HashMap<String,String>>();

     }


      @Override
        public void onStart() {
            super.onStart();


            Bundle bundle =this.getArguments();

            if(bundle != null){
                CategoryID = bundle.getString("CategoryID");           
            }

            this.initializeComponents();
            this.populateListView();
      }


      @Override
      public void onActivityCreated(Bundle savedInstanceState){
          super.onActivityCreated(savedInstanceState);

          activity = getActivity();
          context = activity.getBaseContext();

          databaseHelper= new DatabaseHelper(context);


      }


      //Now we are going to initialize components of the fragment
      private void initializeComponents(){

          ListView listview = getListView();
          listview.setOnItemClickListener(listener);
      }


      //list item click listener
        private OnItemClickListener listener = new OnItemClickListener(){

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                // TODO Auto-generated method stub

            }


         };


         //This method would be used to collect content from the database and populate the listview item
         private void populateListView(){
             MedicalBookModel[] booksmodel = this.databaseHelper.ReturnBooks(CategoryID);

             if(booksmodel != null){
                 for(MedicalBookModel book : booksmodel){

                     HashMap<String,String> bookMap = new HashMap<String,String>();
                     bookMap.put(MedicalBookModel.MedicalBookModel_ID, book.getID());
                     bookMap.put(MedicalBookModel.MedicalBookModel_Name,book.getName());

                     Log.i("values",book.getName());

                     listBooks.add(bookMap);
                 }
             }

             adapter = new SimpleAdapter(context, listBooks,R.layout.list_book,new String[]{ "ID","Name"}, new int[]{ R.id.bookId, R.id.bookName});
             setListAdapter(adapter);
         }


}

Upvotes: 0

Views: 114

Answers (1)

An-droid
An-droid

Reputation: 6485

For that you have several solutions :

1- Using the Application instance singleton which is global

2- Creating your own global class to manage your data

3- Use a service bound to the activity (or not) and call backs (maybe intent and broadcast receivers)

4- Pass your object as parceable in argument when adding the fragment

Note that sometimes you will need to invalidate views to force datas to refresh

EXEMPLE OF PARCEABLE OBJECT

public class ImageObject implements Parcelable {
    /**
     * ATTRIBUTES
     */
    protected String    _idPicture;
    protected String    _idAlbum;
    protected String    _name;
    protected String    _fileName;
    protected String    _imageUrl;
    protected String    _hierarchy;

    public ImageObject(String _idPicture, String _idAlbum, String _name, String _fileName, String _imageUrl, String _hierarchy) {

        super();
        this._idPicture = _idPicture;
        this._idAlbum = _idAlbum;
        this._name = _name;
        this._fileName = _fileName;
        this._imageUrl = _imageUrl;
        this._hierarchy = _hierarchy;
    }

    public ImageObject(Parcel in) {

        String[] data = new String[6];
        in.readStringArray(data);
        this._idPicture = data[0];
        this._idAlbum = data[1];
        this._name = data[2];
        this._fileName = data[3];
        this._imageUrl = data[4];
        this._hierarchy = data[5];
    }

    public static final Parcelable.Creator  CREATOR = new Parcelable.Creator() {
                                                        public ImageObject createFromParcel(Parcel in) {

                                                            return new ImageObject(in);
                                                        }

                                                        public ImageObject[] newArray(int size) {

                                                            return new ImageObject[size];
                                                        }
                                                    };

    @Override
    public int describeContents() {

        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {

        dest.writeStringArray(new String[] { this._idPicture, this._idAlbum, this._name, this._fileName, this._imageUrl, this._hierarchy });
    }
}

Upvotes: 1

Related Questions