안드로이드 개발 질문/답변
(글 수 45,052)
GestureDetector를 이용하여 스크롤될때의 Listener를 구현하려고 합니다
구현하고자 하는것은 리스트 오른편에 index를 구현하는 것인데요
touch하면 정상적으로 잘 동작합니다. 다만 스크롤할때를 위하여 SimpleOnGestureListener를 구현해두었는데요
이 부분으로 진입하지를 않습니다.
즉, OnScroll안에 Log를 찍어봐도 나타나지 않는걸로 봐서 이부분이 아예 실행이 되지 않는것 같습니다.
아직 안드로이드의 실행순서에 익숙하지 못합니다 그렇기 때문에 이 부분이 호출되지 않는 이유를 잘 모르겠습니다.
고수님들의 조언을 부탁드립니다 ㅠㅠ
public class Friends extends Activity{
private static final String TAG = "ARtalk";
public static final int NUMBER = 0;
public static final int NAME = 1;
HttpConnect m_httpConnect;
public static final String RESULT = "com.arvision.artalk.main.Friends";
private ListView lstFriendView;
private ArrayList<FriendsList> alFriends;
private ArrayList<FriendsList> connectedFriends;
private FriendsAdapter friendsAdapter;
private GestureDetector mGestureDetector;
// x and y coordinates within our side index
private static float sideIndexX;
private static float sideIndexY; // height of side index
private int sideIndexHeight; // number of items in the side index
private int indexListSize;
private ArrayList<Object[]> indexList = null;
private SearchIndex searchIndex = new SearchIndex();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.friends);
//mGestureDetector = new GestureDetector(this);
IntentFilter filter = new IntentFilter(RESULT);
registerReceiver(mBR, filter);
ArrayList<String> alPhoneNumber=phoneBook(NUMBER);
ArrayList<String> alPhoneName=phoneBook(NAME);
int nListSize=alPhoneNumber.size();
alFriends = new ArrayList<FriendsList>();
connectedFriends = new ArrayList<FriendsList>();
lstFriendView = (ListView)findViewById(R.id.lstFriendView);
StringBuffer pn = new StringBuffer();
for (int i = 0; i < nListSize; i++) {
pn.append(alPhoneNumber.get(i).toString()+",");
alFriends.add(new FriendsList(alPhoneName.get(i).toString(), alPhoneNumber.get(i).toString(), R.drawable.ic_profile, "[오늘은 행복한 날입니다]"));
Log.i("######## contact ########", alPhoneNumber.get(i).toString());
}
m_httpConnect=new HttpConnect(this,this.getString(
R.string.server_url)+"/getFriendsList",
Consts.GET_FRIENDLIST_SUBTAB1,
pn.toString()
);
new Thread(m_httpConnect).start();
mGestureDetector = new GestureDetector(this, new SideIndexGestureListener());
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
if (mGestureDetector != null) {
return mGestureDetector.onTouchEvent(event);
} else {
return super.onTouchEvent(event);
}
}
public void onSearchIndex() {
LinearLayout sideIndex = (LinearLayout) findViewById(R.id.sideIndex);
sideIndexHeight = sideIndex.getHeight();
sideIndex.removeAllViews();
// TextView for every visible item
TextView tmpTV = null;
Log.e(TAG, "connectedFriends.size() : " + connectedFriends.size());
for(int i = 0; i < connectedFriends.size(); i++) {
Log.e(TAG, connectedFriends.get(i).m_sName);
} // we'll create the index list
String[] strArr = {"가", "나", "다", "라", "마", "바", "사", "아", "자", "차", "카", "타", "파", "하"};
if(strArr.length > 0)
indexList = searchIndex.createIndex(connectedFriends, strArr); // number of items in the index List
indexListSize = indexList.size(); // maximal number of item, which could be displayed
int indexMaxSize = (int) Math.floor(sideIndex.getHeight() / 10);
Log.e(TAG, "sideIndex.getHeight() : " + sideIndex.getHeight());
Log.e(TAG, "indexMaxSize : " + indexMaxSize);
Log.e(TAG, "indexListSize : " + indexListSize); int tmpIndexListSize = indexListSize; // handling that case when indexListSize > indexMaxSize
while (tmpIndexListSize > indexMaxSize)
{
tmpIndexListSize = tmpIndexListSize / 2;
} // computing delta (only a part of items will be displayed to save a
// place)
double delta = indexListSize / tmpIndexListSize;
Log.e(TAG, "delta : " + delta); String tmpLetter = null;
Object[] tmpIndexItem = null; // show every m-th letter
for (double i = 1; i <= indexListSize; i = i + delta)
{
tmpIndexItem = indexList.get((int) i - 1);
tmpLetter = tmpIndexItem[0].toString();
tmpTV = new TextView(this);
tmpTV.setText(tmpLetter);
tmpTV.setGravity(Gravity.CENTER);
tmpTV.setTextSize(10);
LayoutParams params = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT, 1);
tmpTV.setLayoutParams(params);
sideIndex.addView(tmpTV);
} // and set a touch listener for it
sideIndex.setOnTouchListener(new OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
// now you know coordinates of touch
sideIndexX = event.getX();
sideIndexY = event.getY();// Log.e(TAG, sideIndexX + "");
// and can display a proper item it country list
double pixelPerIndexItem = (double) sideIndexHeight / indexListSize;
Log.e(TAG, "pixelPerIndexItem : " + pixelPerIndexItem);
Log.e(TAG, "sideIndexY : " + sideIndexY);
int itemPosition = (int) (sideIndexY / pixelPerIndexItem);
Log.e(TAG, "itemPosition : " + itemPosition);
Object[] indexItem = indexList.get(itemPosition);
int indexMin = 0;
try {
indexMin = Integer.parseInt(indexItem[1].toString());
} catch (NullPointerException e) {
;
}
lstFriendView.setSelection(indexMin); return false;
}
});
}
class SideIndexGestureListener extends GestureDetector.SimpleOnGestureListener
{
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
{
Log.e(TAG, "sideIndexY : " + sideIndexY);
Log.e(TAG, "distanceY : " + distanceY);
// we know already coordinates of first touch
// we know as well a scroll distance
// LinearLayout sideIndex = (LinearLayout) findViewById(R.id.sideIndex);
sideIndexX = sideIndexX - distanceX;
sideIndexY = sideIndexY - distanceY;
// when the user scrolls within our side index
// we can show for every position in it a proper
// item in the country list
if (sideIndexX >= 0 && sideIndexY >= 0)
{
double pixelPerIndexItem = (double) sideIndexHeight / indexListSize;
Log.e(TAG, "pixelPerIndexItem : " + pixelPerIndexItem);
Log.e(TAG, "sideIndexY : " + sideIndexY);
int itemPosition = (int) (sideIndexY / pixelPerIndexItem);
Log.e(TAG, "itemPosition : " + itemPosition);
Object[] indexItem = indexList.get(itemPosition);
int indexMin = Integer.parseInt(indexItem[1].toString());
lstFriendView.setSelection(indexMin);
}
return super.onScroll(e1, e2, distanceX, distanceY);
}
}
// 브로드캐스트 리시버.
BroadcastReceiver mBR = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(RESULT)) {
if (m_httpConnect.getResult().size()>0) {
ArrayList<DaoGetFriendsList> friendsLists = ConvertArray(m_httpConnect.getResult());
// 전화번호를 비교하여 ListView에 뿌림
for(int i = 0; i < alFriends.size(); i++) {
for(int j = 0; j < friendsLists.size(); j++) {
if (alFriends.get(i).m_sPhone.equals(friendsLists.get(j).m_sUserPhone))
connectedFriends.add(new FriendsList(alFriends.get(i).m_sName, alFriends.get(i).m_sPhone, R.drawable.ic_profile, alFriends.get(i).m_sComment));
//connectedFriends.add(new FriendsList(friendsLists.get(j).m_sUserPhone, null, 0));
}
}
friendsAdapter = new FriendsAdapter(Friends.this, R.layout.friend_view, connectedFriends);
lstFriendView = (ListView)findViewById(R.id.lstFriendView);
lstFriendView.setAdapter(friendsAdapter);
if(connectedFriends.size() > 0)
onSearchIndex();
}
}
}
};



