-1

I'm developing an app with swipe fragment and my problem is that the client want that if they swipe the view the data inside it will be automatically save from sqlite table for example in the view there is an EditText inside it after inputing value to the EditText, the value will be saved in the sqlite table when they swipe to another view or to next item. PLEASE HELP ME

//PagerFragment.java class where i call for the viewpager from xml

public class PagerFragment extends Fragment {

    private List<PageData> data;
    private int currentPosition;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View v = inflater.inflate(R.layout.fragment_pager, container, false);
        ViewPager mViewPager = (ViewPager) v.findViewById(R.id.pager_view);

        currentPosition = getArguments().getInt("CURRENT_POSITION");
        data = getArguments().getParcelableArrayList("DATA_LIST");

        FragmentItemPagerAdapter fragmentItemPagerAdapter = new FragmentItemPagerAdapter(getFragmentManager(), data);
        mViewPager.setAdapter(fragmentItemPagerAdapter);
        mViewPager.setCurrentItem(currentPosition);
        return v;


    }

//ListviewAdapter.java

public class ListViewAdapter extends ArrayAdapter<PageData> {
    protected List<PageData> data;
    protected LayoutInflater inflater;

    public ListViewAdapter(Activity activity, int textViewResourceId, List<PageData> objects){
        super(activity, textViewResourceId, objects);
        data= objects;
    }

    public View getView(final int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View row = inflater.inflate(R.layout.item_list, parent, false);
        PageData pd = data.get(position);
        TextView tv2 = (TextView)row.findViewById(R.id.cat);
        tv2.setText(pd.getCategory());
//        TextView tv3 = (TextView)row.findViewById(R.id.desc);
//        tv3.setText(pd.getCategory());

        return row;
    }
}

//FragmentItempagerAdapter.java

public class FragmentItemPagerAdapter extends FragmentStatePagerAdapter {
    private List<PageData> data;



    public FragmentItemPagerAdapter(FragmentManager fm, List<PageData> data){
        super(fm);
        this.data = data;
    }

    @Override
    public Fragment getItem(int position) {
        Fragment fragment = new PageFragment();
        Bundle args = new Bundle();
        args.putString(PageFragment.id, data.get(position).getId());
        args.putString(PageFragment.cate, data.get(position).getCategory());
        args.putString(PageFragment.code, data.get(position).getCode());
        args.putString(PageFragment.desk, data.get(position).getDesk());
        args.putString(PageFragment.unit, data.get(position).getUnit());
        args.putString(PageFragment.quan, data.get(position).getQuantity());

        fragment.setArguments(args);
        return fragment;
    }

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

    public static class PageFragment extends Fragment{
        public static final String id = "id";
        public static final String cate = "category";
        public static final String code = "code";
        public static final String desk = "description";
        public static final String unit = "unit";
        public static final String quan = "Quantity";



        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_item, container, false);
            ((TextView) rootView.findViewById(R.id.item_label2)).setText(
                    getArguments().getString(cate));
            ((TextView) rootView.findViewById(R.id.item_label3)).setText(
                    getArguments().getString(code));
            ((TextView) rootView.findViewById(R.id.item_label4)).setText(
                    getArguments().getString(desk));
            ((TextView) rootView.findViewById(R.id.item_label5)).setText(
                    getArguments().getString(unit));
            ((TextView) rootView.findViewById(R.id.item_label6)).setText(
                    getArguments().getString(quan));
            ((TextView) rootView.findViewById(R.id.item_label1)).setText(
                    getArguments().getString(id));
            ((EditText) rootView.findViewById(R.id.editText2)).setText(
                    getArguments().getString(quan));

            return rootView;

        }


    }

}
RaRa
  • 67
  • 11
  • Are your using Viewpager to implement this swipe functionality? If so, refer this change listener. https://developer.android.com/reference/android/support/v4/view/ViewPager.OnPageChangeListener.html – Febi M Felix Jan 23 '17 at 06:45
  • yes im using viewpager and thanks for the link but can you give me also an example but still ill try to read it and give you feedback asap :) – RaRa Jan 23 '17 at 06:49
  • http://stackoverflow.com/questions/30368641/updating-the-contents-on-tab-changed-in-view-pager This link might help you with example. Do your database operations instead of network operations mentioned in this link. – Febi M Felix Jan 23 '17 at 07:05

2 Answers2

0

put this method in your fragments

 @Override
    public void setMenuVisibility(final boolean visible) {
        super.setMenuVisibility(visible);
        if (!visible) {

          // called when fragment will change

          // insertIntoTable this is a method for insert data into your sqlite table
          insertIntoTable(edittext.getText().toString());

        } 
    }

create method insertIntoTable for insert data in sqlite table and put inside your sqlite query

Rajesh Koshti
  • 572
  • 1
  • 7
  • 25
  • sir i cant find on where i will put it – RaRa Jan 23 '17 at 08:18
  • ok then put setMenuVisibility method in all your fragment it will do the trick for you – Rajesh Koshti Jan 23 '17 at 08:56
  • ill copy the setMenuVisibility in all my class? – RaRa Jan 23 '17 at 09:00
  • yes in all your fragment class when you swipe your fragment class then this method will call, then insert your data in Sqlite db – Rajesh Koshti Jan 23 '17 at 09:04
  • what is the problem? you need to put your sqlite query – Rajesh Koshti Jan 25 '17 at 05:18
  • Error reporting crash android.os.TransactionTooLargeException, java.lang.StackOverflowError: stack size 8MB (thats my error can you make me an example base on th code i posted sir thank you sorry im new to android ) – RaRa Jan 25 '17 at 06:16
  • check out this http://stackoverflow.com/questions/10024739/how-to-determine-when-fragment-becomes-visible-in-viewpager – Rajesh Koshti Jan 25 '17 at 06:21
  • ok sir ill try to read and figure it out and give you feedback later ,my 1 day seems to be wasted with this problem :( – RaRa Jan 25 '17 at 06:29
  • Let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/133945/discussion-between-rara-and-rajesh-koshti). – RaRa Jan 25 '17 at 06:36
0

Here's a simple example.Hope this helps.
This is a fragment with a public method to get the edittext string-

public class TestFragment extends Fragment {
Context mContext;
EditText etData;

public TestFragment() {
    mContext = getActivity();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_blank, container, false);
    etData = (EditText) view.findViewById(R.id.etData);
    return view;
}

public String getEditTextData(){
   return etData.getText().toString();
}

}

Adapter for the viewpager -

public class Adapter extends FragmentStatePagerAdapter {
SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>();
public Adapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int position) {
    return new TestFragment();
}

@Override
public int getCount() {
    //create two pages
    return 2;
}

@Override
public Object instantiateItem(ViewGroup container, int position) {
    Fragment fragment = (Fragment) super.instantiateItem(container, position);
    registeredFragments.put(position, fragment);
    return fragment;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    registeredFragments.remove(position);
    super.destroyItem(container, position, object);
}

public Fragment getRegisteredFragment(int position) {
    return registeredFragments.get(position);
}

}

and the activity -

int prevPosition = 0; // first item position 0
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ViewPager viewPager = (ViewPager) findViewById(R.id.vp);
    final Adapter adapter = new Adapter(getSupportFragmentManager());
    viewPager.setAdapter(adapter);
    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {
            // when moves from one view to another on swiping
            TestFragment testFragment = (TestFragment) adapter.getRegisteredFragment(prevPosition);
            prevPosition = position;
            insertDataIntoTable(testFragment.getEditTextData());
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });
}

So the logic is everytime user swipes the viewpager, we get the data of the edittext from the view being swiped and insert it into the db. Now to get the edittext data of the fragment, we take the help of the adapter to return the instance of a fragment at a particular position. I tested it and it works fine !

Anindita Pani
  • 544
  • 3
  • 6
  • its nice answer maam but i tried it and i cant implement it in my codes can you implement your sample code in my code if your not that busy :( THANK YOU SO MUCH FOR PAYING ATTENTION WITH ME MAAM – RaRa Jan 24 '17 at 02:29