androidandroid-parsequeryadapter

ParseQueryAdapter with Subclasses, android Why can't I get my data back from Parse?


I am using Parse.com to build an Android app, and I am having the hardest time figuring out what is not working. Why am I not seeing my list of Category names?

I am not getting any errors, but I am not seeing my data when my activity runs. I have these two parse classes, and a recipe could be part of more than one category.

@ParseClassName("Category")
public class Category extends ParseObject {

public Category() {
}

public String getName() {
    return getString("name");
}

public void setName(String name) {
    put("name", name);
}


}

@ParseClassName("Recipe")
public class Recipe extends ParseObject{

public Recipe() {
}

public String getName() {
    return getString("name");
}
public void setName(String name) {
    put("name", name);
}

public Number getTotalMeatAndFat(){
    return getNumber("totalMeatAndFat");
}
public void setTotalMeatAndFat(Number totalMeatAndFat){put("totalMeatAndFat", totalMeatAndFat);}

public String getUnit(){ return getString("unit");}
public void setUnit(String unit) {
    put("unit", unit);
}
}

I have created and saved my data in parse by calling a CreateData function that looks like this:

public void CreateData() {
        // create the categories
    Category fCat = new Category();
    fCat.put("name", "Fresh Sausages");
    fCat.saveInBackground();
    Category erCat = new Category();
    erCat.put("name", "Fermented Sausages");
    erCat.saveInBackground();

    // create the base recipes
    Recipe rec = new Recipe();
    rec.setName( "Sweet Italian");
    rec.setTotalMeatAndFat( 1000);
    rec.setUnit("g");

    Recipe rec1 = new Recipe();
    rec1.setName("Hot Italian");
    rec1.setTotalMeatAndFat(1000);
    rec1.setUnit("g");

    Recipe rec2 = new Recipe();
    rec2.setName("Chorizo Cantimpalos Style");
    rec2.setTotalMeatAndFat(1000);
    rec2.setUnit("g");

    // assign recipes to categories
    ParseRelation<Category> relationRecCat = rec.getRelation("categories");
    relationRecCat.add(fCat);
    rec.saveInBackground();

    ParseRelation<Category> relationRec1Cat = rec1.getRelation("categories");
    relationRec1Cat.add(fCat);
    rec1.saveInBackground();

    ParseRelation<Category> relRec2Cat = rec2.getRelation("categories");
    relRec2Cat.add(erCat);
    rec2.saveInBackground();
}

Here is the layout for my category_list.xml file:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
    android:id="@+id/title"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<ListView
    android:id="@+id/listview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"></ListView>

</LinearLayout>

And finally, here is my CategoryListActivity onCreate method. Again, I am putting a TextView in the layout just so I can see if the layout is being used.

import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.parse.ParseQueryAdapter;
import com.parse.ParseUser;


public class CategoryListActivity extends Activity {
private TextView titleTextView;
private ListView listView;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.category_list);

    listView = (ListView) findViewById(R.id.listview);

    ParseQueryAdapter<Category> adapter;
    adapter = new ParseQueryAdapter<Category>(this , Category.class);
    adapter.setTextKey("name");
    listView.setAdapter(adapter);

    // this is just to see if we are getting anywhere at all.
    titleTextView = (TextView) findViewById(R.id.title);
    titleTextView.setText(R.string.hello_world);
}

@Override
protected void onStart() {
    super.onStart();
    // Set up the profile page based on the current user.
    ParseUser user = ParseUser.getCurrentUser();
    showProfile(user);
}

private void showProfile(ParseUser user) {
    if (user != null) {
        String fullName = user.getString("name");
        if (fullName != null) {
            Toast.makeText(getApplicationContext(), "You are logged in as" + fullName, Toast.LENGTH_SHORT).show();
        }

    }
}

Solution

  • I ended up using a ListActivity, and creating a custom adapter.

    public class CategoryListActivity extends ListActivity {
    
    int listCount = -1;
    private CategoryViewListViewAdapter adapter;
    
    public static final String TAG = CategoryListActivity.class.getSimpleName();
    
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getListView().setClickable(true);
    
        CategoryViewListViewAdapter adapter = new CategoryViewListViewAdapter(this);
    
        adapter.addOnQueryLoadListener(new ParseQueryAdapter.OnQueryLoadListener<Category>() {
            @Override
            public void onLoading() {
                //Toast.makeText(getApplicationContext(), "Loading...", Toast.LENGTH_LONG).show();
                Log.d(TAG, "Loading.....");
            }
    
            @Override
            public void onLoaded(List<Category> list, Exception e) {
                Log.d(TAG, "Loading complete.");
                Log.d(TAG, "List contains "+ list.size() + " items");
                // this is just to see if we are getting anywhere at all.
    
    
            }
        });
    
       setListAdapter(adapter);
    
    
    }
    
    @Override
    protected void onStart() {
        super.onStart();
        // Set up the profile page based on the current user.
        ParseUser user = ParseUser.getCurrentUser();
        showProfile(user);
    }
    
    private void showProfile(ParseUser user) {
        if (user != null) {
            String fullName = user.getString("name");
            if (fullName != null) {
                Toast.makeText(getApplicationContext(), "You are logged in as " + fullName, Toast.LENGTH_SHORT).show();
            }
    
        }
    }
    
    // OnListItemClick event
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        // Display item in toast.
        super.onListItemClick(l, v, position, id);
    
        Category cat = (Category) l.getAdapter().getItem(position);
        String objId = cat.getObjectId().toString();
        Log.d(TAG, "Category name = "+ cat.getName());
        Log.d(TAG, "Category object id = "+ objId);
        // now we have the category, we want to go get the list of Recipes in that category.
        Intent intent = new Intent(this, RecipeListActivity.class);
        EventBus.getDefault().postSticky(cat);
        startActivity(intent);
    
    }
    
    
    
    class CategoryViewListViewAdapter extends ParseQueryAdapter<Category> {
    
    public CategoryViewListViewAdapter(Context context) {
        super(context, new ParseQueryAdapter.QueryFactory<Category>() {
            public ParseQuery<Category> create() {
                ParseQuery<Category> query = ParseQuery.getQuery(Category.class);
                //query.include("User");
                query.whereExists("name");
                query.orderByAscending("name");
                return query;
            }
        });
    
    }
    @Override
    public View getItemView(Category category, View v, ViewGroup parent) {
        if(v == null) {
            v = View.inflate(getContext(), R.layout.category_list_item, null);
        }
    
        super.getItemView(category, v, parent);
    
        final TextView catTextView = (TextView) v.findViewById(R.id.category_name);
        catTextView.setText(category.getName());
        return v;
    }
    

    }