지금 4일째 헤매고 있습니다 ㅠㅠ
답변 부탁드립니다
전에는 호출이되었던거 같은데 몇개 소스를 추가 확장하다보니
호출이 안되고 있습니다 이유를 도무지 모르겠어요 ㅠㅠ
public class JAEWON extends ListActivity {
...
listView = (ListView) this.getListView();
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
리스너는 두가지인데 스크롤리스너는 호출되어 잘되는데
listView.setOnScrollListener(new AbsListView.OnScrollListener() {
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
...
}
});
밑에 있는 리스트아이템클릭 리스너는 호출이 안되네요 -_-;;;;
public void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
Toast.makeText(JAEWON.this, "Click" + position, 1).show();
}
위에것이 안되어 밑에 처럼 따로 지정해서 만들어 주어도 실행이 안되네요 ㅠ.ㅠ
listView.setOnItemClickListener(clickListener);
ListView.OnItemClickListener clickListener = new ListView.OnItemClickListener(){
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
System.out.println("=========click======");
}
};
전체적인 로직은 버튼 클릭시
Thread에서 파싱등 내부작업을하고
그것이 끝나면 핸들러로 메세지를 보내어
핸들러에서
adapter.notifyDataSetChanged();
setListAdapter(adapter);
이런식으로 되는데 구동자체는 잘되는데 왜 onListItemClick( )는 호출을 못하는지 모르겠습니다
onListItemClick( )가 호출이 안되는 상황이 따로 있는지요..
풀소스 밑에 첨부합니다 꼭 좀 해결책좀 알려주세요 ㅠㅠ
package com.jaewon;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.ArrayList;
import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.method.LinkMovementMethod;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.inputmethod.InputMethodManager;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class JAEWON extends ListActivity {
ProgressDialog mProgress;
DownThread mThread;
String searchTxt = "";
EditText et;
private String SaveThumbnail[];//받아온 썸네일(스크롤시 이미 받은목록은 여기서 가져다 뿌려준다)
private ArrayList<MyItem> arr_MyItem = null;
private MyItem MyItem = null;
private URL url = null;
private String ConnectUrl = "";
private String startTag = "";
private MyListAdapter adapter;
private TextView tv;
private ImageView iv;
private Button btn;
private int strStart = 1; // 시작
private int strDisplay = 15;// 보여줄 목록 개수
ListView listView;
private int nTotal = 0;
private int mLexSIndex = 0;
private String mTitle = "";
private String mThumbnail = "";
private String mLink = "";
private String mText;
LinearLayout linear;
Animation ani1;
TextView emptyTV;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//리스트가 없을때 화면
emptyTV =(TextView)findViewById(R.id.emptystr);
emptyTV.setVisibility(TextView.INVISIBLE);
linear = (LinearLayout)findViewById(R.id.linear);
//==에디트텍스트
et = (EditText) findViewById(R.id.searchTxt);
et.setText(searchTxt);
et.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
String str = et.getText().toString();
if (str != "")
et.setText("");
}
});
//==
//==검색버튼
btn = (Button) findViewById(R.id.searchBtn);
btn.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
arr_MyItem = new ArrayList<MyItem>();
adapter = new MyListAdapter(JAEWON.this, R.layout.row,
arr_MyItem);
adapter.clear();
searchTxt = et.getText().toString();
if (searchTxt.equals("") || searchTxt == null) {
Toast.makeText(getBaseContext(), "검색어가 없습니다",
Toast.LENGTH_SHORT).show();
}
else {
linear.startAnimation(ani1);
//==키보드 사라지게==
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(et.getWindowToken(), 0);
//================
mProgress = ProgressDialog.show(JAEWON.this, "",
"loading...", true);
mThread = new DownThread(1);
mThread.start();
}
}
});
//==
//애니메이션을 불러온다
ani1 = AnimationUtils.loadAnimation(this, R.anim.rotate2);
listView = (ListView) this.getListView();
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
// listView.setOnItemClickListener(new OnItemClickListener() {
//
// @Override
// public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
// long arg3) {
//
// System.out.println("=========clickclickclickclick======");
//
// }
// });
//==리스트뷰 스크롤 리스너
listView.setOnScrollListener(new AbsListView.OnScrollListener() {
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
if (nTotal > totalItemCount) {
if (firstVisibleItem + visibleItemCount == totalItemCount) {
strStart = strStart + strDisplay;
// XMLParse3();
// setListAdapter(mNewsAdapter);
// setSelection(firstVisibleItem);
mProgress = ProgressDialog.show(JAEWON.this, "",
"loading...", true);
GetSearchList(strStart);
mAfterDown.sendEmptyMessage(1);
setSelection(firstVisibleItem);
}
}
// Toast.makeText(NaverSearchToolArray.this, "Total : " + nTotal
// + ", Curr : " + totalItemCount, 1);
// editText.setText("Total : " + nTotal + ", Curr : " +
// totalItemCount);
}
});
//==
listView.setOnItemClickListener(clickListener);
}
ListView.OnItemClickListener clickListener = new ListView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
System.out.println("=========click======");
}
};
/**
* XmlPullParser를 이용 xml을 읽는다.
*/
void GetSearchList(int position) {
strStart = position;
searchTxt = et.getText().toString();
String encode_searchTxt = "";
encode_searchTxt = URLEncoder.encode(searchTxt);
//==리스트 마지막 중복 처리
if(strDisplay>(nTotal - position)&&nTotal!=0){
strDisplay = nTotal - position;
}
//==
ConnectUrl = "http://openapi.naver.com/search?key=29b0a07ddfe7502eb2d0c585cd448a32&query="
+ encode_searchTxt
+ "&target=image&sort=sim&start="
+ strStart
+ "&display=" + strDisplay;
strDisplay =15;//리스트 마지막 중복 처리후 다시 돌려준다
System.out.println("ConnectUrl : " + ConnectUrl);
System.out.println("encode_searchTxt : " + encode_searchTxt);
//==해당 URL을 스트림으로 일어 가져온다(parser로 보냄)
try {
URL url = new URL(ConnectUrl);
InputStream in = url.openStream();
InputStreamReader reader = new InputStreamReader(in, "utf-8");
StringBuffer sb = new StringBuffer();
char[] cbuf = new char[512];
int len = 0;
while ((len = reader.read(cbuf, 0, cbuf.length)) > 0) {
sb.append(cbuf, 0, len);
}
parse(sb.toString());
} catch (Exception e1) {
e1.printStackTrace();
}
//==
}
/**
* 파싱
* @param xmlContent
*/
public void parse(String xmlContent) {
clear();
mText = xmlContent == null ? "" : xmlContent;
boolean isFirst = true;
mTitle = next("<title>", "</title>");
nTotal = Integer.parseInt(next("<total>", "</total>"));
mLink = next("<link>", "</link>");
mThumbnail = next("<thumbnail>", "</thumbnail>");
SaveThumbnail = new String[nTotal];
if(nTotal==0){
emptyTV.setVisibility(TextView.VISIBLE);
}
System.out.println("nTotal : " + nTotal);
while (mTitle != "") {
if (!isFirst) {
MyItem = new MyItem();
MyItem.title = mTitle.replace("<", "<").replace(">", ">")
.replace("<b>", "").replace("</b>", "").replace(
"<strong>", "").replace("</strong>", "")
.replace("&", "").replace("quot;", "").replace(
"#039;", "").replace("#39;", "").replace("lt;", "").replace("1gt;", "").replace("6gt;", "").replace("2gt;", "").replace("3gt;", "");
MyItem.link = mLink;
MyItem.thumbnail = mThumbnail.replace("<", "<").replace(
">", ">").replace("<b>", "").replace("</b>", "")
.replace("<strong>", "").replace("</strong>", "")
.replace("&", "");
arr_MyItem.add(MyItem);
}
isFirst = false;
mTitle = next("<title>", "</title>");
mLink = next("<link>", "</link>");
mThumbnail = next("<thumbnail>", "</thumbnail>");
}
}
/**
*xml의 해당태그의 내용을 가져온다
*/
protected String next(String strStart, String strEnd) {
int i1 = mText.indexOf(strStart, mLexSIndex);
int i2 = mText.indexOf(strEnd, mLexSIndex);
if (i1 < mLexSIndex || i1 >= i2) // not found.
return "";
String ret = mText.substring(i1 + strStart.length(), i2);
mLexSIndex = i2 + strEnd.length();
return ret;
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
// TODO Auto-generated method stub
super.onListItemClick(l, v, position, id);
Toast.makeText(JAEWON.this, "Click" + position, 1).show();
Log.i("==", "===========");
System.out.println("========click l: " + l + " v:" + v + " position:"
+ position + " id:" + id);
Log.e("==", "===========");
}
public void clear() {
nTotal = 0;
mTitle = "";
mLink = "";
mThumbnail = "";
mLexSIndex = 0;
}
/**
* adapter
*/
class MyListAdapter extends ArrayAdapter {
Context maincon;
LayoutInflater Inflater;
ArrayList<MyItem> arrMyItem;
int layout;
MyItem getMyItem;
public MyListAdapter(Context context, int textViewResourceId,
ArrayList<MyItem> _arrMyItem) {
super(context, textViewResourceId, _arrMyItem);
this.arrMyItem = _arrMyItem;
this.maincon = context;
Inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
layout = textViewResourceId;
getMyItem = new MyItem();
}
/**
* 항목하나를 출력하기위한 뷰생성하여 리턴
* ListView가 각 항목을 출력할때마다 호출한다
* position : 생성할 항목의순서값
* convertView : 이전에 생성된 차일드뷰
* parent : 뷰의 부모 즉 리스트뷰
*/
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.row, null);
}
getMyItem = (MyItem) arrMyItem.get(position);
if (getMyItem != null) {
tv = (TextView) v.findViewById(R.id.title);
iv = (ImageView) v.findViewById(R.id.thumb);
if (tv != null) {
// tv.setText(Html.fromHtml("<a href='" + getMyItem.link
// + "'>" + getMyItem.title+ "</a>"));
tv.setText(getMyItem.title);
tv.setMovementMethod(LinkMovementMethod.getInstance());
}
if (iv != null) {
if (getMyItem.thumbnail == null) {
}
else {
if(nTotal!=0){
if (SaveThumbnail[position] == null) {
iv.setImageResource(R.drawable.icon);
DrawableManager dm = new DrawableManager();
dm.fetchDrawableOnThread(getMyItem.thumbnail, iv);
SaveThumbnail[position] = getMyItem.thumbnail;
}
else {
try {
iv.setImageBitmap(
getRemoteImage(
new URL(SaveThumbnail[position])));
}
catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
}
}
}
return v;
}
}
/**
*URL을 bitmap으로
*/
public Bitmap getRemoteImage(final URL aURL) {
try {
final URLConnection conn = aURL.openConnection();
conn.connect();
final BufferedInputStream bis = new BufferedInputStream(conn
.getInputStream());
final Bitmap bm = BitmapFactory.decodeStream(bis);
bis.close();
return bm;
} catch (IOException e) {
// Log.d("DEBUGTAG", "Oh noooz an error...");
}
return null;
}
/**
* 백그라운드에서 작업할 쓰레드
*/
class DownThread extends Thread {
private int startPoint = 0;
public DownThread(int _startPoint) {
this.startPoint = _startPoint;
}
public void run() {
try {
GetSearchList(startPoint);
// //핸들러에 메세지를 보낸다
mAfterDown.sendEmptyMessage(0);
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 핸들러
*/
Handler mAfterDown = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
adapter.notifyDataSetChanged();
setListAdapter(adapter);
mProgress.dismiss();
break;
case 1:
mProgress.dismiss();
break;
}
}
};
}
ListView의 각 Row는 ImageView와 TextView를 하나씩 뿌려주고 있습니다
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:padding="5px"
android:layout_height="90px"
android:cacheColorHint="#00000000">
<ImageView android:id="@+id/thumb"
android:src="@drawable/icon"
android:scaleType="fitXY"
android:layout_alignParentRight="true"
android:layout_marginLeft="2px"
android:layout_height="76px"
android:layout_width="76px"
android:cropToPadding="true"
android:fadingEdge="horizontal"
android:fadingEdgeLength="10px"/>
<TextView android:id="@+id/title"
android:fadingEdge="horizontal"
android:textStyle="bold"
android:layout_height="wrap_content"
android:layout_toLeftOf="@id/thumb"
android:layout_width="fill_parent"
android:layout_centerVertical="true"/>
</RelativeLayout>