Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在GridView中过滤产品,OnItemClick传递不同的产品详细信息_Java_Android_Gridview_Filter_Onitemclicklistener - Fatal编程技术网

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
    }
});