Java 要在autoCompleteTextView中修复的第一个下拉项

Java 要在autoCompleteTextView中修复的第一个下拉项,java,android,android-arrayadapter,autocompletetextview,Java,Android,Android Arrayadapter,Autocompletetextview,我创建了一个应用程序,它有一个autoCompleteTextView,允许用户执行搜索查询 一旦他们开始输入,就会出现一个下拉列表并提供结果 现在,我想让第一个项目是固定的和可滚动的,它会说:找不到?手动添加 如何使建议的下拉列表中的第一项固定并始终显示 我的适配器代码是: public class AutoCompleteImageAdapter extends ArrayAdapter<String> implements Filterable { private

我创建了一个应用程序,它有一个
autoCompleteTextView
,允许用户执行搜索查询

一旦他们开始输入,就会出现一个下拉列表并提供结果

现在,我想让第一个项目是固定的和可滚动的,它会说:
找不到?手动添加

如何使建议的下拉列表中的第一项固定并始终显示

我的适配器代码是:

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();
}
}
}

谢谢

将其作为列表对象的第一项添加到列表中,然后再将其传递给适配器,然后使用要显示为搜索结果的数据填充列表,以便元素0始终为“找不到?手动添加”。这样,它总是在那里,其他项目也会发生变化


然后在项目单击侦听器中,您可以检查项目文本,如果它与“找不到?手动添加”匹配,则可以相应地执行操作。

我认为下面的代码在某种程度上解决了您的需求。试着去评论

  <AutoCompleteTextView
        android:layout_below="@+id/edit_description"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/project"
        android:id="@+id/edit_project"
        android:completionThreshold="0"
        android:completionHint="@string/message"
        android:inputType="text"
        />



此代码在列表底部向用户提供提示。

但添加后,它仍将与所有其他项目一样滚动。如果我错了,请纠正我。我希望它是一个粘性项目或标题,不知道如何称呼它