Android 使用带有文本和图像的自定义适配器在listview中搜索
我正在配置应用程序中的资源,以便使用自定义适配器在Listview中搜索。我在addTextChangedListener事件中使用EditText键入字符串并将文本传递给适配器,但它不起作用 我使用“implements Filterable”配置适配器,并使用“.setTextFilterEnabled(true)”启用Listview,但不起作用 我看到我必须实现“public Filter getFilter()”,但我不知道如何实现 当我在EditText中键入一些单词时,如“cel”或“12”,过滤器会起作用,但结果总是一样的:Listview中的前两项,无论Listview中有什么内容(Listview的内容是随机的) 下面是我的片段活动片段:Android 使用带有文本和图像的自定义适配器在listview中搜索,android,listview,android-fragments,android-adapter,android-filterable,Android,Listview,Android Fragments,Android Adapter,Android Filterable,我正在配置应用程序中的资源,以便使用自定义适配器在Listview中搜索。我在addTextChangedListener事件中使用EditText键入字符串并将文本传递给适配器,但它不起作用 我使用“implements Filterable”配置适配器,并使用“.setTextFilterEnabled(true)”启用Listview,但不起作用 我看到我必须实现“public Filter getFilter()”,但我不知道如何实现 当我在EditText中键入一些单词时,如“cel”
public class VideosFragment extends Fragment {
private ListView listView;
private ArrayList<String> idVideo = new ArrayList<>();
private ArrayList<String> titleVideo = new ArrayList<>();
private ArrayList<String> descVideo = new ArrayList<>();
private ArrayList<String> urlVideo = new ArrayList<>();
private ArrayList<String> channelTitle = new ArrayList<>();
private ArrayList<String> canalTitle = new ArrayList<>();
private ArrayList<String> canalId = new ArrayList<>();
private CustomFiltraCanaisAdapter customFiltraCanaisAdapter;
private EditText editText;
CustomVideoAdapter customVideoAdapter;
public VideosFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_videos, container, false);
// Configure Listview
listView = (ListView)view.findViewById(R.id.listView_videos);
//Create search parameters
editText = (EditText) view.findViewById(R.id.searchList);
listView.setTextFilterEnabled(true);
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
String text = editText.getText().toString().toLowerCase(Locale.getDefault());
VideosFragment.this.customVideoAdapter.getFilter().filter(text);
}
@Override
public void afterTextChanged(Editable editable) {
}
});
公共类VideosFragment扩展片段{
私有列表视图列表视图;
private ArrayList idVideo=new ArrayList();
private ArrayList titleVideo=新的ArrayList();
private ArrayList descVideo=new ArrayList();
私有ArrayList urlVideo=新ArrayList();
私有ArrayList channelTitle=新ArrayList();
私有ArrayList canalTitle=新ArrayList();
private ArrayList canalId=new ArrayList();
私有CustomFiltracAnisAdapter CustomFiltracAnisAdapter;
私人编辑文本;
自定义视频适配器;
公共视频片段(){
//必需的空公共构造函数
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
//为该碎片膨胀布局
视图=充气机。充气(R.layout.fragment\u视频,容器,错误);
//配置Listview
listView=(listView)view.findViewById(R.id.listView\u视频);
//创建搜索参数
editText=(editText)view.findViewById(R.id.searchList);
setTextFilterEnabled(true);
editText.addTextChangedListener(新的TextWatcher(){
@凌驾
更改前的公共无效(CharSequence CharSequence,int i,int i1,int i2){
}
@凌驾
public void onTextChanged(CharSequence CharSequence,int i,int i1,int i2){
String text=editText.getText().toString().toLowerCase(Locale.getDefault());
VideosFragment.this.customVideoAdapter.getFilter().filter(文本);
}
@凌驾
public void PostTextChanged(可编辑){
}
});
在我的CustomAdapter下面:
public class CustomVideoAdapter extends ArrayAdapter<String> implements Filterable {
private final Activity context;
private final ArrayList<String> videoTitle;
private final ArrayList<String> videoDesc;
private final ArrayList<String> videoId;
private final ArrayList<String> channelTitle;
private final ArrayList<String> imgurl;
public CustomVideoAdapter(Activity context, ArrayList<String> videoTitle,
ArrayList<String> videoId,
ArrayList<String> channelTitle,
ArrayList<String> imgurl,
ArrayList<String> videoDesc) {
super(context, R.layout.custom_lista_videos, videoTitle);
// TODO Auto-generated constructor stub
this.context = context;
this.videoTitle = videoTitle;
this.videoDesc = videoDesc;
this.videoId = videoId;
this.channelTitle = channelTitle;
this.imgurl = imgurl;
}
public View getView(int position,View view,ViewGroup parent) {
LayoutInflater inflater=context.getLayoutInflater();
View rowView=inflater.inflate(R.layout.custom_lista_videos, null,true);
TextView txtTitle = (TextView) rowView.findViewById(R.id.txtVideoTitle);
ImageView imgPhoto = (ImageView) rowView.findViewById(R.id.imgPhoto);
TextView txtChannelTitle = (TextView) rowView.findViewById(R.id.txtChannelTitle);
TextView txtVideoId = (TextView) rowView.findViewById(R.id.txtVideoId);
TextView txtVideoDesc = (TextView) rowView.findViewById(R.id.txtVideoDesc);
txtTitle.setText(videoTitle.get(position));
Picasso.with(context).load(imgurl.get(position)).into(imgPhoto);
txtChannelTitle.setText(channelTitle.get(position));
txtVideoId.setText(videoId.get(position));
txtVideoDesc.setText(videoDesc.get(position));
return rowView;
};
公共类CustomVideoAdapter扩展ArrayAdapter实现可过滤{
私人最终活动背景;
私人最终ArrayList视频标题;
私人最终ArrayList videoDesc;
私有最终ArrayList videoId;
私人最终ArrayList频道标题;
私人最终审裁名单;
公共CustomVideoAdapter(活动上下文、ArrayList videoTitle、,
ArrayList videoId,
ArrayList频道标题,
ArrayList imgurl,
ArrayList(视频描述){
超级(上下文、R.layout.custom_lista_视频、视频标题);
//TODO自动生成的构造函数存根
this.context=上下文;
this.videoTitle=视频标题;
this.videoDesc=videoDesc;
this.videoId=videoId;
this.channelTitle=channelTitle;
this.imgurl=imgurl;
}
公共视图getView(内部位置、视图视图、视图组父视图){
LayoutInflater充气器=上下文。getLayoutInflater();
查看行视图=充气机。充气(R.layout.custom\u lista\u视频,空,真);
TextView txtTitle=(TextView)rowView.findViewById(R.id.txtVideoTitle);
ImageView imgPhoto=(ImageView)rowView.findViewById(R.id.imgPhoto);
TextView txtChannelTitle=(TextView)rowView.findViewById(R.id.txtChannelTitle);
TextView txtVideoId=(TextView)rowView.findViewById(R.id.txtVideoId);
TextView txtVideoDesc=(TextView)rowView.findViewById(R.id.txtVideoDesc);
setText(videoTitle.get(position));
毕加索.with(context).load(imgurl.get(position)).into(imgPhoto);
txtChannelTitle.setText(channelTitle.get(position));
txtVideoId.setText(videoId.get(position));
txtVideoDesc.setText(videoDesc.get(position));
返回行视图;
};
少了什么
在一些帮助之后,我尝试创建(并使用)一个模型类,但仍然没有任何进展,因为我没有弄清楚如何更改“CustomAdapter”上的代码以正确使用此代码
我的模型课如下:
公共类筛选器视频适配器{
private ArrayList<String> storedVideoTitle = null;
private ArrayList<String> storedVideoDesc = null;
private ArrayList<String> storedVideoId = null;
private ArrayList<String> storedChannelTitle = null;
private ArrayList<String> storedImgurl = null;
public FilteredVideoAdapter(){
}
public ArrayList<String> getStoredVideoTitle() {
return storedVideoTitle;
}
public void setStoredVideoTitle(ArrayList<String> storedVideoTitle) {
this.storedVideoTitle = storedVideoTitle;
}
public ArrayList<String> getStoredVideoDesc() {
return storedVideoDesc;
}
public void setStoredVideoDesc(ArrayList<String> storedVideoDesc) {
this.storedVideoDesc = storedVideoDesc;
}
public ArrayList<String> getStoredVideoId() {
return storedVideoId;
}
public void setStoredVideoId(ArrayList<String> storedVideoId) {
this.storedVideoId = storedVideoId;
}
public ArrayList<String> getStoredChannelTitle() {
return storedChannelTitle;
}
public void setStoredChannelTitle(ArrayList<String> storedChannelTitle) {
this.storedChannelTitle = storedChannelTitle;
}
public ArrayList<String> getStoredImgurl() {
return storedImgurl;
}
public void setStoredImgurl(ArrayList<String> storedImgurl) {
this.storedImgurl = storedImgurl;
}
public FilteredVideoAdapter withFilteredVideoAdapter(
ArrayList<String> storedVideoTitle,
ArrayList<String> storedVideoDesc,
ArrayList<String> storedVideoId,
ArrayList<String> storedChannelTitle,
ArrayList<String> storedImgurl){
this.storedVideoTitle = storedVideoTitle;
this.storedVideoDesc = storedVideoDesc;
this.storedVideoId = storedVideoId;
this.storedChannelTitle = storedChannelTitle;
this.storedImgurl = storedImgurl;
return this;
}
private ArrayList storedVideoTitle=null;
私有ArrayList storedVideoDesc=null;
私有ArrayList storedVideoId=null;
私有ArrayList storedChannelTitle=null;
private ArrayList storedImgurl=null;
公共筛选器视频适配器(){
}
公共阵列列表getStoredVideoTitle(){
返回storedVideoTitle;
}
public void setStoredVideoTitle(ArrayList storedVideoTitle){
this.storedVideoTitle=storedVideoTitle;
}
公共阵列列表getStoredVideoDesc(){
返回storedVideoDesc;
}
公共无效setStoredVideoDesc(ArrayList storedVideoDesc){
this.storedVideoDesc=storedVideoDesc;
}
公共阵列列表getStoredVideoId(){
返回storedVideoId;
}
公共无效setStoredVideoId(ArrayList storedVideoId){
this.storedVideoId=storedVideoId;
}
公共阵列列表GetStoredChannel Title(){
返回StoredChannel标题;
}
公共无效SetStoredChannel Title(ArrayList StoredChannel Title){
this.storedChannelTitle=storedChannelTitle;
}
公共阵列列表getStoredImgurl(){
返回存储图;
}
public void setStoredImgurl(ArrayList storedImgurl){
this.storedImgurl=storedImgurl;
}
公共筛选器视频适配器带筛选器视频适配器(
ArrayList storedVideoTitle,
ArrayList storedVideoDesc,
ArrayList storedVideoId,
ArrayList StoredChannel标题,
ArrayList storedImgurl){
this.storedVideoTitle=storedVideoTitle;
这是我的
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
// If the constraint (search string/pattern) is null
// or its length is 0, i.e., its empty then
// we just set the `values` property to the
// original contacts list which contains all of them
if (constraint == null || constraint.length() == 0) {
results.values = videoTitle;;
results.count = videoTitle.size();
}
else {
// Some search copnstraint has been passed
// so let's filter accordingly
ArrayList<String> filteredTitle = new ArrayList<String>();
// We'll go through all the title and see
// if they contain the supplied string
for (String c : string) {
if (string.toUpperCase().contains( constraint.toString().toUpperCase() )) {
// if `contains` == true then add it
// to our filtered list
filteredTitle.add(c);
}
}
// Finally set the filtered values and size/count
results.values = filteredTitle;
results.count = filteredTitle.size();
}
// Return our FilterResults object
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
mList = (ArrayList<String>) results.values;
notifyDataSetChanged();
}
};
}
vendorSearchEt.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if (vendorSearchEt.getText().toString().length() == 0) {
if (vendorsListAdapter != null) {
vendorsListAdapter.filter("");
}
} else {
String text = vendorSearchEt.getText().toString().toLowerCase(Locale.getDefault());
if (vendorsListAdapter != null) {
vendorsListAdapter.filter(text);
}
}
}
});
public class VendorsListAdapter extends BaseAdapter {
// Declare Variables \\
Context mContext;
LayoutInflater inflater;
private List<VendorsList> vendorsLists = null;
private ArrayList<VendorsList> arrayListVendorsList = null;
AppCompatActivity act;
public VendorsListAdapter(Context context,
List<VendorsList> vendorsLists) {
mContext = context;
this.vendorsLists = vendorsLists;
arrayListVendorsList = new ArrayList<>(vendorsLists);
inflater = LayoutInflater.from(mContext);
act = (AppCompatActivity) context;
}
public class ViewHolder {
TextView vendorNameTv;
}
@Override
public int getCount() {
return vendorsLists.size();
}
@Override
public VendorsList getItem(int position) {
return vendorsLists.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
public View getView(final int position, View view, ViewGroup parent) {
final ViewHolder holder;
if (view == null) {
holder = new ViewHolder();
view = inflater.inflate(R.layout.lv_items_vendors_list, null);
holder.vendorNameTv = view.findViewById(R.id.lv_items_vendors_name_tv);
holder.vendorNameTv.setTypeface(StaticMethods.customFont(act, "Quicksand-Regular.otf"));
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
holder.vendorNameTv.setText(vendorsLists.get(position).getVendorName());
return view;
}
/**
* Filter Class for item searching
*
* @param charText Text to be searched
*/
public void filter(String charText) {
charText = charText.toLowerCase(Locale.getDefault());
vendorsLists.clear();
if (charText.length() == 0) {
vendorsLists.addAll(arrayListVendorsList);
} else {
for (VendorsList vendorsList : arrayListVendorsList) {
if (vendorsList.getVendorName().toLowerCase(Locale.getDefault())
.contains(charText)) {
vendorsLists.add(vendorsList);
}
}
}
notifyDataSetChanged();
}}