Skip to content

Commit

Permalink
Merge pull request #95 from willowtreeapps/listview-support
Browse files Browse the repository at this point in the history
Listview support
  • Loading branch information
Theodore Wilson authored Jul 7, 2017
2 parents 19aa854 + 2072bca commit 2744d69
Show file tree
Hide file tree
Showing 11 changed files with 356 additions and 19 deletions.
4 changes: 4 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@
<activity
android:name=".RecyclerActivity"
android:screenOrientation="portrait"/>

<activity
android:name=".ListViewActivity"
android:screenOrientation="portrait" />
</application>

</manifest>
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
/*
* Spruce
*
* Copyright (c) 2017 WillowTree, Inc.
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
*/

package com.willowtreeapps.spurceexampleapp;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;

import com.willowtreeapps.spurceexampleapp.fragments.ListViewFragment;

public class ListViewActivity extends AppCompatActivity {

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

FragmentManager fm = getSupportFragmentManager();
Fragment listViewFragment = fm.findFragmentById(R.id.list_view_fragment);
if (listViewFragment == null) {
listViewFragment = ListViewFragment.newInstance();
fm.beginTransaction()
.replace(R.id.list_view_fragment, listViewFragment)
.commit();
}

Toolbar toolBar = (Toolbar) findViewById(R.id.list_view_tool_bar);
setSupportActionBar(toolBar);

if (getSupportActionBar() != null) {
getSupportActionBar().setTitle(R.string.list_view_name);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.sort_option:
startActivity(new Intent(this, SpruceActivity.class)
.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP));
break;
case R.id.list_view_option:
break;
case R.id.recycler_option:
startActivity(new Intent(this, RecyclerActivity.class)
.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP));
break;
default:
finish();
break;
}
return super.onOptionsItemSelected(item);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,10 @@ public boolean onOptionsItemSelected(MenuItem item) {
break;
case R.id.recycler_option:
break;
case R.id.list_view_option:
startActivity(new Intent(this, ListViewActivity.class)
.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP));
break;
default:
finish();
break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,10 @@ public boolean onOptionsItemSelected(MenuItem item) {
startActivity(new Intent(this, RecyclerActivity.class)
.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP));
break;
case R.id.list_view_option:
startActivity(new Intent(this, ListViewActivity.class)
.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP));
break;
}
return super.onOptionsItemSelected(item);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
/*
* Spruce
*
* Copyright (c) 2017 WillowTree, Inc.
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
*/

package com.willowtreeapps.spurceexampleapp.fragments;

import android.animation.Animator;
import android.animation.ObjectAnimator;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.RelativeLayout;

import com.willowtreeapps.spruce.Spruce;
import com.willowtreeapps.spruce.animation.DefaultAnimations;
import com.willowtreeapps.spruce.sort.DefaultSort;
import com.willowtreeapps.spurceexampleapp.R;
import com.willowtreeapps.spurceexampleapp.model.ExampleData;

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

public class ListViewFragment extends Fragment {

public static ListViewFragment newInstance() {
return new ListViewFragment();
}

private ListView listView;
private Animator spruceAnimator;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, @Nullable Bundle savedInstanceState) {
listView = (ListView) container.findViewById(R.id.list_view);

// Create the animator after the list view has finished laying out
listView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// Animate in the visible children
spruceAnimator = new Spruce.SpruceBuilder(listView)
.sortWith(new DefaultSort(100))
.animateWith(DefaultAnimations.shrinkAnimator(listView, 800),
ObjectAnimator.ofFloat(listView, "translationX", -listView.getWidth(), 0f).setDuration(800))
.start();
}
});

// Mock data objects
List<ExampleData> placeHolderList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
placeHolderList.add(new ExampleData());
}

// Remove default dividers and set adapter
listView.setDivider(null);
listView.setDividerHeight(0);
listView.setAdapter(new ListViewAdapter(placeHolderList));

return inflater.inflate(R.layout.list_view_fragment, container, false);
}

@Override
public void onResume() {
super.onResume();
if (spruceAnimator != null) {
spruceAnimator.start();
}
}

private class ListViewAdapter extends BaseAdapter {

private List<ExampleData> placeholderList;
private LayoutInflater inflater;

ListViewAdapter(List<ExampleData> placeholderList) {
this.placeholderList = placeholderList;
this.inflater = LayoutInflater.from(getContext());
}

class ViewHolder implements View.OnClickListener{

private RelativeLayout parent;

ViewHolder(RelativeLayout parent) {
this.parent = parent;
this.parent.setOnClickListener(this);
}

@Override
public void onClick(View v) {
if (spruceAnimator != null) {
spruceAnimator.start();
}
}
}

@Override
public int getCount() {
return placeholderList.size();
}

@Override
public Object getItem(int position) {
return position;
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

View vi = convertView;
ViewHolder vh;

if (convertView == null) {
vi = inflater.inflate(R.layout.view_placeholder, null);
vh = new ViewHolder((RelativeLayout) vi);
vi.setTag(vh);
}

return vi;
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
import com.willowtreeapps.spruce.animation.DefaultAnimations;
import com.willowtreeapps.spruce.sort.DefaultSort;
import com.willowtreeapps.spurceexampleapp.R;
import com.willowtreeapps.spurceexampleapp.model.ExampleData;

import java.util.ArrayList;
import java.util.List;
Expand All @@ -58,8 +59,6 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, @Nullable
recyclerView = (RecyclerView) container.findViewById(R.id.recycler);
recyclerView.setHasFixedSize(true);

RelativeLayout placeholder = (RelativeLayout) container.findViewById(R.id.placeholder_view);

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext()) {
@Override
public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
Expand All @@ -74,9 +73,10 @@ public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State
}
};

List<RelativeLayout> placeHolderList = new ArrayList<>();
// Mock data objects
List<ExampleData> placeHolderList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
placeHolderList.add(placeholder);
placeHolderList.add(new ExampleData());
}

recyclerView.setAdapter(new RecyclerAdapter(placeHolderList));
Expand All @@ -95,7 +95,7 @@ public void onResume() {

private class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {

List<RelativeLayout> placeholderList;
List<ExampleData> placeholderList;

class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

Expand All @@ -115,21 +115,21 @@ public void onClick(View v) {
}
}

RecyclerAdapter(List<RelativeLayout> placeholderList) {
RecyclerAdapter(List<ExampleData> placeholderList) {
this.placeholderList = placeholderList;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
RelativeLayout view = (RelativeLayout) LayoutInflater.from(parent.getContext())
.inflate(R.layout.recycler_placeholder, parent, false);
.inflate(R.layout.view_placeholder, parent, false);

return new ViewHolder(view);
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.placeholderView = placeholderList.get(position);

}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
/*
* Spruce
*
* Copyright (c) 2017 WillowTree, Inc.
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
*/


package com.willowtreeapps.spurceexampleapp.model;

public class ExampleData {

}
Loading

0 comments on commit 2744d69

Please sign in to comment.