(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를 상속받아 문제가 생기는 것 같은데 찾아보아도 딱히 해결방안이 안보여 글을 남기게 되었습니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)