Android GridView未使用notifyDataSetChanged()刷新

Android GridView未使用notifyDataSetChanged()刷新,android,Android,我使用GridView在两列中显示数据列表。现在,当我对列表的数据进行一些更改并调用NotifyDataSetChange时,它并没有直接刷新。当我滚动视图时,它反映了更改。如何找到解决方法?请帮忙 public class MenuGridViewAdapter extends BaseAdapter implements View.OnClickListener { Activity activity; ArrayList mArraylist = new ArrayList()

我使用GridView在两列中显示数据列表。现在,当我对列表的数据进行一些更改并调用NotifyDataSetChange时,它并没有直接刷新。当我滚动视图时,它反映了更改。如何找到解决方法?请帮忙

public class MenuGridViewAdapter extends BaseAdapter implements 
   View.OnClickListener {

Activity activity;

ArrayList mArraylist = new ArrayList();

private TextView mItemName, mDescription;
private TextView mItemRate;
private TextView mQuantity;
private ImageView mAddItem;
private LinearLayout mInYourCart;
private CardView mContainer;

public MenuGridViewAdapter(Activity activity, ArrayList mArraylist) {
    this.activity = activity;
    this.mArraylist = new ArrayList();
    this.mArraylist.clear();
    this.mArraylist.addAll(mArraylist);
    notifyDataSetChanged();
}

@Override
public int getCount() {
    return mArraylist.size();
}

@Override
public Object getItem(int position) {
    return mArraylist.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    convertView = LayoutInflater.from(activity).inflate(R.layout.layout_menu_item, null); // inflate the layout

    mContainer = convertView.findViewById(R.id.container);
    mQuantity = convertView.findViewById(R.id.quantity);
    mDescription = convertView.findViewById(R.id.description);
    mInYourCart = convertView.findViewById(R.id.added_to_cart);
    mItemName = convertView.findViewById(R.id.item_name);
    mAddItem = convertView.findViewById(R.id.add_item);
    mItemRate = convertView.findViewById(R.id.price);

    MenuItemBean bean = (MenuItemBean) mArraylist.get(position);
    // Log.e("getProductName  ", bean.getProductName());
    mItemName.setText("" + bean.getProductName());
    mItemRate.setText("CHF " + bean.getRate());

    if (bean.getDescription() != null) {
        mDescription.setText(bean.getDescription());
    } else {
        mDescription.setText("");
    }

    if (Constants.menuFilter.size() == 0) {
        mContainer.setVisibility(View.VISIBLE);
    } else {

        String filter = "";
        if (bean.getIs_spicy() == 1) {
            filter = "spicy";
        }

        if (bean.getIs_veg() == 1) {
            filter = "Vegetarian";
        }

        int flag = 0;
        for (int i = 0; i < Constants.menuFilter.size(); i++) {
            if (Constants.menuFilter.get(i).equalsIgnoreCase(filter)) {
                flag = 1;
                break;
            }
        }

        if (flag == 1) {
            mContainer.setVisibility(View.VISIBLE);
        } else {
            mContainer.setVisibility(View.GONE);
        }
    }

    if (!bean.getQuantity().equalsIgnoreCase("0")) {
        Log.d("ITEMADAPTER:", "UPDATED ITEMS" + "--" + position + "--VISIBLE");
        mInYourCart.setVisibility(View.VISIBLE);
        mQuantity.setText("" + bean.getQuantity());
    } else {
        Log.d("ITEMADAPTER:", "UPDATED ITEMS" + "--" + position + "--GONE");
        mInYourCart.setVisibility(View.GONE);
        mQuantity.setText("" + bean.getQuantity());
    }

    mAddItem.setTag(Integer.valueOf(position));
    mAddItem.setOnClickListener(this);

    return convertView;
}

@Override
public void onClick(View v) {
    int pos = (int) v.getTag();
    int id = v.getId();

    MenuItemBean bean = (MenuItemBean) mArraylist.get(pos);

    switch (id) {
        case R.id.add_item:
            FragmentMenuCard fragmentMenuCard = new FragmentMenuCard();
            fragmentMenuCard.showAddItemDialog(activity, bean, mQuantity, mInYourCart);
            break;
    }
}
我从一个函数调用notifyDataSetChanged,该函数在单击事件后调用,该事件将bean.getQuantity值设置为1,例如:

menuiteAdapter.notifyDataSetChanged

第一件事First notifyDataSetChanged only将与数据集的相同引用一起使用。您已经在适配器的构造函数中创建了一个新列表。所以你从这里什么也不能去。它应该尽可能简单

private ArrayList mArraylist = new ArrayList();
public MenuGridViewAdapter(Activity activity, ArrayList mArraylist) {
    this.activity = activity;
    this.mArraylist = mArraylist;
}
下面是你犯的一些错误。 1.您已创建dataset的新实例,因此notifyDataSetChanged将无法工作。 2.您已在构造函数中调用notifyDataSetChanged为什么?没用

因此,整个要点是数据集引用应该是相同的。然后,只有在同一列表中进行更改时,notifyDataSetChanged才会起作用

建议:-使用GridLayouManager转到RecyclerView。它为ViewHolder模式提供了更好的方法

在适配器中添加更新方法,该方法将更改ArrayList数据。这里有一个例子

public class MenuGridViewAdapter extends BaseAdapter {
   public void update(ArrayList<String> data){
     mArraylist = data;
     notifyDatasetChanged();
   }
}

这样,您就不必每次更新列表时都创建适配器。

请先阅读。然后带着一个适当的问题回来。很抱歉这样问@ADM。你能帮帮忙吗?你没听懂!你必须添加你的代码。没有代码,谁也帮不上忙。添加适配器的代码和设置适配器的位置。好的。现在好了吗?你能帮忙吗。如果需要更多的细节,请告诉我。谢谢。我来检查一下。根据此链接进行了第1点和第2点中提到的更改:-[。无论如何,感谢您将应用这些更改并进行检查。感谢@ADM。它与RecyclerView和GridLayoutManager一起工作,但与GridView不一起。不知道为什么。它将与GridView一起工作。尝试一下。不过,您已经使用RecyclerView,这非常好。祝您好运
public class MenuGridViewAdapter extends BaseAdapter {
   public void update(ArrayList<String> data){
     mArraylist = data;
     notifyDatasetChanged();
   }
}
adapter.update(updatedList);