Skip to content

Add ParseListLoader #86

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 11 commits into from
Closed
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions ParseListLoaderExample/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/build
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we use the root's gitignore?

5 changes: 5 additions & 0 deletions ParseListLoaderExample/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
Create an App on [Parse.com](https://parse.com) then modify strings.xml with your keys
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: Follow other samples' style

    <!-- Please put your application's app ID and keys here -->
    <string name="parse_app_id">YOUR_PARSE_APP_ID</string>
    <string name="parse_client_key">YOUR_PARSE_CLIENT_KEY</string>


<string name="parse_app_id">YOUR_PARSE_APP_ID</string>
<string name="parse_client_key">YOUR_PARSE_CLIENT_KEY</string>

28 changes: 28 additions & 0 deletions ParseListLoaderExample/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
apply plugin: 'com.android.application'

android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion

defaultConfig {
applicationId "com.example.tuanchauict.parselistloaderexample"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: we do not use proguardFiles for sample project.

}
}
}

dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you use some local jar files?

compile 'com.android.support:recyclerview-v7:21.+'
compile project(':ParseLoginUI')
compile rootProject.ext.androidSupport
compile files(rootProject.ext.parsePath)
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: Please follow other samples' build.gradle

17 changes: 17 additions & 0 deletions ParseListLoaderExample/proguard-rules.pro
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Add project specific ProGuard rules here.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: we do not use proguardFiles for sample project.

# By default, the flags in this file are appended to flags specified
# in /Users/tuanchauict/Data/Software/Dev/android-sdk-macosx/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.example.tuanchauict.parselistloaderexample;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: Maybe delete this test?


import android.app.Application;
import android.test.ApplicationTestCase;

/**
* <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a>
*/
public class ApplicationTest extends ApplicationTestCase<Application> {
public ApplicationTest() {
super(Application.class);
}
}
40 changes: 40 additions & 0 deletions ParseListLoaderExample/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest
package="com.example.tuanchauict.parselistloaderexample"
xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:name=".ListLoaderApplication"
>
<activity
android:name=".MainActivity"
android:label="@string/app_name"

>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>

<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>

<activity android:name=".listview.ListViewDemoActivity" android:label="List View"/>

<activity android:name=".viewpager.ViewPagerDemoActivity" android:label="View Pager"/>

<activity android:name=".recycler.RecyclerViewDemoActivity" android:label="Recycler View"/>

<meta-data
android:name="com.parse.APPLICATION_ID"
android:value="@string/parse_app_id"/>
<meta-data
android:name="com.parse.CLIENT_KEY"
android:value="@string/parse_client_key"/>
</application>

</manifest>
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.example.tuanchauict.parselistloaderexample;

import android.app.Application;

import com.parse.Parse;
import com.parse.ParseObject;

/**
* Created by tuanchauict on 10/25/15.
*/
public class ListLoaderApplication extends Application {
@Override
public void onCreate() {
super.onCreate();

// Required - Initialize the Parse SDK
Parse.initialize(this);
ParseObject.registerSubclass(ParseDemoObject.class);

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package com.example.tuanchauict.parselistloaderexample;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

import com.example.tuanchauict.parselistloaderexample.listview.ListViewDemoActivity;
import com.example.tuanchauict.parselistloaderexample.recycler.RecyclerViewDemoActivity;
import com.example.tuanchauict.parselistloaderexample.viewpager.ViewPagerDemoActivity;


public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

findViewById(R.id.create_1000_objects).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
create1000Objects();
}
});


findViewById(R.id.goto_list_view).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, ListViewDemoActivity.class);
startActivity(intent);
}
});

findViewById(R.id.goto_viewpager).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, ViewPagerDemoActivity.class);
startActivity(intent);
}
});

findViewById(R.id.goto_recycler_view).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, RecyclerViewDemoActivity.class);
startActivity(intent);
}
});
}

public void create1000Objects() {

for (int i = 0; i < 1000; i++) {
ParseDemoObject object = ParseDemoObject.getObject(i);
object.saveEventually();
}
Toast.makeText(this, "Check on your app's data", Toast.LENGTH_LONG).show();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.example.tuanchauict.parselistloaderexample;

import com.parse.ParseClassName;
import com.parse.ParseObject;

/**
* Created by tuanchauict on 10/25/15.
*/
@ParseClassName("ListLoaderItem")
public class ParseDemoObject extends ParseObject {
public static final String ATTR_SSD = "ssd";
public static final String ATTR_FIRST_NAME = "firstName";
public static final String ATTR_LAST_NAME = "lastName";


public static ParseDemoObject getObject(int ssd){
ParseDemoObject object = new ParseDemoObject();
object.put(ATTR_SSD, ssd);
object.put(ATTR_FIRST_NAME, "FirstName " + ssd);
object.put(ATTR_LAST_NAME, "LastName " + ssd);
return object;
}


public int getSSD(){
return getInt(ATTR_SSD);
}

public String getFirstname(){
return getString(ATTR_FIRST_NAME);
}


public String getLastName(){
return getString(ATTR_LAST_NAME);
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package com.example.tuanchauict.parselistloaderexample.listview;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

import com.example.tuanchauict.parselistloaderexample.ParseDemoObject;
import com.example.tuanchauict.parselistloaderexample.R;
import com.parse.ParseListLoader;

import java.util.ArrayList;
import java.util.List;

/**
* Created by tuanchauict on 10/25/15.
*/
public class ListViewAdapter extends ArrayAdapter<ParseDemoObject>
implements ParseListLoader.LoaderTarget<ParseDemoObject> {
private List<ParseDemoObject> mObjects;
private boolean mHasNextPage;

private LayoutInflater mInflater;

public ListViewAdapter(Context context) {
super(context, 0);
mInflater = LayoutInflater.from(context);
mObjects = new ArrayList<>();
mHasNextPage = true;
}

public boolean hasNextPage() {
return mHasNextPage;
}

public void setHasNextPage(boolean hasNextPage) {
mHasNextPage = hasNextPage;
}

@Override
public int getCount() {
return mObjects.isEmpty() ? 0 : mHasNextPage ? mObjects.size() + 1 : mObjects.size();
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(position >= mObjects.size()){
return mInflater.inflate(R.layout.item_waiting, parent, false);
}

if (convertView == null || convertView.getTag() != Boolean.TRUE) {
convertView = mInflater.inflate(R.layout.item_layout, parent, false);
convertView.setTag(Boolean.TRUE);
}
ParseDemoObject item = mObjects.get(position);

((TextView) convertView.findViewById(R.id.txt_name))
.setText(item.getFirstname() + " " + item.getLastName());

return convertView;
}

@Override
public void appendList(List<ParseDemoObject> sublist) {
mObjects.addAll(sublist);
}

@Override
public void clearList() {
mObjects.clear();
}

@Override
public void notifyDataChanged() {
notifyDataSetChanged();
}
}
Loading