问题描述
我创建了一个具有autoCompleteTextView
的应用程序,以允许用户执行搜索查询。
现在,我想使第一个固定且不可滚动的项目显示为: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"
/>
此代码在列表底部向用户提示。