(Android) Custom ListView안에 autoCompleteTextView 사용하려는데 에러가 납니다.
조회수 2332회
우선 텍스트뷰로 아래화면같이 만들었습니다. 자동완성도 하고 싶어서 autoCompleteTextView를 사용하였는데 오류가 생겨 여쭤보게 되었습니다.
부분적으로 보여드리면 이해하시기 어려우실 것 같아 전체 소스를 올렸습니다. 아래에 보시면 문제가 되는 부분만 발췌하여 올렸으니 중간부터 보셔도 될 것 같습니다.
화면은 아래와 같습니다.
<그림-1 구현 이미지>
위 화면의 소스는 아래와 같습니다.
package com.nnm.team91.mine;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
/**
* Created by tristan on 2016-11-10.
*/
public class ListViewAdapter extends BaseAdapter {
// Adapter에 추가된 데이터를 저장하기 위한 ArrayList
private ArrayList<ListViewItem> listViewItemList = new ArrayList<ListViewItem>();
private static final int ITEM_VIEW_TYPE_SEARCH = 0;
private static final int ITEM_VIEW_TYPE_LIST = 1;
private static final int ITEM_VIEW_TYPE_MAX = 2;
@Override
public int getViewTypeCount() {
return ITEM_VIEW_TYPE_MAX;
}
// position 위치의 아이템 타입 리턴.
@Override
public int getItemViewType(int position) {
return listViewItemList.get(position).getType();
}
// ListViewAdapter의 생성자
public ListViewAdapter() {
}
//Adapter에 사용되는 데이터의 개수를 리턴
@Override
public int getCount() {
return listViewItemList.size();
}
// 지정한 위치(position)에 있는 데이터 리턴 : 필수 구현
@Override
public Object getItem(int position) {
return listViewItemList.get(position);
}
// 지정한 위치에 있는 데이터와 관계된 아이템의 ID를 리턴 : 필수 구현
@Override
public long getItemId(int position) {
return position;
}
// position에 위치한 데이터를 화면에 출력하는데 사용될 View를 리턴. : 필수 구현
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final Context context = parent.getContext();
int viewType = getItemViewType(position);
// "listview_item" Layout을 inflate하여 convertView 참조 획득.
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// Data Set(ListViewItemList)에서 position에 위치한 데이터 참조 획득
ListViewItem listViewItem = listViewItemList.get(position);
switch (viewType) {
case ITEM_VIEW_TYPE_SEARCH:
convertView = inflater.inflate(R.layout.search_listviewitem, parent, false);
// 화면에 표시될 View(Layout이 inflate된)으로부터 위젯에 대한 참조 획득
ImageView imageView = (ImageView) convertView.findViewById(R.id.list_img);
TextView textView = (TextView) convertView.findViewById(R.id.list_txt);
ImageView crossView = (ImageView) convertView.findViewById(R.id.list_cross);
// 아이템 내 각 위젯에 데이터 반영
imageView.setImageDrawable(listViewItem.getSharpImg());
textView.setText(listViewItem.getTxtStr());
crossView.setImageDrawable(listViewItem.getCrossImg());
break;
case ITEM_VIEW_TYPE_LIST:
convertView = inflater.inflate(R.layout.search_listviewitem2, parent, false);
ImageView searchView = (ImageView) convertView.findViewById(R.id.search_img2);
TextView edtView = (TextView) convertView.findViewById(R.id.search_edt2);
searchView.setImageDrawable(listViewItem.getSearchImg());
edtView.setText(listViewItem.getEdtStr());
break;
}
}
return convertView;
}
// 아이템 데이터 추가를 위한 함수, 개발자가 원하는대로 작성 가능
public void addItem(Drawable sharp, String txt, Drawable cross) {
ListViewItem item = new ListViewItem();
item.setType(ITEM_VIEW_TYPE_SEARCH);
item.setSharpImg(sharp);
item.setTxtStr(txt);
item.setCrossImg(cross);
listViewItemList.add(item);
}
public void addItem(Drawable search, String edt) {
ListViewItem item = new ListViewItem();
item.setType(ITEM_VIEW_TYPE_LIST);
item.setSearchImg(search);
item.setEdtStr(edt);
listViewItemList.add(item);
}
}
위와 같이 작성을 하였는데 자동완성기능을 넣고 싶어서 블로그에서 보고 소스를 아래와 같이 작성하였습니다.
package com.nnm.team91.mine;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
import static android.R.id.edit;
/**
* Created by tristan on 2016-11-10.
*/
public class ListViewAdapter extends BaseAdapter {
// Adapter에 추가된 데이터를 저장하기 위한 ArrayList
private ArrayList<ListViewItem> listViewItemList = new ArrayList<ListViewItem>();
private static final int ITEM_VIEW_TYPE_SEARCH = 0;
private static final int ITEM_VIEW_TYPE_LIST = 1;
private static final int ITEM_VIEW_TYPE_MAX = 2;
String[] items = {"SM3", "SM5", "SM7", "SONATA", "AVANTE", "SOUL", "K5", "K7"};
@Override
public int getViewTypeCount() {
return ITEM_VIEW_TYPE_MAX;
}
// position 위치의 아이템 타입 리턴.
@Override
public int getItemViewType(int position) {
return listViewItemList.get(position).getType();
}
// ListViewAdapter의 생성자
public ListViewAdapter() {
}
//Adapter에 사용되는 데이터의 개수를 리턴
@Override
public int getCount() {
return listViewItemList.size();
}
// 지정한 위치(position)에 있는 데이터 리턴 : 필수 구현
@Override
public Object getItem(int position) {
return listViewItemList.get(position);
}
// 지정한 위치에 있는 데이터와 관계된 아이템의 ID를 리턴 : 필수 구현
@Override
public long getItemId(int position) {
return position;
}
// position에 위치한 데이터를 화면에 출력하는데 사용될 View를 리턴. : 필수 구현
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final Context context = parent.getContext();
int viewType = getItemViewType(position);
// "listview_item" Layout을 inflate하여 convertView 참조 획득.
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// Data Set(ListViewItemList)에서 position에 위치한 데이터 참조 획득
ListViewItem listViewItem = listViewItemList.get(position);
switch (viewType) {
case ITEM_VIEW_TYPE_SEARCH:
convertView = inflater.inflate(R.layout.search_listviewitem, parent, false);
// 화면에 표시될 View(Layout이 inflate된)으로부터 위젯에 대한 참조 획득
ImageView imageView = (ImageView) convertView.findViewById(R.id.list_img);
TextView textView = (TextView) convertView.findViewById(R.id.list_txt);
ImageView crossView = (ImageView) convertView.findViewById(R.id.list_cross);
// 아이템 내 각 위젯에 데이터 반영
imageView.setImageDrawable(listViewItem.getSharpImg());
textView.setText(listViewItem.getTxtStr());
crossView.setImageDrawable(listViewItem.getCrossImg());
break;
case ITEM_VIEW_TYPE_LIST:
convertView = inflater.inflate(R.layout.search_listviewitem2, parent, false);
ImageView searchView = (ImageView) convertView.findViewById(R.id.search_img2);
AutoCompleteTextView autoCompleteTextView = (AutoCompleteTextView) convertView.findViewById(R.id.search_edt2);
autoCompleteTextView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, items));
searchView.setImageDrawable(listViewItem.getSearchImg());
autoCompleteTextView.setText(listViewItem.getEdtStr());
break;
}
}
return convertView;
}
// 아이템 데이터 추가를 위한 함수, 개발자가 원하는대로 작성 가능
public void addItem(Drawable sharp, String txt, Drawable cross) {
ListViewItem item = new ListViewItem();
item.setType(ITEM_VIEW_TYPE_SEARCH);
item.setSharpImg(sharp);
item.setTxtStr(txt);
item.setCrossImg(cross);
listViewItemList.add(item);
}
public void addItem(Drawable search, String edt) {
ListViewItem item = new ListViewItem();
item.setType(ITEM_VIEW_TYPE_LIST);
item.setSearchImg(search);
item.setEdtStr(edt);
listViewItemList.add(item);
}
}
아래소스는 전체 소스에서 수정한 소스만 발췌한 것입니다.
case ITEM_VIEW_TYPE_LIST:
convertView = inflater.inflate(R.layout.search_listviewitem2, parent, false);
ImageView searchView = (ImageView) convertView.findViewById(R.id.search_img2);
AutoCompleteTextView autoCompleteTextView = (AutoCompleteTextView) convertView.findViewById(R.id.search_edt2);
autoCompleteTextView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, items));
searchView.setImageDrawable(listViewItem.getSearchImg());
autoCompleteTextView.setText(listViewItem.getEdtStr());
break;
AutoCompleteTextView로 소스를 바꿨는데
autoCompleteTextView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, items));
위 소스에서 Cannot resolve constructor ArrayAdapter 오류가 나옵니다.
<그림-2 안드로이드 오류 화면 캡쳐>
stackoverflow에 검색해 본 결과 this 부분이 문제이며, '액티비티이름.this', 'getvActivty()'로 변경해보라고 해서 변경했는데 문제가 해결되지 않았습니다 제가 추측하기론 BaseAdapter를 상속받아 문제가 생기는 것 같은데 찾아보아도 딱히 해결방안이 안보여 글을 남기게 되었습니다.
-
(•́ ✖ •̀)
알 수 없는 사용자
댓글 입력