Java 在GridView中过滤产品,OnItemClick传递不同的产品详细信息
我正在使用Java 在GridView中过滤产品,OnItemClick传递不同的产品详细信息,java,android,gridview,filter,onitemclicklistener,Java,Android,Gridview,Filter,Onitemclicklistener,我正在使用GridView显示产品。Im我的自定义适配器类我实现了过滤器搜索,它允许我给出想要的结果。添加OnItemClick后,我意识到,在过滤模式下,单击的项目给了我错误的详细信息 在我看来,它与ViewHolder有关,它在customadapter中实现,并将用户发送到错误的项目活动。为什么?让我们看看这张图片: 它代表两种情况 1) 当活动启动且gridview默认显示所有条目时 2) 使用筛选搜索并显示结果时 以下是我的自定义适配器类的某些部分: @Override public
GridView
显示产品。Im我的自定义适配器类我实现了过滤器搜索,它允许我给出想要的结果。添加OnItemClick
后,我意识到,在过滤模式下,单击的项目给了我错误的详细信息
在我看来,它与ViewHolder
有关,它在customadapter
中实现,并将用户发送到错误的项目活动。为什么?让我们看看这张图片:
它代表两种情况
1) 当活动启动且gridview
默认显示所有条目时
2) 使用筛选搜索并显示结果时
以下是我的自定义适配器类的某些部分:
@Override
public View getView(int position, View view, ViewGroup parent) {
Log.d(TAG, "getView: assigning all values to custom adapter");
LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
ViewHolder viewHolder;
Product product= productList.get(position);
//Creating new fields
if (view == null) {
view = layoutInflater.inflate(R.layout.single_product_layout, parent, false);
viewHolder = new ViewHolder();
viewHolder.productName = view.findViewById(R.id.name);
viewHolder.productPrice = view.findViewById(R.id.price);
view.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) view.getTag();
}
//Set up textviews and image
viewHolder.productName.setText(product.getName());
viewHolder.productPrice.setText(product.getPrice());
return view;
}
static class ViewHolder {
TextView productName;
TextView productPrice;
}
下面是过滤器搜索的代码,我将其保存在同一个主类(CustomAdapter)中:
我想摆脱误导性的OnItemClick
beahviour,它使用错误的详细信息启动详细信息活动
定制搜索栏的实现:
final EditText searchBar = findViewById(R.id.search_product);
searchBar.addTextChangedListener(this);
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
Log.d(TAG, "onTextChanged: starting...");
this.productAdapter.getFilter().filter(charSequence);
}
@Override
public void afterTextChanged(Editable editable) {
}
清除按钮代码:
//Clear search bar
ImageView cancelClearSearch = findViewById(R.id.cancel_clear_search);
cancelClearSearch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
searchBar.setText("");
searchBar.clearFocus();
//Hide keyboard
InputMethodManager inputManager = (InputMethodManager)
getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(searchBar.getWindowToken(), 0);
new DownloadProducts().execute();
}
});
当你这么做的时候
productList = (List<Product>) filterResults.values;
或者,另一种选择是从adapterView
实例中检索数据,如下所示:
//Product product = allProducts.get(i);
Product product = (Product)adapterView.getAdapter().getItem(i);
// get associated adapter with list view ^^^^^^^^^
// get the item from adapter, using position ^^^^^^^^^^^
要在清除搜索
edittext
后显示旧列表,只需将空字符串作为
//Clear search bar
ImageView cancelClearSearch = findViewById(R.id.cancel_clear_search);
cancelClearSearch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
this.productAdapter.getFilter().filter("");
searchBar.setText("");
searchBar.clearFocus();
//Hide keyboard
InputMethodManager inputManager = (InputMethodManager)
getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(searchBar.getWindowToken(), 0);
//new DownloadProducts().execute(); no need to download data again
}
});
click listener complete implementation的代码?@Pavneet_Singh我添加了代码。@Paveneet_Singh好的,但还有一个问题。如果我停止过滤,所有的产品都消失了,之后什么也不显示。我们如何将其更改为重新加载所有产品?@D.B.如何停止筛选?我的意思是不要在中间打字。你能解释一下吗?@Paveneet_Singh所以基本上,我开始键入一些字母,比如我键入“s”,这样我就得到所有名称中有“s”的产品,当我添加另一个字母例如“h”时,它会显示所有名称中有“sh”的结果。我创建了一个按钮来清除搜索,当我按下它时,edittext设置为“”,键盘隐藏。我在按下“取消”按钮时找到了实现新产品下载异步任务的解决方案,它可以工作,但我想创建一种更复杂的方法来实现它。我应该将此代码放在哪里?我发布了清除按钮的代码。让我们。
productList.clear();
productList.addAll((List<Product>) filterResults.values);
//Product product = allProducts.get(i);
Product product = (Product)adapterView.getAdapter().getItem(i);
// get associated adapter with list view ^^^^^^^^^
// get the item from adapter, using position ^^^^^^^^^^^
//Clear search bar
ImageView cancelClearSearch = findViewById(R.id.cancel_clear_search);
cancelClearSearch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
this.productAdapter.getFilter().filter("");
searchBar.setText("");
searchBar.clearFocus();
//Hide keyboard
InputMethodManager inputManager = (InputMethodManager)
getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(searchBar.getWindowToken(), 0);
//new DownloadProducts().execute(); no need to download data again
}
});