<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:padding="6dip">
<ImageView
android:id="@+id/thumb"
android:background="@drawable/thumb"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_marginRight="6dip"
android:layout_marginTop="2dip"
android:layout_marginBottom="2dip"/>
<LinearLayout
android:orientation="vertical"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="fill_parent">
<TextView
android:id="@+id/custom_title"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:textColor="@color/black"
android:gravity="center_vertical"
/>
<TextView
android:id="@+id/desc"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:textColor="@color/darkgray"
android:textStyle="italic"
android:singleLine="true"
android:ellipsize="marquee"
/>
</LinearLayout>
这是customListAdapter的代码(在第一个链接之后)
public class CustomListAdapter extends ArrayAdapter implements Filterable{
private static ArrayList<CustomListItem> searchArrayList;
private static ArrayList<CustomListItem> subItems;
private PTypeFilter filter;
private LayoutInflater mInflater;
public CustomListAdapter(Context context, int textViewResourceId, ArrayList<CustomListItem> results) {
super(context,textViewResourceId, results);
searchArrayList = results;
mInflater = LayoutInflater.from(context);
}
public int getCount() {
return searchArrayList.size();
}
public Object getItem(int position) {
return searchArrayList.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.custom_row, null);
holder = new ViewHolder();
holder.txtTitle = (TextView) convertView.findViewById(R.id.custom_title);
holder.txtDesc = (TextView) convertView.findViewById(R.id.desc);
holder.thumb = (ImageView) convertView.findViewById(R.id.thumb);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.txtTitle.setText(searchArrayList.get(position).getTitle());
holder.txtDesc.setText(searchArrayList.get(position).getDesc());
holder.thumb.setImageBitmap(searchArrayList.get(position).getThumb());
//holder.thumb.setBackgroundColor(Color.BLACK);
return convertView;
}
static class ViewHolder {
TextView txtTitle;
TextView txtDesc;
ImageView thumb;
}
@Override
public Filter getFilter() {
Log.i("CustomListAdapter", "testing filter");
if (filter == null){
filter = new PTypeFilter();
}
return filter;
}
private class PTypeFilter extends Filter{
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence prefix,
FilterResults results) {
// NOTE: this function is *always* called from the UI thread.
subItems = (ArrayList<CustomListItem>)results.values;
notifyDataSetChanged();
}
@SuppressWarnings("unchecked")
protected FilterResults performFiltering(CharSequence prefix) {
// NOTE: this function is *always* called from a background thread, and
// not the UI thread.
FilterResults results = new FilterResults();
ArrayList<CustomListItem> i = new ArrayList<CustomListItem>();
if (prefix!= null && prefix.toString().length() > 0) {
for (int index = 0; index < searchArrayList.size(); index++) {
CustomListItem si = searchArrayList.get(index);
if(si.toString().compareTo(prefix.toString()) == 0){
i.add(si);
}
}
results.values = i;
results.count = i.size();
}
else{
synchronized (searchArrayList){
results.values = searchArrayList;
results.count = searchArrayList.size();
}
}
return results;
}
}
}
在我的主要活动中,我这样调用自定义基适配器:
adapter = new CustomListAdapter(this, R.id.custom_title, DATA);
setListAdapter(adapter);
(不能100%确定r.id.custom_title
是我应该放在那里的id。
未筛选ListView
是因为您在子项
上设置了筛选结果,而适配器类中未使用该子项,因此对NotifyDataSetChanged
的调用将不起作用,因为从适配器的角度来看,数据是完整的。使用另一个列表保存旧值是正确的,它们将是必需的,这样您就可以找到所有的旧值。要解决此问题,请添加以下行:
subItems = new ArrayList<CustomListItem>(searchArrayList);
在适配器的构造函数中,这样您就有了完整值的副本以供以后使用。然后在publishResults
方法中使用SearcharrayList
列表,因为它是支持适配器的列表:
searchArrayList = (ArrayList<CustomListItem>)results.values;
notifyDataSetChanged();
则在PerformFiltering
方法中:
if (prefix!= null && prefix.toString().length() > 0) {
// use the initial values !!!
for (int index = 0; index < subItems.size(); index++) {
CustomListItem si = subItems.get(index);
final int length = prefix.length();
// if you compare the Strings like you did it will never work as you compare the full item string(you'll have a match only when you write the EXACT word)
// keep in mind that you take in consideration capital letters!
if(si.toString().substring(0, prefixLength).compareTo(prefix.toString()) == 0){
i.add(si);
}
}
results.values = i;
results.count = i.size();
}
else{
// revert to the old values
synchronized (searchArrayList){
results.values = subItems;
results.count = subItems.size();
}
}
我希望它管用。
(不能100%确定r.id.custom_title是我应该放在那里的id。
这并不重要,因为您使用自己的自定义适配器。
不管怎样,关于我的问题:有人愿意编写一个非常、非常、非常、通用、直接和简单的自定义ArrayAdapter,该ArrayAdapter需要两个字符串值,可以与ListView一起使用吗?…或者,尝试调试我的尝试,希望找到我的问题所在。 任何帮助都很感激,谢谢。 我已经包括了我知道需要的代码,但我一直在与其他所有东西罢工。 错误:(20,9)错误:没有为ArrayAdapter找到合适的构造函数(上
这是我设置适配器的方式: 我正在寻找一个解决方案,从昨天开始,我已经阅读了所有关于StackOverflow的帖子,但没有一个与我的问题相匹配。所以我想知道,它是否可以来自LinkedHashMap<...> 编辑:这是我的布局r.layout.etat_piece_item
在自定义arrayAdapter中实现自定义getFilter时遇到问题。实际上,我不知道如何实现它。尝试了各种代码,但仍然没有成功。这是我的自定义阵列适配器。 这是ListTO课程。 这是布局图。 这里的搜索关键字来自“inputSearch”编辑文本。 这是文本更改的侦听器。 谢谢
存储在Django模型中的元素如下 示例数据如下: . 结果:找到对象- 结果:找到对象- 结果:找到对象- 结果:未找到对象 如何使用过滤器和正则表达式进行这些查询?
我正在使用高级自定义字段插件,我试图通过分类字段过滤一些自定义帖子,修改WP_Query: 如果我尝试通过文本字段过滤一切正常,WP_Query被修改。但是当字段是一个分类法字段时,我不知道应该传递什么参数,因为它是一个对象。我尝试了分类法名称和分类法ID,但不起作用。 是否可以通过分类字段进行筛选?我应该传递的什么参数?谢谢! 更新-结构: 自定义帖子:“递归操作系统” 自定义分类Slug:'r
我创建了一个自定义筛选器,用于获取令牌,然后用与令牌相关的角色填充身份验证对象 然后,我将该过滤器添加到springsecuritycontext中,如下所示: 应用程序已经存在,我只是尝试添加Spring Security层。Spring Security版本为4.2.3。在尝试实现此功能的几天后,不会加载,因此不会筛选任何请求。请帮帮忙。