我可以通过我的recyclerView搜索,但结果是,当点击搜索项目是受布局位置的影响。例如,我有
当我搜索任天堂时,任天堂只出现在第一位。当我点击任天堂时,它会给我提供Mac的详细信息。当我搜索像Nint这样的东西时,它会显示任天堂和任天堂,这是很酷的。但后来,由于任天堂加显然是在第二位,当我点击它,它给我详细的任天堂。为什么搜索不影响布局位置?
活性
public override bool OnCreateOptionsMenu(IMenu menu)
{
MenuInflater.Inflate(Resource.Menu.top_menus, menu);
var item = menu.FindItem(Resource.Id.search);
var searchview = (Android.Support.V7.Widget.SearchView)MenuItemCompat.GetActionView(item);
searchview.QueryTextChange += (s, e) => adapter.Filter.InvokeFilter(e.NewText);
searchview.QueryTextSubmit += (s, e) =>
{
adapter.NotifyDataSetChanged();
Toast.MakeText(this, "Searched for: " + e.Query, ToastLength.Short).Show();
e.Handled = true;
};
MenuItemCompat.SetOnActionExpandListener(item, new SearchViewExpandListener(adapter));
return base.OnCreateOptionsMenu(menu);
}
private class SearchViewExpandListener : Java.Lang.Object, MenuItemCompat.IOnActionExpandListener
{
private readonly IFilterable _adapter;
public SearchViewExpandListener(IFilterable adapter)
{
_adapter = adapter;
}
public bool OnMenuItemActionCollapse(IMenuItem item)
{
_adapter.Filter.InvokeFilter("");
return true;
}
public bool OnMenuItemActionExpand(IMenuItem item)
{
return true;
}
}适配器
public class GameFilter : Filter
{
public readonly GameAdapter _adapter;
public GameFilter(GameAdapter adapter)
{
_adapter = adapter;
}
protected override FilterResults PerformFiltering(ICharSequence constraint)
{
var returnObj = new FilterResults();
var results = new List<Games>();
if (_adapter._originalData == null)
_adapter._originalData = _adapter.games;
if (constraint == null) return returnObj;
if (_adapter._originalData != null && _adapter._originalData.Any())
{
results.AddRange(
_adapter._originalData.Where(
games => games.Name.ToLower().Contains(constraint.ToString())));
}
returnObj.Values = FromArray(results.Select(r => r.ToJavaObject()).ToArray());
returnObj.Count = results.Count;
constraint.Dispose();
return returnObj;
}
protected override void PublishResults(ICharSequence constraint, FilterResults results)
{
using (var values = results.Values)
_adapter.games = values.ToArray<Java.Lang.Object>()
.Select(r => r.ToNetObject <Games>()).ToList();
_adapter.NotifyDataSetChanged();
constraint.Dispose();
results.Dispose();
}
}活性
adapter = new Adapter(person,this);
rv.SetLayoutManager(new LinearLayoutManager(this));
rv.SetItemAnimator(new DefaultItemAnimator());
rv.SetAdapter(adapter);
adapter.ItemClick -= OnItemClick;
adapter.ItemClick += OnItemClick;
adapter.NotifyDataSetChanged();
void OnItemClick(object sender, int position)
{
Intent Detail = new Intent(this, typeof(DetailActivity));
Detail.PutExtra(DetailActivity.EXTRA_ID, person[position].Uid);
StartActivity(Detail);
}发布于 2017-07-13 16:48:53
Detail.PutExtra(DetailActivity.EXTRA_ID, person[position].Uid);在获取个人位置时,使用筛选列表中项的位置从未经筛选的列表中获取项。
您需要使用筛选过的索引(位置)和筛选的项来访问正确的对象。尝试通过适配器访问项目列表以获得正确的项,如下所示:
var item = adapter.GetItem(position);
Detail.PutExtra(DetailActivity.EXTRA_ID, item.Uid);https://stackoverflow.com/questions/45086342
复制相似问题