在adapter-listview中单击按钮后,片段不会刷新

时间:2016-01-08 17:19:11

标签: android listview android-fragments fragment baseadapter

我有五个标签,它们是1.home 2.menu 3.cart 4.account 5.more.Here cart标签包含列表视图,其中包含删除按钮,my fragment当我点击删除按钮它必须刷新片段本身,以便它可以从Json加载新数据

MainActivity.class

public class MainActivity extends BaseActivity implements OnFragmentInteractionListener {
    @Bind(R.id.tabpager)
    ViewPager mViewpager;
    @Bind(R.id.tab_layout)
    TabLayout mTabs;
    private TabAdapter pageAdapter;
    String home,menu,cart,account,more;


    @Override
    protected int getLayoutResource() {
        return R.layout.activity_main;
    }

    @Override
    protected void initVariables(Bundle savedInstanceState) {
        home= getString(R.string.home);
        menu = getString(R.string.menu);
        cart = getString(R.string.cart);
        account = getString(R.string.account);
        more = getString(R.string.more);
    }

    @Override
    protected void initData(Bundle savedInstanceState) {
        setupViewPager(mViewpager);
        setupTabLayout(mTabs);

    }



    public void setupViewPager(ViewPager viewPager) {
        pageAdapter = new TabAdapter(getApplicationContext(), getSupportFragmentManager());
        pageAdapter.addFragment(MainFragment.getInstance(home), home, R.drawable.home);
        pageAdapter.addFragment(MenuItems.getInstance(menu), menu, R.drawable.menu);
        pageAdapter.addFragment(Cart.getInstance(cart), cart, R.drawable.cart);
        pageAdapter.addFragment(Account.getInstance(account), account, R.drawable.account);
        pageAdapter.addFragment(More.getInstance(more), more, R.drawable.more);
        viewPager.setAdapter(pageAdapter);
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                Session cartsession=new Session(getApplicationContext());
                if (cartsession.isLoggedIn()){
                    if (position==2){
                        ((Cart) pageAdapter.getItem(position)).cartdata();
                    }
                }

            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

    }



    public void setupTabLayout(TabLayout tabLayout) {
        tabLayout.setTabMode(TabLayout.MODE_FIXED);
        tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
        tabLayout.setupWithViewPager(mViewpager);

        for (int i = 0; i < tabLayout.getTabCount(); i++) {
            TabLayout.Tab tab = tabLayout.getTabAt(i);
            tab.setCustomView(pageAdapter.getTabView(i));
        }
        tabLayout.requestFocus();
    }


}

TabAdapter.class

public class TabAdapter extends FragmentStatePagerAdapter {
    private Context mContext;

    private List<Fragment> mFragments = new ArrayList<>();
    private List<String> mFragmentTitles = new ArrayList<>();
    private List<Integer> mFragmentIcons = new ArrayList<>();




    public TabAdapter(Context context, FragmentManager fm) {
        super(fm);
        this.mContext = context;
    }


    public void addFragment(Fragment fragment, String title, int drawable) {
        mFragments.add(fragment);
        mFragmentTitles.add(title);
        mFragmentIcons.add(drawable);
    }

    @Override
    public Fragment getItem(int position) {

        return mFragments.get(position);

    }

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

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitles.get(position);
    }

    public View getTabView(int position) {
        View tab = LayoutInflater.from(mContext).inflate(R.layout.customtab, null);
        TextView tabText = (TextView) tab.findViewById(R.id.tabText);
        ImageView tabImage = (ImageView) tab.findViewById(R.id.tabImage);
        tabText.setText(mFragmentTitles.get(position));
        tabImage.setBackgroundResource(mFragmentIcons.get(position));
        if (position == 0) {
            tab.setSelected(true);
        }
        return tab;
    }
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }
}

Cart.Java

public class Cart extends Fragment {
    Button check_out;
    TextView subtotal;
    ListView cartview;
    CartAdapter cartAdapter;
    List<JSONParser> cartitems;
    SharedPreferences loginPreferences;
    SharedPreferences.Editor loginPrefsEditor;
    TextView cartstatus,cartempty;
    LinearLayout linearlay;
    RelativeLayout cartvisible;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View cartfrag = inflater.inflate(R.layout.cart, container, false);
        subtotal = (TextView) cartfrag.findViewById(R.id.subtotal);
        cartview = (ListView) cartfrag.findViewById(R.id.cartview);
        cartstatus = (TextView) cartfrag.findViewById(R.id.cartstatus);
        cartempty = (TextView) cartfrag.findViewById(R.id.cartempty);
        linearlay = (LinearLayout) cartfrag.findViewById(R.id.linearlay);
        cartvisible = (RelativeLayout) cartfrag.findViewById(R.id.cartvisible);
        cartitems = new ArrayList<JSONParser>();
        cartAdapter = new CartAdapter(getActivity(), cartitems);
        cartview.setAdapter(cartAdapter);
        check_out = (Button) cartfrag.findViewById(R.id.check_out);
        check_out.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent cart_check = new Intent(getActivity(), Check.class);
                startActivity(cart_check);
            }
        });
        Session cartlogged = new Session(getActivity());
        if (cartlogged.isLoggedIn()) {
            cartitems.clear();
            cartdata();
        } else {
            cartstatus.setText("Please Login");
        }
        return cartfrag;
    }

    void cartdata() {
        cartitems.clear();
        SharedPreferences customerid = getActivity().getSharedPreferences("loginPrefs", Context.MODE_PRIVATE);
        String customid = customerid.getString("customerid", "");
        String carturl = "http://standardtakeaway.co.uk/json/view_cart.php?userid=" + customid;
        Log.d("CartData", carturl);
        JsonObjectRequest cartreq = new JsonObjectRequest(Request.Method.GET, carturl, (String) null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                try {
                    if (response.getString("status").equals("empty")) {
                        cartstatus.setVisibility(View.GONE);
                        cartempty.setText("Your Cart is Empty");
                    } else {
                        JSONArray objarray = response.getJSONArray("items");
                        for (int i = 0; i < objarray.length(); i++) {
                            JSONObject cartdataobj = objarray.getJSONObject(i);
                            linearlay.setVisibility(View.VISIBLE);
                            cartvisible.setVisibility(View.GONE);
                            JSONParser parserdata = new JSONParser();
                            parserdata.setCartquantity(cartdataobj.getString("qty"));
                            parserdata.setCartbase(cartdataobj.getString("BaseName"));
                            parserdata.setCartprice(cartdataobj.getString("price"));
                            cartitems.add(parserdata);
                            loginPreferences = getActivity().getSharedPreferences("loginPrefs", Context.MODE_PRIVATE);
                            loginPrefsEditor = loginPreferences.edit();
                            JSONObject subobj = response.getJSONObject("details");
                            String subtext = subobj.getString("subtotal");
                            loginPrefsEditor.putString("Price", subtext);
                            loginPrefsEditor.commit();
                            subtotal.setText(subtext);
                        }
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                cartAdapter.notifyDataSetChanged();
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(getActivity(), "" + error, Toast.LENGTH_SHORT).show();
            }
        });
        cartreq.setRetryPolicy(new DefaultRetryPolicy(6000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        AppController.getInstance().addToRequestQueue(cartreq);
    }

    public static Cart getInstance(String message) {
        Cart cart = new Cart();
        Bundle bundle = new Bundle();
        bundle.putString("MSG", message);
        cart.setArguments(bundle);
        return cart;
    }
}

CartAdapter.class

public class CartAdapter extends BaseAdapter {
    Context context;
    TextView quantity, basenamecart, cartprice;
    ImageButton delete;
    private List<JSONParser> cartitems;
    LayoutInflater inflater;
    String removequantity, removeitemprice,removebasename;
    public CartAdapter(Context context, List<JSONParser> cartitems) {
        this.context = context;
        this.cartitems = cartitems;
    }

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

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

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.cartitems, parent, false);
            quantity = (TextView) convertView.findViewById(R.id.quantity);
            basenamecart = (TextView) convertView.findViewById(R.id.basenamecart);
            cartprice = (TextView) convertView.findViewById(R.id.cartprice);
            delete= (ImageButton) convertView.findViewById(R.id.delete);
            final JSONParser dataparser = cartitems.get(position);
            quantity.setText(dataparser.getCartquantity());
            basenamecart.setText(dataparser.getCartbase());
            cartprice.setText(dataparser.getCartprice());
            delete.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    removequantity=dataparser.getCartquantity();
                    removebasename=dataparser.getCartbase();
                    removeitemprice=dataparser.getCartprice();
                    removecart();
                }
            });
        }
        return convertView;
    }
    private void removecart(){
        SharedPreferences customerid=context.getSharedPreferences("loginPrefs", Context.MODE_PRIVATE);
        String removeid=customerid.getString("customerid","");
        String removeurl="http://standardtakeaway.co.uk/json/del_cartitems.php?userid="+removeid+"&Item="+removebasename+"&price="+removeitemprice;
        Log.d("Remove",removeurl);
        final JsonArrayRequest removearray=new JsonArrayRequest(Request.Method.GET, removeurl, (String) null, new Response.Listener<JSONArray>() {
            @Override
            public void onResponse(JSONArray response) {
                for (int i=0;i<response.length();i++){
                    Log.d("Remove", String.valueOf(response));
                }

            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

            }
        });
        removearray.setRetryPolicy(new DefaultRetryPolicy(6000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        AppController.getInstance().addToRequestQueue(removearray);
    }

}

2 个答案:

答案 0 :(得分:0)

您需要从列表cartitems中删除相关对象,然后调用notifyDataSetChanged()方法通知任何相关视图刷新自己。

文档here

此外,这不是实现BaseAdapter并处理其中的更改的正确方法。也许这会有所帮助:http://androidadapternotifiydatasetchanged.blogspot.in/

另外,尝试使用新的RecyclerView来实现这些功能。它在支持库中可用,绝对是显示集合的好方法,也可以轻松添加具有默认动画的删除项目。请仔细阅读。起点http://developer.android.com/training/material/lists-cards.html

答案 1 :(得分:0)

参见添加行更新行。 如果从服务器上成功删除,请确保仅从list中删除项目。

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) {
        convertView = inflater.inflate(R.layout.cartitems, parent, false);
        quantity = (TextView) convertView.findViewById(R.id.quantity);
        basenamecart = (TextView) convertView.findViewById(R.id.basenamecart);
        cartprice = (TextView) convertView.findViewById(R.id.cartprice);
        delete= (ImageButton) convertView.findViewById(R.id.delete);
        final JSONParser dataparser = cartitems.get(position);
        quantity.setText(dataparser.getCartquantity());
        basenamecart.setText(dataparser.getCartbase());
        cartprice.setText(dataparser.getCartprice());

        final int pos =position; // added line
        delete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                removequantity=dataparser.getCartquantity();
                removebasename=dataparser.getCartbase();
                removeitemprice=dataparser.getCartprice();
                removecart(pos); //updated line
            }
        });
    }
    return convertView;
}
public void updateCartitems(List<JSONParser> newCartitems) {
   cartitems.clear();
   cartitems.addAll(newCartitems);
   this.notifyDataSetChanged();
}
private void removecart(int pos){ // updated line
    SharedPreferences customerid=context.getSharedPreferences("loginPrefs", Context.MODE_PRIVATE);
    String removeid=customerid.getString("customerid","");
    String removeurl="http://standardtakeaway.co.uk/json/del_cartitems.php?userid="+removeid+"&Item="+removebasename+"&price="+removeitemprice;
    Log.d("Remove",removeurl);
    final JsonArrayRequest removearray=new JsonArrayRequest(Request.Method.GET, removeurl, (String) null, new Response.Listener<JSONArray>() {
        @Override
        public void onResponse(JSONArray response) {
            for (int i=0;i<response.length();i++){
                Log.d("Remove", String.valueOf(response));

            }

           cartitems.remove(pos); //added line
           updateCartitems(cartitems);
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

        }
    });
    removearray.setRetryPolicy(new DefaultRetryPolicy(6000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
    AppController.getInstance().addToRequestQueue(removearray);
}