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

问题描述

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

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

enter image description here

现在,我想使第一个固定且不可滚动的项目显示为:can't find? add manually

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

我的适配器代码是:

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

谢谢

解决方法

将其作为第一项添加到List对象中,然后再将其传递给适配器,然后使用要显示为搜索结果的数据填充列表,以使元素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"
        />

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