마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

AsyncTask가 GridVew의 onClickListener를 잡아먹어요(?)

0 추천

안녕하세요.

제가 onClickListener를 가지고있는 Custom Layout을 만들어서 GridView의 item으로 쓰려는데요,

일부 item에서 onClickListener가 꼬이는 현상이 생기는데 도저히 풀지 못하고 있습니다.

 

1. GridView에 Adapter 셋팅

2. AsyncTask에서 http로 목록을 구성할 데이터를 받아옴.

3. 데이터 크기만큼 Custom Layout을 만들어 GridView에 추가

4. GridView의 스크롤을 맨 아래까지 내리면 페이지를 추가하여 2번부터 반복

 

이런 과정을 거치는데요, 처음 1~3의 과정을 완료한 후에는 onClick이 잘 동작을 하나,

4번을 거치면 추가로 데이터가 로드될 때 GridView에 보여지던 item들의 절반은 onClick이 먹통이 됩니다.

Adapter는 아래와 같이 간단하게 짰구요,

public class GridAdapter extends BaseAdapter {
		@Override
		public int getCount() {
			return items.size();
		}

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

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

		@Override
		public View getView(final int position, View convertView, ViewGroup parent) {
			return items.get(position);
		}
	}

AsyncTask는 아래와 같습니다.

private class LoadList extends AsyncTask<Void, Void, ArrayList<ListItem>> {

//		ListItem item;

		JSONArray list;
		JSONObject row;
		Bitmap thumb;


		protected ArrayList<ListItem> doInBackground(Void... params) {

			final ArrayList<ListItem> tempItems = new ArrayList<>();

			list = getList(getCurrentPage());

			if (list.length() <= 0) {
				endOfList = true;
				return tempItems;
			}

			tempItems.clear();

			for (int i = 0; i < list.length(); i++) {

				try {

					final ListItem item = new ListItem(getActivity());
					row = list.getJSONObject(i);
					item.setData(row);
					item.setThumbnailBitmap(loadThumbnailFromUrl(item.getThumbnailUrl()));

					getActivity().runOnUiThread(new Runnable() {
						@Override
						public void run() {

							item.setThumbnail();
							item.setItems();
							item.setStars();
							tempItems.add(item);
						}
					});


				} catch (JSONException e) {
					e.printStackTrace();
				}
			}

			return tempItems;
		}

		@Override
		protected void onPreExecute() {
			super.onPreExecute();
			loading = true;
			dialog.setMax(100);
			dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
			dialog.setTitle("Loading list");
			dialog.setMessage("Loading list page " + getCurrentPage());
			dialog.setCancelable(false);
			dialog.show();
		}

		@Override
		protected void onPostExecute(final ArrayList<ListItem> result) {
			super.onPostExecute(result);


			items.addAll(result);
			gridAdapter.notifyDataSetChanged();
//				gridList.invalidate();
			loading = false;
			dialog.cancel();
			dialog.hide();
			dialog.dismiss();
			lastItemFlag = false;

			if (getCurrentPage() == 1) {
				gridList.smoothScrollToPosition(0);
			}

		}

		private JSONArray getList(int page) {

			String shelf_url = ((MainActivity) getActivity()).baseUrl + "/" + currentMenu + "/" + page;
			JSONObject json;

			try {
				HttpClient client = new DefaultHttpClient();
				client.getParams().setParameter(CoreProtocolPNames.USER_AGENT, "ComicDBApp");

				HttpGet request = new HttpGet(shelf_url);
				request.setHeader("http.agent", "ComicDBApp");
				request.setHeader("fb_id", ((MainActivity) getActivity()).facebookId);
				request.setHeader("fb_name", ((MainActivity) getActivity()).facebookName);

				HttpResponse response = client.execute(request);
				HttpEntity entity = response.getEntity();
				String content = EntityUtils.toString(entity);

				json = new JSONObject(content);
				return new JSONArray(json.getString("list"));
			} catch (MalformedURLException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} catch (JSONException e) {
				e.printStackTrace();
			}
			return null;
		}

		private Bitmap loadThumbnailFromUrl(String thumbnail_url) {
			try {				
				URL url = new URL(thumbnail_url);
				HttpURLConnection connection = (HttpURLConnection) url.openConnection();
				connection.setDoInput(true);
				connection.connect();
				InputStream input = connection.getInputStream();
				return BitmapFactory.decodeStream(input);
			} catch (MalformedURLException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
			return BitmapFactory.decodeResource(getActivity().getResources(), R.drawable.no_thumb);
		}

	}

 

안드로이드를 시작한지 얼마 되지 않아서 코드도 더럽고 잘 모르겠네요;;

도움을 부탁드립니다.

도움!!

Fil (120 포인트) 님이 2015년 4월 22일 질문

1개의 답변

0 추천
일단 어댑터의 getView에서 뷰를 만들어야 합니다.

https://github.com/susemi99/TestDBListView
쎄미 (162,410 포인트) 님이 2015년 4월 23일 답변
...