Android 使文本视图显示为菜单项

Android 使文本视图显示为菜单项,android,xml,drop-down-menu,autocompletetextview,Android,Xml,Drop Down Menu,Autocompletetextview,我创建了一个autoCompleteTextView,其中显示了一些优惠 由于我找不到方法使autocompleteTextView的第一项固定且不可滚动,因此我在autocompleteTextView及其弹出窗口之间放置了一个TextView 正如你所看到的,TextView的视图与弹出菜单的视图不同,它不像我说的那么“3d”,或者没有阴影,但看起来不一样 是否有任何属性使其看起来像菜单项的一部分 我的xml是: <AutoCompleteTextView andro

我创建了一个
autoCompleteTextView
,其中显示了一些优惠

由于我找不到方法使
autocompleteTextView
的第一项固定且不可滚动,因此我在
autocompleteTextView
及其弹出窗口之间放置了一个
TextView

正如你所看到的,TextView的视图与弹出菜单的视图不同,它不像我说的那么“3d”,或者没有阴影,但看起来不一样

是否有任何属性使其看起来像菜单项的一部分

我的xml是:

<AutoCompleteTextView
        android:id="@+id/ATV_Title"
        android:dropDownVerticalOffset = "60dp"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:layout_marginStart="40dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="40dp"
        android:background="@drawable/btn_underline_gray"
        android:dropDownHeight="150dp"
        android:fontFamily="@font/assistant_semibold"
        android:gravity="center|start"
        android:hint="@string/ActivitySearch_Auto"
        android:imeOptions="actionSearch"
        android:inputType="text"
        android:paddingEnd="30dp"
        android:textColorHint="@color/colorGray"
        android:textSize="14sp"
        app:layout_constraintTop_toTopOf="parent" />

    <ImageButton
        android:id="@+id/Ib_Clear"
        android:layout_width="24dp"
        android:layout_height="40dp"
        android:layout_marginStart="8dp"
        android:background="@android:color/transparent"
        android:src="@drawable/ic_cancel"
        app:layout_constraintEnd_toEndOf="@+id/ATV_Title"
        app:layout_constraintTop_toTopOf="@+id/ATV_Title" />

    <TextView
        android:id="@+id/tv_addManually"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:layout_marginStart="40dp"
        android:layout_marginEnd="40dp"
        android:layout_marginBottom="16dp"
        android:background="@color/colorWhite"
        android:fontFamily="@font/assistant_semibold"
        android:hint="Cant find your result? Add manually"
        android:elevation="100dp"
        android:visibility="visible"
        android:paddingStart="18dp"
        android:gravity="center_vertical|start"
        android:textColor="@color/colorBlackText"
        android:textSize="14sp"
        app:layout_constraintTop_toBottomOf="@+id/ATV_Title"/>

我还尝试使用如下所示的自定义适配器来完成此工作,但没有成功:

public class AutoCompleteImageAdapter extends ArrayAdapter<String> implements Filterable {

private ArrayList<String> fullList;
private ArrayList<String> mOriginalValues;
private ArrayFilter mFilter;
private Boolean noResults;
private TextView tv_name;
private ImageView im_cover;
private List<String> url, id;

private StorageReference storageRef;
private FirebaseFirestore db;

public AutoCompleteImageAdapter(Context context, int resource, int textViewResourceId, List<String> objects, List<String> url, List<String> id, Boolean noResult) {

    super( context, resource, textViewResourceId, objects );
    fullList = (ArrayList<String>) objects;
    mOriginalValues = new ArrayList<String>( fullList );
    noResults = noResult;
    this.url = url;
    this.id = id;
}

@Override
public int getCount() {
    if (fullList.size() > 40) {
        return 40;
    } else {
        return fullList.size();
    }
}

@Override
public String getItem(int position) {
    return fullList.get( position );
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    db = FirebaseFirestore.getInstance();
    storageRef = FirebaseStorage.getInstance().getReference();

    View row = convertView;

    String id = this.id.get( position );
    LayoutInflater inflater = LayoutInflater.from( getContext() );

    if (row == null) {
        row = inflater.inflate( R.layout.item_auto_add, parent, false );
    }

    tv_name = (TextView) row.findViewById( R.id.item_drop );
    tv_name.setText( fullList.get( position ) );

    im_cover = row.findViewById( R.id.iv_itemCover );
    String Url = url.get( position );
    if (id.length() > AppConstants.UPLOADED_item_LENGTH) {
        storageRef.child( "/itemCovers/" + Url + "/" + Url + ".jpg" ).getDownloadUrl().addOnSuccessListener( new OnSuccessListener<Uri>() {
            @Override
            public void onSuccess(Uri uri) {
                Picasso.with( parent.getContext() ).load( uri ).resize( 110, 160 ).into( im_cover );
            }
        } ).addOnFailureListener( new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception exception) {
                Log.d( "ERROR", exception + "" );
            }
        } );
    } else {
        Picasso.with( parent.getContext() ).load( Uri.parse( Url ) ).error( R.drawable.ic_nocover ).resize( 110, 160 ).into( im_cover );
    }


    return row;

}

@Override
public Filter getFilter() {
    if (mFilter == null) {
        mFilter = new ArrayFilter();
    }
    return mFilter;
}

private class ArrayFilter extends Filter {
    private Object lock;

    @Override
    protected FilterResults performFiltering(CharSequence prefix) {
        FilterResults results = new FilterResults();

        if (mOriginalValues == null) {
            synchronized (lock) {
                mOriginalValues = new ArrayList<String>( fullList );
            }
        }

        if (prefix == null || prefix.length() == 0) {
            synchronized (lock) {
                ArrayList<String> list = new ArrayList<String>( mOriginalValues );
                results.values = list;
                results.count = list.size();
            }
        } else {
            final String prefixString = prefix.toString().toLowerCase();

            ArrayList<String> values = mOriginalValues;
            int count = values.size();

            ArrayList<String> newValues = new ArrayList<String>( count );

            for (int i = 0; i < count; i++) {
                String item = values.get( i );
                if (item.toLowerCase().contains( prefixString )) {
                    newValues.add( item );
                }

            }

            results.values = newValues;
            results.count = newValues.size();
        }

        return results;
    }

    @SuppressWarnings("unchecked")
    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {

        if (results.values != null) {
            fullList = (ArrayList<String>) results.values;
        } else {
            fullList = new ArrayList<String>();
        }
        if (results.count > 0) {
            notifyDataSetChanged();
        } else {
            notifyDataSetInvalidated();
        }
    }
}

public void clear() {
    if (fullList != null) {
        fullList.clear();
        notifyDataSetChanged();
    }
}
}
公共类AutoCompleteImageAdapter扩展ArrayAdapter实现可过滤{
私有ArrayList完整列表;
私人ArrayList mOriginalValues;
私人阵列过滤器;
私有布尔noResults;
私有文本视图tv_名称;
私人影像查看im_封面;
私有列表url,id;
私有存储引用storageRef;
私有FirebaseFirestore数据库;
公共自动完成图像适配器(上下文上下文、int资源、int文本视图资源id、列表对象、列表url、列表id、布尔值noResult){
超级(上下文、资源、textViewResourceId、对象);
fullList=(ArrayList)对象;
mOriginalValues=新的ArrayList(完整列表);
noResults=noResult;
this.url=url;
this.id=id;
}
@凌驾
public int getCount(){
如果(fullList.size()>40){
返回40;
}否则{
返回fullList.size();
}
}
@凌驾
公共字符串getItem(int位置){
返回完整列表。获取(位置);
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
db=FirebaseFirestore.getInstance();
storageRef=FirebaseStorage.getInstance().getReference();
视图行=转换视图;
字符串id=this.id.get(位置);
LayoutInflater充气器=LayoutInflater.from(getContext());
if(行==null){
行=充气机。充气(R.layout.item\u auto\u add,父项,false);
}
tv_name=(TextView)row.findViewById(R.id.item_drop);
tv_name.setText(fullList.get(position));
im_封面=第行findViewById(R.id.iv_itemCover);
字符串Url=Url.get(位置);
if(id.length()>AppConstants.UPLOADED_item_length){
storageRef.child(“/itemCovers/”+Url+“/”+Url+”.jpg”).getDownloadUrl().addOnSuccessListener(新OnSuccessListener()){
@凌驾
成功时的公共无效(Uri){
Picasso.with(parent.getContext()).load(uri).resize(110160).into(im_cover);
}
}).addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常){
Log.d(“错误”,异常+”);
}
} );
}否则{
Picasso.with(parent.getContext()).load(Uri.parse(Url)).error(R.drawable.ic_nocover)。resize(110160)。into(im_cover);
}
返回行;
}
@凌驾
公共过滤器getFilter(){
if(mFilter==null){
mFilter=新阵列过滤器();
}
返回过滤器;
}
私有类ArrayFilter扩展筛选器{
私有对象锁;
@凌驾
受保护的筛选器结果执行筛选(字符序列前缀){
FilterResults results=新的FilterResults();
if(mOriginalValues==null){
已同步(锁定){
mOriginalValues=新的ArrayList(完整列表);
}
}
if(prefix==null | | prefix.length()==0){
已同步(锁定){
ArrayList=新的ArrayList(MoriginalValue);
结果.值=列表;
results.count=list.size();
}
}否则{
最后一个字符串prefixString=prefix.toString().toLowerCase();
ArrayList值=mOriginalValues;
int count=values.size();
ArrayList newValues=新ArrayList(计数);
for(int i=0;i0){
notifyDataSetChanged();
}否则{
notifyDataSetionValidated();
}
}
}
公共空间清除(){
如果(完整列表!=null){
fullList.clear();
notifyDataSetChanged();
}
}
}
谢谢

为什么不将“tv\u addManually”添加到适配器的项目集?并给它一个不同的点击处理程序


例如,您可以检查是否单击了第一个项目,然后让用户手动添加。

您应该实现自己的AutoCompleteTextView扩展EditText,并通过setPromptView、setPromptPosition方法使用标题视图显示/隐藏ListPopupWindow

val popup = ListPopupWindow(context, attrs, defStyleAttr, defStyleRes)
popup.adapter = MyAdapter()


popup.setPromptView(fixedView)
popup.setPromptPosition(ListPopupWindow.POSITION_PROMPT_ABOVE)

因为如果它是适配器的一部分,它将像任何其他项目一样滚动。因为我找不到一种方法将它作为一个静态的头,所以我决定尝试这样的方法。嗨,我尝试实现自定义适配器(更新了我的问题)但是没有成功,因为我觉得所有的过滤器都不一样,所以我认为可以像上面所说的那样使用简单的选项。我说你要实现自定义的AutoCompleteTextView而不是Adapterok,那么你介意给出一个更完整的答案来证明你的意思吗?打开Android库的AutoCompleteTextView类。在那里你可以看到私人popupWindow酒店。您应该编写相同的代码,但修改ListPopupIndo