Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.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
Android 当数据来自后端时,如何在gridview中单击项时刷新布局_Android_Json_Android Recyclerview - Fatal编程技术网

Android 当数据来自后端时,如何在gridview中单击项时刷新布局

Android 当数据来自后端时,如何在gridview中单击项时刷新布局,android,json,android-recyclerview,Android,Json,Android Recyclerview,当我点击“黑心”按钮时,我将其替换为“红心”按钮,但当我再次进入此页面时,它会反映出来。不是在单击的同时。 帮我解决这个问题。 我已经添加了下面的图片 这是我的活动课 public class Productpage extends AppCompatActivity implements SearchView.OnQueryTextListener { private FloatingActionButton fab; // GridView gridView

当我点击“黑心”按钮时,我将其替换为“红心”按钮,但当我再次进入此页面时,它会反映出来。不是在单击的同时。 帮我解决这个问题。 我已经添加了下面的图片

这是我的活动课

  public class Productpage extends AppCompatActivity implements SearchView.OnQueryTextListener {
        private FloatingActionButton fab;
    //    GridView gridView;
        RecyclerView recyclerView;
        private GridLayoutManager lLayout;
        String trading,flag,newest,high,low,newest1="newest",custid,catid;
        MyAdapter1 mAdapter;
        SearchView mSearchView;
        ArrayList<productinfo> sliderList;
        String []para;
        Intent intent;
        int spanCount = 2; // 3 columns
        int spacing = 2; // 50px
        boolean includeEdge = false;
        Button btncart;
        String cartcount;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_productpage);
    //        gridView = (GridView)findViewById(R.id.gridview);
            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar1);
            setSupportActionBar(toolbar);
          /*  View inflated = getLayoutInflater().inflate(R.layout.action_bar_notifitcation_icon, null);
            toolbar.addView(inflated);*/
           // btncart=(Button) toolbar.findViewById(R.id.actionNotifications);
            lLayout = new GridLayoutManager(getApplicationContext(), 2);
            recyclerView = (RecyclerView) findViewById(R.id.recyclerMen);
            recyclerView.addItemDecoration(new GridSpacingItemDecoration(spanCount, spacing, includeEdge));
            recyclerView.setHasFixedSize(true);
            recyclerView.setLayoutManager(lLayout);
            SharedPreferences sharedPref2 = getApplicationContext().getSharedPreferences("notificationcart", Context.MODE_PRIVATE);
            cartcount=sharedPref2.getString("cartcount","");
            getproductdata();
            fab = (FloatingActionButton) findViewById(R.id.fab);
            fab.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                 /*   Toast.makeText(getApplicationContext(),"filter is open here",Toast.LENGTH_LONG).show();*/
                    Intent intent=new Intent(getApplicationContext(),FilteredBy.class);
                    startActivity(intent);
                }
            });



            intent=getIntent();
            String action=intent.getAction();
            if(action.equals("home")){
                flag=intent.getStringExtra("flag");
                custid=intent.getStringExtra("custid");
                catid=intent.getStringExtra("cat_id");
                Toast.makeText(Productpage.this,flag+""+custid+""+catid,Toast.LENGTH_LONG).show();
                }
            else if(action.equals("filter")){
                flag=intent.getStringExtra("flagfilter");
                para=intent.getStringArrayExtra("category");
                Toast.makeText(Productpage.this,flag,Toast.LENGTH_LONG).show();
            }
    // else if (action.equals("trading")){
    //            trading = intent.getStringExtra("trading");
    //            Toast.makeText(Productpage.this, trading, Toast.LENGTH_LONG).show();
    //        }else if (action.equals("newest")){
    //            newest = intent.getStringExtra("newest");
    //            Toast.makeText(Productpage.this, newest, Toast.LENGTH_LONG).show();
    //        }else if (action.equals("high")){
    //            high = intent.getStringExtra("priceasc");
    //            Toast.makeText(Productpage.this, high, Toast.LENGTH_LONG).show();
    //        }else if (action.equals("low")){
    //            low = intent.getStringExtra("pricedesc");
    //            Toast.makeText(Productpage.this, low, Toast.LENGTH_LONG).show();
    //        }
        }

        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.

            getMenuInflater().inflate(R.menu.main, menu);
            MenuItem searchItem = menu.findItem(R.id.action_search);
            mSearchView = (SearchView) MenuItemCompat.getActionView(searchItem);
            setupSearchView();
            return super.onCreateOptionsMenu(menu);
        }

        @Override
        public boolean onPrepareOptionsMenu(Menu menu) {

            //Get a reference to your item by id
            MenuItem item = menu.findItem(R.id.actionNotifications);
            MenuItem item1=menu.findItem(R.id.actionNotifications);
            //Here, you get access to the view of your item, in this case, the layout of the item has a FrameLayout as root view but you can change it to whatever you use
            RelativeLayout rootView = (RelativeLayout) item.getActionView();

            //Then you access to your control by finding it in the rootView
            Button control = (Button) rootView.findViewById(R.id.button1cart);
            TextView txt1noticount=(TextView)rootView.findViewById(R.id.txtCount);
            txt1noticount.setText(cartcount);
            control.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent i=new Intent(Productpage.this,SimpleActivity.class);
                    startActivity(i);
                    // Toast.makeText(Productpage.this, "keval", Toast.LENGTH_SHORT).show();
                }
            });
            //And from here you can do whatever you want with your control

            return true;
        }



        public void getproductdata() {
            StringRequest request = new StringRequest(Request.Method.POST,
                    StaticDataUtility.Server_URL + "" + StaticDataUtility.catwise_product, new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    try {
                        JSONObject joResp = new JSONObject(response);
                        sliderList = new ArrayList<>();
                        int success = joResp.getInt("Success");
                        if (success == 1) {
    //                        industryListBeanArrayList.clear();
                            JSONArray jsonArray = joResp.getJSONArray("result");
    //                        JSONObject joResult = joResp.getJSONObject("result");
    //                        JSONArray jaDetail = joResult.getJSONArray("industry_detail");
                            for (int i = 0; i < jsonArray.length(); i++) {
                                JSONObject joDetail = jsonArray.getJSONObject(i);
                                productinfo slider = new productinfo();
                                if (joDetail.has("product_id")) {
                                    slider.setProduct_id(joDetail.getString("product_id"));
                                } else {
                                    slider.setProduct_id("0");
                                }
                                if (joDetail.has("product_name")) {
                                    slider.setProduct_name(joDetail.getString("product_name"));
                                } else {
                                    slider.setProduct_name("No Item Found");
                                }
                                if (joDetail.has("product_image")) {
                                    slider.setProduct_image(joDetail.getString("product_image"));
                                } else {
                                    slider.setProduct_image("No Data");
                                }

                                if (joDetail.has("price")) {
                                    slider.setPrice(joDetail.getString("price"));
                                } else {
                                    slider.setPrice("0");
                                }
                                if (joDetail.has("special_price")) {
                                    slider.setSpecial_price(joDetail.getString("special_price"));
                                } else {
                                    slider.setSpecial_price("0");
                                }

                                if (joDetail.has("discount")) {
                                    slider.setDiscount(joDetail.getString("discount"));
                                } else {
                                    slider.setDiscount("0");
                                }
                                if (joDetail.has("is_wishlist")) {
                                    slider.setIs_wishlist(joDetail.getString("is_wishlist"));
                                } else {
                                    slider.setIs_wishlist("0");
                                }
                                sliderList.add(slider);
                            }
    //                        gridView.setAdapter(new MyAdapter1(getApplicationContext(),sliderList));
                            mAdapter = new MyAdapter1(Productpage.this,sliderList);
                         recyclerView.setAdapter(mAdapter);

                        } else {
                            Toast.makeText(Productpage.this, "Sorry Data Are Not Available ", Toast.LENGTH_SHORT).show();
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            },
                    new Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError volleyError) {
                        }
                    }) {
                @Override
                protected Map<String, String> getParams() {
                    HashMap<String, String> params = new HashMap<>();
                    if(flag.toString().trim().equals("true")){
                        params.put("cat_id", catid);
                        params.put("customer_id",custid);
                       // params.put("sort_by","newest");
                    }else{
                        params.put("cat_id",catid);
                        params.put("customer_id",custid);
                        if(!(intent.getStringExtra("flagfilter").equals("false"))){
                            String keval=intent.getStringExtra("flagfilter").toString();
                            if(intent.getStringExtra("flagfilter").trim().equals("Newest")) {
                                params.put("sort_by", "newest");
                            }
                            if(intent.getStringExtra("flagfilter").trim().equals("Trending")) {
                                params.put("sort_by", "trending");
                            }
                            if(intent.getStringExtra("flagfilter").trim().equals("Price: High To Low")) {
                                params.put("sort_by", "price_desc");
                            }
                            if(intent.getStringExtra("flagfilter").trim().equals("Price: Low To High")) {
                                params.put("sort_by", "price_asc");
                            }
                            if(intent.getStringExtra("category").trim().equals("Price: Low To High")){

                            }
                        }
    //                    if (trading.toString().trim().equals(trading)){
    //                      //  params.put("cat_id","292");
    //                        params.put("sort_by","trending");
    //                    }else if (newest1.toString().trim().equals(newest)){
    //                        //params.put("cat_id","292");
    //                        params.put("sort_by","newest");
    //                    }else if (high.toString().trim().equals(high)){
    //                        //params.put("cat_id","292");
    //                        params.put("sort_by","pricedesc");
    //                    }else if (low.toString().trim().equals(low)){
    //                        //params.put("cat_id","292");
    //                        params.put("sort_by","priceasc");
    //                    }
                    }

                    Log.e("params", params.toString());
                    return params;
                }
            };
            request.setRetryPolicy(new
                    DefaultRetryPolicy(60000,
                    DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                    DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
            // Adding request to request queue
            Volley.newRequestQueue(this).add(request);
        }


        private void setupSearchView() {
            mSearchView.setIconifiedByDefault(true);
            mSearchView.setOnQueryTextListener(this);
            mSearchView.setSubmitButtonEnabled(true);
            mSearchView.setQueryHint("Search Here");

        }

        @Override
        public boolean onQueryTextSubmit(String query) {
            // mAdapter.filter(query);
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            final List<productinfo> filteredModelList = filter((ArrayList<productinfo>)sliderList, newText);
            mAdapter.setFilter(filteredModelList);
            return true;
        }
        private List<productinfo> filter(ArrayList<productinfo> models, String query) {
            query = query.toLowerCase();
            final List<productinfo> filteredModelList = new ArrayList<>();
            for (productinfo model : models) {
                final String text = model.getProduct_name().toLowerCase();
                if (text.contains(query)) {
                    filteredModelList.add(model);
                }
            }
            return filteredModelList;
        }

        @Override
        public void onBackPressed() {
            super.onBackPressed();
            Intent i=new Intent(Productpage.this,Homepage.class);
            startActivity(i);
            finish();
        }
    }



this is my adapter class.
public class MyAdapter1 extends RecyclerView.Adapter<Home_Row_Holder1> {
Context mcontex;
    private static StrikethroughSpan STRIKE_THROUGH_SPAN;
    String title11;
    public String productid,customerid;
    String str1;
    ArrayList<productinfo> feedItemList=new ArrayList<>();
    String flag;
    String wishid;

    MyAdapter1 adpter;
    public MyAdapter1( Context mcontex, ArrayList<productinfo> feedItemList) {
        this.mcontex = mcontex;
        this.feedItemList = feedItemList;

    }

    @Override
    public Home_Row_Holder1 onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.grid_item, null);
        Home_Row_Holder1 mh = new Home_Row_Holder1(v);
        return mh;
    }

    @Override
    public void onBindViewHolder(final Home_Row_Holder1 holder,final int i) {

        if(feedItemList.get(i).getProduct_name().length()>=13)
        {
            title11=feedItemList.get(i).getProduct_name().substring(0, 13)+"...";
            holder.row_1_name.setText(title11);
        }else {
            holder.row_1_name.setText(feedItemList.get(i).getProduct_name());
        }
        holder.row_3.setText(feedItemList.get(i).getSpecial_price());
        Picasso.with(mcontex).load(feedItemList.get(i).getProduct_image().trim()).placeholder(R.drawable.logo1).into(holder.product_img_home_1);
//        holder.row_1_price.setText(feedItemList.get(i).getPrice());
        STRIKE_THROUGH_SPAN = new StrikethroughSpan();
        holder.row_1_price.setText(feedItemList.get(i).getPrice(), TextView.BufferType.SPANNABLE);
        Spannable spannable = (Spannable) holder.row_1_price.getText();
        spannable.setSpan(STRIKE_THROUGH_SPAN, 0, feedItemList.get(i).getPrice().length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        holder.row_2_price.setText(" "+feedItemList.get(i).getDiscount()+"%");

        if(feedItemList.get(i).getIs_wishlist().equals("0")){
            holder.wishadd.setImageResource(R.drawable.wish);
        }else {
            holder.wishadd.setImageResource(R.drawable.wishred);

        }
       /* if (flag.equals("false")) {
            holder.wishadd.findViewById(R.id.wishadd).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                }
            });*/
      //  }
        //  holder.prodid.setText(feedItemList.get(i).getProduct_id());
        holder.wishadd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
//
                    /*if(view.getId()==R.id.wishaddproductpage){
                        holder.wishadd.setImageResource(R.drawable.wishred);
                    }*/
                str1=feedItemList.get(i).getProduct_id();
                wishid=feedItemList.get(i).getIs_wishlist();

                if(wishid.equals("0")){
                   // holder.wishadd.setImageResource(R.drawable.wishred);
                    new Wishaddproduct().execute();
                }

                         //   flag="false";
                        if(wishid.equals("1")){
                           // flag="false";
                     //       holder.wishadd.setImageResource(R.drawable.wish);
                            new Deletewish().execute();

                        }
                  //  holder.wishadd.setImageResource(R.drawable.wishred);



            }
        });
        customerid= Homepage.strcustid;
        productid=feedItemList.get(i).getProduct_id();
        holder.product_img_home_1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Context context = v.getContext();
                // Toast.makeText(mContext,String.valueOf(R.id.recycler+"   "+R.id.recyclerMen+"    "+recyclerView.getId() ),Toast.LENGTH_LONG).show();
               /* SharedPreferences sp= PreferenceManager.getDefaultSharedPreferences(mContext);
                SharedPreferences.Editor editor=sp.edit();
                editor.putString("product_id",feedItemList.get(i).getProduct_id());
                editor.putString("product_image",feedItemList.get(i).getImage());
                if(feedItemList.get(i).getProduct_name().length()>=10)
                {
                    title11=feedItemList.get(i).getProduct_name().substring(0, 10)+"...";
                    editor.putString("product_name",title11);
                }else {
                    editor.putString("product_name",feedItemList.get(i).getProduct_name());
                }
                editor.putString("product_name",feedItemList.get(i).getProduct_name());
                editor.putString("product_name",feedItemList.get(i).getProduct_name());
                editor.putString("product_description",feedItemList.get(i).getProduct_description());
                editor.putString("product_price",feedItemList.get(i).getProduct_price());
                editor.commit();*/

                Intent intent = new Intent(mcontex,singleactivity.class);

                intent.putExtra("productid",feedItemList.get(i).getProduct_id());
               // intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(intent);
               // Toast.makeText(mContext,feedItemList.get(i).getProduct_id(),Toast.LENGTH_SHORT).show();
               // str1=feedItemList.get(i).getProduct_id();
                Toast.makeText(mcontex,"kkkkkkkkkk"+str1,Toast.LENGTH_SHORT).show();

            }
        });
    }
    @Override
    public int getItemCount() {
        return (null != feedItemList ? feedItemList.size() : 0);
    }

    public void setFilter(List<productinfo> countrymodel) {
        feedItemList = new ArrayList<>();
        feedItemList.addAll(countrymodel);
        notifyDataSetChanged();
    }

    private class Wishaddproduct extends AsyncTask<String,String,String> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected String doInBackground(String... strings) {

            Uri.Builder builder = new Uri.Builder()
                    .appendQueryParameter("customer_id",customerid)
                    .appendQueryParameter("product_id",str1);
            HttpHandler parser = new HttpHandler();
            parser.makePostServiceCall( StaticDataUtility.Server_URL+""+ StaticDataUtility.wishlistadd, builder, parser.POST);

            return String.valueOf(true);

        }
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            Toast.makeText(mcontex,wishid, Toast.LENGTH_SHORT).show();

           // Toast.makeText(mcontex,str1+ "hello"+customerid, Toast.LENGTH_SHORT).show();

           updateResults(feedItemList);
           // Home_Row_Holder1.wishadd.setImageResource(R.drawable.wishred);

        }
    }

    private class Deletewish extends AsyncTask<String,String,String> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected String doInBackground(String... strings) {

            Uri.Builder builder = new Uri.Builder()
                    .appendQueryParameter("customer_id",customerid)
                    .appendQueryParameter("product_id",str1);
            HttpHandler parser = new HttpHandler();
            parser.makePostServiceCall( StaticDataUtility.Server_URL+""+ StaticDataUtility.wishdelete, builder, parser.POST);

            return String.valueOf(true);

        }
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
       //     Home_Row_Holder1.wishadd.setImageResource(R.drawable.wish);
           // Toast.makeText(mcontex,str1+ "hello"+customerid, Toast.LENGTH_SHORT).show();
            updateResults(feedItemList);
        }
    }

    public void updateResults(ArrayList<productinfo> results ) {
        feedItemList = results;
        //Triggers the list update
         //
        // feedItemList.clear();
        feedItemList.addAll(results);
        this.notifyDataSetChanged();
      //  this.notifyItemRangeChanged((int) adpter.getItemId(i), feedItemList.size());
    }

}
公共类Productpage扩展AppCompatActivity实现SearchView.OnQueryTextListener{
私人浮动按钮制造厂;
//GridView;
回收视图回收视图;
私人网格布局经理lLayout;
字符串交易,标志,最新,高,低,newest1=“最新”,客户ID,catid;
MyAdapter1 mAdapter;
搜索视图;
ArrayList幻灯片列表;
字符串[]段;
意图;
int spanCount=2;//3列
int间距=2;//50px
布尔includeEdge=false;
按钮btncart;
字符串计数;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u productpage);
//gridView=(gridView)findViewById(R.id.gridView);
Toolbar Toolbar=(Toolbar)findViewById(R.id.toolbar1);
设置支持操作栏(工具栏);
/*视图充气=GetLayoutFlater()。充气(R.layout.action\u bar\u notification\u图标,null);
工具栏。添加视图(充气)*/
//btncart=(按钮)toolbar.findviewbyd(R.id.actionNotifications);
lLayout=新的GridLayoutManager(getApplicationContext(),2);
recyclerView=(recyclerView)findViewById(R.id.recyclerMen);
recyclerView.addItemDecoration(新网格间距GitemDecoration(跨度、间距、包括边缘));
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(lLayout);
SharedReferences SharedRefer2=getApplicationContext().GetSharedReferences(“notificationcart”,Context.MODE\u PRIVATE);
cartcount=sharedPref2.getString(“cartcount”,即“”);
getproductdata();
fab=(FloatingActionButton)findViewById(R.id.fab);
fab.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
/*Toast.makeText(getApplicationContext(),“过滤器在此打开”,Toast.LENGTH\u LONG.show()*/
Intent Intent=新的Intent(getApplicationContext(),FilteredBy.class);
星触觉(意向);
}
});
intent=getIntent();
String action=intent.getAction();
if(动作等于(“主”)){
flag=intent.getStringExtra(“flag”);
custid=intent.getStringExtra(“custid”);
catid=intent.getStringExtra(“cat_id”);
Toast.makeText(Productpage.this,flag+“”+custid+“”+catid,Toast.LENGTH\u LONG).show();
}
else if(action.equals(“filter”)){
flag=intent.getStringExtra(“flagfilter”);
para=intent.getStringArrayExtra(“类别”);
Toast.makeText(Productpage.this,flag,Toast.LENGTH_LONG).show();
}
//否则,如果(行动等于(“交易”)){
//交易=意向。getStringExtra(“交易”);
//Toast.makeText(Productpage.this,trading,Toast.LENGTH_LONG.show();
//}else if(action.equals(“最新”)){
//最新=intent.getStringExtra(“最新”);
//Toast.makeText(Productpage.this,最新,Toast.LENGTH_LONG).show();
//}else if(action.equals(“high”)){
//高=意图。getStringExtra(“priceasc”);
//Toast.makeText(Productpage.this,high,Toast.LENGTH_LONG).show();
//}else if(action.equals(“low”)){
//低=意图。getStringExtra(“价格描述”);
//Toast.makeText(Productpage.this,low,Toast.LENGTH_LONG).show();
//        }
}
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(R.menu.main,menu);
MenuItem searchItem=menu.findItem(R.id.action\u search);
mSearchView=(SearchView)MenuItemCompat.getActionView(searchItem);
setupSearchView();
返回super.onCreateOptions菜单(菜单);
}
@凌驾
公共布尔值OnPrepareOptions菜单(菜单){
//按id获取对项目的引用
MenuItem=menu.findItem(R.id.actionNotifications);
MenuItem1=menu.findItem(R.id.actionNotifications);
//在这里,您可以访问项目的视图,在本例中,项目的布局具有作为根视图的FrameLayout,但您可以将其更改为您使用的任何视图
RelativeLayout根视图=(RelativeLayout)项。getActionView();
//然后通过在rootView中找到控件来访问它
按钮控件=(按钮)rootView.findViewById(R.id.button1cart);
TextView txt1noticount=(TextView)rootView.findViewById(R.id.txtCount);
txt1noticount.setText(cartcount);
control.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
Intent i=新的Intent(Productpage.this、SimpleActivity.class);
星触觉(i);
//Toast.makeText(Productpage.this,“keval”,Toast.LENGTH_SHORT.show();
}
});
//从这里你可以用你的控制做任何你想做的事
返回true;
}
public void getproductdata(){
StringRequest=新的StringRequest(request.Method.POST,
StaticDataUtility.Server_URL+“”+StaticDataUtility.catwise_产品,新响应
updateResults(feedItemList);
mAdapter.notifyDataSetChanged();