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"
/>
此代码在列表底部向用户提供提示。但添加后,它仍将与所有其他项目一样滚动。如果我错了,请纠正我。我希望它是一个粘性项目或标题,不知道如何称呼它