Skip to content
This repository was archived by the owner on Nov 26, 2025. It is now read-only.

Commit a044762

Browse files
swanhtet1992denizmveli
authored andcommitted
onItemClick added
1 parent 28d2a6b commit a044762

2 files changed

Lines changed: 56 additions & 2 deletions

File tree

library/src/main/java/com/etsy/android/grid/ExtendableListView.java

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ public abstract class ExtendableListView extends AbsListView {
143143
private FlingRunnable mFlingRunnable;
144144

145145
protected boolean mClipToPadding;
146+
private PerformClick mPerformClick;
146147

147148
/**
148149
* A class that represents a fixed view in a list, for example a header at the top
@@ -939,7 +940,15 @@ private boolean onTouchUpScrolling(final MotionEvent event) {
939940
}
940941

941942
private boolean onTouchUpTap(final MotionEvent event) {
942-
// TODO : implement onListItemClick stuff here
943+
if (mPerformClick == null) {
944+
invalidate();
945+
mPerformClick = new PerformClick();
946+
}
947+
final PerformClick performClick = mPerformClick;
948+
performClick.mClickMotionPosition = mMotionPosition;
949+
performClick.rememberWindowAttachCount();
950+
951+
performClick.run();
943952
return true;
944953
}
945954

@@ -2674,4 +2683,40 @@ public void onRestoreInstanceState(Parcelable state) {
26742683
}
26752684
requestLayout();
26762685
}
2686+
2687+
private class PerformClick extends WindowRunnnable implements Runnable {
2688+
int mClickMotionPosition;
2689+
2690+
public void run() {
2691+
if (mDataChanged) return;
2692+
2693+
final ListAdapter adapter = mAdapter;
2694+
final int motionPosition = mClickMotionPosition;
2695+
if (adapter != null && mItemCount > 0 &&
2696+
motionPosition != INVALID_POSITION &&
2697+
motionPosition < adapter.getCount() && sameWindow()) {
2698+
final View view = getChildAt(motionPosition); // a fix by @pboos
2699+
2700+
if (view != null) {
2701+
performItemClick(view, motionPosition + mFirstPosition, adapter.getItemId(motionPosition));
2702+
}
2703+
}
2704+
}
2705+
}
2706+
2707+
/**
2708+
* A base class for Runnables that will check that their view is still attached to
2709+
* the original window as when the Runnable was created.
2710+
*/
2711+
private class WindowRunnnable {
2712+
private int mOriginalAttachCount;
2713+
2714+
public void rememberWindowAttachCount() {
2715+
mOriginalAttachCount = getWindowAttachCount();
2716+
}
2717+
2718+
public boolean sameWindow() {
2719+
return hasWindowFocus() && getWindowAttachCount() == mOriginalAttachCount;
2720+
}
2721+
}
26772722
}

sample/src/main/java/com/etsy/android/sample/StaggeredGridActivity.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@
88
import android.view.LayoutInflater;
99
import android.view.View;
1010
import android.widget.AbsListView;
11+
import android.widget.AdapterView;
1112
import android.widget.TextView;
13+
import android.widget.Toast;
1214

1315
import com.etsy.android.grid.StaggeredGridView;
1416

15-
public class StaggeredGridActivity extends Activity implements AbsListView.OnScrollListener {
17+
public class StaggeredGridActivity extends Activity implements AbsListView.OnScrollListener, AbsListView.OnItemClickListener {
1618

1719
private static final String TAG = "StaggeredGridActivity";
1820
public static final String SAVED_DATA_KEY = "SAVED_DATA";
@@ -60,6 +62,8 @@ protected void onCreate(Bundle savedInstanceState) {
6062
mGridView.setAdapter(mAdapter);
6163

6264
mGridView.setOnScrollListener(this);
65+
66+
mGridView.setOnItemClickListener(this);
6367
}
6468

6569
@Override
@@ -100,4 +104,9 @@ private void onLoadMoreItems() {
100104
mAdapter.notifyDataSetChanged();
101105
mHasRequestedMore = false;
102106
}
107+
108+
@Override
109+
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
110+
Toast.makeText(getApplicationContext(), "Clicked: " + position, Toast.LENGTH_LONG).show();
111+
}
103112
}

0 commit comments

Comments
 (0)