Skip to content

Commit 418898c

Browse files
committed
Setup Clicks, Deletion, Animation
Removed 2-way-view in favor of more simplistic items. Based on research most people have used the ViewHolder for onItemClick listener support, sometimes I've seen a ViewHolder implement View.OnClickListener, however that didn't work for our example so our root view has an itemclicklistener set. On top of that, basic animations were added via a top starred github library. The delete is hooked up to actually remove the item from the list. However it seems glitchy in comparison. It should be noted that it will be left up to the user to determine UI/UX aspects such as removal. The Inbox App by Google uses a swipe to remove items, where the Gmail App by Google uses a swipe to 'queue' an item for dismisal, but not dismissing it until the user makes another interaction such as scrolling or clicking another email. A 'closeAllItems()' method was added in our Managers, as well as a minor fix that was needed by adding 'shown layouts' correctly in our SwipeListener.
1 parent 7ea40c5 commit 418898c

File tree

13 files changed

+259
-273
lines changed

13 files changed

+259
-273
lines changed

demo/build.gradle

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
apply plugin: 'com.android.application'
22

33
repositories {
4-
maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
4+
jcenter()
55
}
66

77
android {
@@ -29,6 +29,6 @@ dependencies {
2929
compile 'com.daimajia.easing:library:1.0.0@aar'
3030
compile 'com.daimajia.androidanimations:library:1.1.2@aar'
3131
compile 'com.nineoldandroids:library:2.4.0'
32-
compile 'org.lucasr.twowayview:core:1.0.0-SNAPSHOT@aar'
33-
compile 'org.lucasr.twowayview:layouts:1.0.0-SNAPSHOT@aar'
32+
// This dude gave a shoutout to you (daimajia) on his github page:
33+
compile 'jp.wasabeef:recyclerview-animators:1.0.3@aar'
3434
}

demo/src/main/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
xmlns:tools="http://schemas.android.com/tools"
44
package="com.daimajia.swipedemo">
55

6-
<uses-sdk tools:overrideLibrary="org.lucasr.twowayview, org.lucasr.twowayview.widget" />
6+
<uses-sdk tools:overrideLibrary="org.lucasr.twowayview, org.lucasr.twowayview.widget, jp.wasabeef.recyclerview" />
77

88
<application
99
android:allowBackup="true"

demo/src/main/java/com/daimajia/swipedemo/RecyclerViewExample.java

Lines changed: 22 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -4,41 +4,39 @@
44
import android.app.Activity;
55
import android.content.Context;
66
import android.content.Intent;
7-
import android.graphics.drawable.Drawable;
87
import android.os.Build;
98
import android.os.Bundle;
9+
import android.support.v7.widget.LinearLayoutManager;
1010
import android.support.v7.widget.RecyclerView;
1111
import android.util.Log;
1212
import android.view.Menu;
1313
import android.view.MenuItem;
14-
import android.view.MotionEvent;
15-
import android.view.View;
16-
import android.widget.Toast;
1714

1815
import com.daimajia.swipe.util.Attributes;
1916
import com.daimajia.swipedemo.adapter.RecyclerViewAdapter;
20-
import com.daimajia.swipedemo.adapter.RecyclerViewAdvancedAdapter;
21-
import com.daimajia.swipedemo.adapter.util.RecyclerItemClickListener;
22-
23-
import org.lucasr.twowayview.ItemClickSupport;
24-
import org.lucasr.twowayview.TwoWayLayoutManager;
25-
import org.lucasr.twowayview.widget.DividerItemDecoration;
26-
import org.lucasr.twowayview.widget.ListLayoutManager;
17+
import com.daimajia.swipedemo.adapter.util.DividerItemDecoration;
2718

2819
import java.util.ArrayList;
2920
import java.util.Arrays;
3021

22+
import jp.wasabeef.recyclerview.animators.FadeInLeftAnimator;
23+
3124
public class RecyclerViewExample extends Activity {
3225

26+
/**
27+
* RecyclerView: The new recycler view replaces the list view. Its more modular and therefore we
28+
* must implement some of the functionality ourselves and attach it to our recyclerview.
29+
* <p/>
30+
* 1) Position items on the screen: This is done with LayoutManagers
31+
* 2) Animate & Decorate views: This is done with ItemAnimators & ItemDecorators
32+
* 3) Handle any touch events apart from scrolling: This is now done in our adapter's ViewHolder
33+
*/
34+
3335
private RecyclerView recyclerView;
3436
private RecyclerView.Adapter mAdapter;
35-
// RecyclerView.LayoutManager: https://developer.android.com/reference/android/support/v7/widget/RecyclerView.LayoutManager.html
36-
// Our LayoutManager uses: https://github.com/lucasr/twoway-view to help with decoration and can be used for a more advanced config as well.
37-
// Read http://lucasr.org/2014/07/31/the-new-twowayview/ for a better understanding
38-
private RecyclerView.LayoutManager mLayoutManager;
3937

40-
private Context mContext = this;
4138
private ArrayList<String> mDataSet;
39+
4240
@Override
4341
protected void onCreate(Bundle savedInstanceState) {
4442
super.onCreate(savedInstanceState);
@@ -51,46 +49,22 @@ protected void onCreate(Bundle savedInstanceState) {
5149
}
5250
}
5351

54-
/**
55-
* Sample data.
56-
*/
57-
String[] adapterData = new String[]{"Alabama", "Alaska", "Arizona", "Arkansas", "California", "Colorado", "Connecticut", "Delaware", "Florida", "Georgia", "Hawaii", "Idaho", "Illinois", "Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana", "Maine", "Maryland", "Massachusetts", "Michigan", "Minnesota", "Mississippi", "Missouri", "Montana", "Nebraska", "Nevada", "New Hampshire", "New Jersey", "New Mexico", "New York", "North Carolina", "North Dakota", "Ohio", "Oklahoma", "Oregon", "Pennsylvania", "Rhode Island", "South Carolina", "South Dakota", "Tennessee", "Texas", "Utah", "Vermont", "Virginia", "Washington", "West Virginia", "Wisconsin", "Wyoming"};
52+
// Layout Managers:
53+
recyclerView.setLayoutManager(new LinearLayoutManager(this));
5854

59-
// Uses a ListLayout manager from TwoWayView Lib:
60-
mLayoutManager = new ListLayoutManager(this, TwoWayLayoutManager.Orientation.VERTICAL);
61-
recyclerView.setLayoutManager(mLayoutManager);
62-
final Drawable divider = getResources().getDrawable(R.drawable.divider);
63-
recyclerView.addItemDecoration(new DividerItemDecoration(divider));
55+
// Item Decorator:
56+
recyclerView.addItemDecoration(new DividerItemDecoration(getResources().getDrawable(R.drawable.divider)));
57+
recyclerView.setItemAnimator(new FadeInLeftAnimator());
6458

59+
// Adapter:
60+
String[] adapterData = new String[]{"Alabama", "Alaska", "Arizona", "Arkansas", "California", "Colorado", "Connecticut", "Delaware", "Florida", "Georgia", "Hawaii", "Idaho", "Illinois", "Indiana", "Iowa", "Kansas", "Kentucky", "Louisiana", "Maine", "Maryland", "Massachusetts", "Michigan", "Minnesota", "Mississippi", "Missouri", "Montana", "Nebraska", "Nevada", "New Hampshire", "New Jersey", "New Mexico", "New York", "North Carolina", "North Dakota", "Ohio", "Oklahoma", "Oregon", "Pennsylvania", "Rhode Island", "South Carolina", "South Dakota", "Tennessee", "Texas", "Utah", "Vermont", "Virginia", "Washington", "West Virginia", "Wisconsin", "Wyoming"};
6561
mDataSet = new ArrayList<String>(Arrays.asList(adapterData));
6662
mAdapter = new RecyclerViewAdapter(this, mDataSet);
67-
6863
((RecyclerViewAdapter) mAdapter).setMode(Attributes.Mode.Single);
6964
recyclerView.setAdapter(mAdapter);
7065

7166
/* Listeners */
72-
recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(this, new RecyclerItemClickListener.OnItemClickListener() {
73-
@Override
74-
public void onItemClick(View view, int position) {
75-
Toast.makeText(mContext, "Clicked:" + position, Toast.LENGTH_SHORT).show();
76-
}
77-
}));
7867
recyclerView.setOnScrollListener(onScrollListener);
79-
80-
81-
// TODO: Item Selection Support for RecyclerView
82-
// recyclerView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
83-
// @Override
84-
// public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
85-
// Log.e("ListView", "onItemSelected:" + position);
86-
// }
87-
//
88-
// @Override
89-
// public void onNothingSelected(AdapterView<?> parent) {
90-
// Log.e("ListView", "onNothingSelected:");
91-
// }
92-
// });
93-
9468
}
9569

9670
/**
@@ -106,6 +80,7 @@ public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
10680
@Override
10781
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
10882
super.onScrolled(recyclerView, dx, dy);
83+
// Could hide open views here if you wanted. //
10984
}
11085
};
11186

demo/src/main/java/com/daimajia/swipedemo/adapter/RecyclerViewAdapter.java

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package com.daimajia.swipedemo.adapter;
22

33
import android.content.Context;
4+
import android.support.v7.widget.RecyclerView;
5+
import android.util.Log;
46
import android.view.LayoutInflater;
57
import android.view.View;
68
import android.view.ViewGroup;
9+
import android.widget.Button;
710
import android.widget.TextView;
811
import android.widget.Toast;
912

@@ -17,57 +20,76 @@
1720

1821
import java.util.ArrayList;
1922

20-
public class RecyclerViewAdapter extends RecyclerSwipeAdapter {
23+
public class RecyclerViewAdapter extends RecyclerSwipeAdapter<RecyclerViewAdapter.SimpleViewHolder> {
2124

22-
public static class SimpleViewHolder extends ViewHolder{
25+
public static class SimpleViewHolder extends RecyclerView.ViewHolder {
2326
SwipeLayout swipeLayout;
2427
TextView textViewPos;
2528
TextView textViewData;
29+
Button buttonDelete;
2630

2731
public SimpleViewHolder(View itemView) {
2832
super(itemView);
2933
swipeLayout = (SwipeLayout) itemView.findViewById(R.id.swipe);
3034
textViewPos = (TextView) itemView.findViewById(R.id.position);
3135
textViewData = (TextView) itemView.findViewById(R.id.text_data);
36+
buttonDelete = (Button) itemView.findViewById(R.id.delete);
37+
38+
itemView.setOnClickListener(new View.OnClickListener() {
39+
@Override
40+
public void onClick(View view) {
41+
Log.d(getClass().getSimpleName(), "onItemSelected: " + textViewData.getText().toString());
42+
Toast.makeText(view.getContext(), "onItemSelected: " + textViewData.getText().toString(), Toast.LENGTH_SHORT).show();
43+
}
44+
});
3245
}
3346
}
3447

3548
private Context mContext;
3649
private ArrayList<String> mDataset;
3750

38-
protected SwipeItemRecyclerMangerImpl mItemManger = new SwipeItemRecyclerMangerImpl(this);
51+
//protected SwipeItemRecyclerMangerImpl mItemManger = new SwipeItemRecyclerMangerImpl(this);
3952

4053
public RecyclerViewAdapter(Context context, ArrayList<String> objects) {
41-
super(context, objects);
4254
this.mContext = context;
4355
this.mDataset = objects;
4456
}
4557

4658
@Override
47-
public ViewHolder createRecyclerViewHolder(ViewGroup parent, int viewType) {
59+
public SimpleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
4860
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_item, parent, false);
4961
return new SimpleViewHolder(view);
5062
}
5163

5264
@Override
53-
public void bindRecyclerViewHolder(ViewHolder viewHolder, final int position) {
54-
SimpleViewHolder simpleViewHolder = (SimpleViewHolder) viewHolder;
65+
public void onBindViewHolder(final SimpleViewHolder viewHolder, final int position) {
5566
String item = mDataset.get(position);
56-
simpleViewHolder.swipeLayout.setShowMode(SwipeLayout.ShowMode.LayDown);
57-
simpleViewHolder.swipeLayout.addSwipeListener(new SimpleSwipeListener() {
67+
viewHolder.swipeLayout.setShowMode(SwipeLayout.ShowMode.LayDown);
68+
viewHolder.swipeLayout.addSwipeListener(new SimpleSwipeListener() {
5869
@Override
5970
public void onOpen(SwipeLayout layout) {
6071
YoYo.with(Techniques.Tada).duration(500).delay(100).playOn(layout.findViewById(R.id.trash));
6172
}
6273
});
63-
simpleViewHolder.swipeLayout.setOnDoubleClickListener(new SwipeLayout.DoubleClickListener() {
74+
viewHolder.swipeLayout.setOnDoubleClickListener(new SwipeLayout.DoubleClickListener() {
6475
@Override
6576
public void onDoubleClick(SwipeLayout layout, boolean surface) {
6677
Toast.makeText(mContext, "DoubleClick", Toast.LENGTH_SHORT).show();
6778
}
6879
});
69-
simpleViewHolder.textViewPos.setText((position + 1) + ".");
70-
simpleViewHolder.textViewData.setText(item);
80+
viewHolder.buttonDelete.setOnClickListener(new View.OnClickListener() {
81+
@Override
82+
public void onClick(View view) {
83+
mItemManger.removeShownLayouts(viewHolder.swipeLayout);
84+
mDataset.remove(position);
85+
notifyItemRemoved(position);
86+
notifyItemRangeChanged(position, mDataset.size());
87+
mItemManger.closeAllItems();
88+
Toast.makeText(view.getContext(), "Deleted " + viewHolder.textViewData.getText().toString() + "!", Toast.LENGTH_SHORT).show();
89+
}
90+
});
91+
viewHolder.textViewPos.setText((position + 1) + ".");
92+
viewHolder.textViewData.setText(item);
7193
mItemManger.bind(viewHolder.itemView, position);
7294
}
7395

demo/src/main/java/com/daimajia/swipedemo/adapter/RecyclerViewAdvancedAdapter.java

Lines changed: 0 additions & 135 deletions
This file was deleted.

0 commit comments

Comments
 (0)