我如何将数据从数据库移动到我的 ViewPager?

How i can move data from DB to my ViewPager?

Class 带DB和Adapter的实现。

public class MainActivity extends AppCompatActivity {//implements 
View.OnClickListener{

ArrayList<String> titles = new ArrayList<>();

ArrayAdapter arrayAdapter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    ListView listView = findViewById(R.id.listView);
arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, 
titles);
    listView.setAdapter(arrayAdapter);

    try {

        SQLiteDatabase myDatabase = this.openOrCreateDatabase("Places", 
MODE_PRIVATE, null);

        myDatabase.execSQL("CREATE TABLE IF NOT EXISTS places (name VARCHAR, 
time INT(2), solo INT(1), id INTEGER PRIMARY KEY)");

        myDatabase.execSQL("INSERT INTO places (name, time, solo) VALUES 
('One', 23, 1)");
        myDatabase.execSQL("INSERT INTO places (name, time, solo) VALUES 
('Two', 24, 2)");
        myDatabase.execSQL("INSERT INTO places (name, time, solo) VALUES 
('Three', 22, 1)");
        myDatabase.execSQL("INSERT INTO places (name, time, solo) VALUES 
('Four', 02, 2)");

        Cursor c = myDatabase.rawQuery("SELECT * FROM places WHERE solo = 
1", null);

        int nameIndex = c.getColumnIndex("name");
        int timeIndex = c.getColumnIndex("time");
        int soloIndex = c.getColumnIndex("solo");
        int idIndex = c.getColumnIndex("id");



        if (c.moveToFirst()) {
            titles.clear();
            do {
                titles.add(c.getString(nameIndex));



            } while (c.moveToNext());
            arrayAdapter.notifyDataSetChanged();
        }
        c.close();
        myDatabase.execSQL("DELETE FROM places");

    }
    catch (Exception e) {

        e.printStackTrace();
    }

}

}

Class 实现Fragment和PagerAdapter:

public class MyGallery extends AppCompatActivity {

private SectionsPagerAdapter mSectionsPagerAdapter;

private ViewPager mViewPager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my_gallery);

    // Create the adapter that will return a fragment for each of the three
    // primary sections of the activity.
    mSectionsPagerAdapter = new 
SectionsPagerAdapter(getSupportFragmentManager());

    // Set up the ViewPager with the sections adapter.
    mViewPager = (ViewPager) findViewById(R.id.container);
    mViewPager.setAdapter(mSectionsPagerAdapter);

}


/**
 * A placeholder fragment containing a simple view.
 */
public static class PlaceholderFragment extends Fragment {
    /**
     * The fragment argument representing the section number for this
     * fragment.
     */
    private static final String ARG_SECTION_NUMBER = "section_number";

    public PlaceholderFragment() {
    }

    /**
     * Returns a new instance of this fragment for the given section
     * number.
     */
    public static PlaceholderFragment newInstance(int sectionNumber) {
        PlaceholderFragment fragment = new PlaceholderFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, sectionNumber);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_my_gallery, 
container, false);
        TextView textView = (TextView) 
rootView.findViewById(R.id.section_label);
        textView.setText(getString(R.string.section_format, 
getArguments().getInt(ARG_SECTION_NUMBER)));
        return rootView;
    }
}

/**
 * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
 * one of the sections/tabs/pages.
 */
public class SectionsPagerAdapter extends FragmentPagerAdapter {

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        // getItem is called to instantiate the fragment for the given page.
        // Return a PlaceholderFragment (defined as a static inner class 
below).
        return PlaceholderFragment.newInstance(position + 1);
    }

    @Override
    public int getCount() {
        // Show 3 total pages.
        return 3;
    }
}
}

我正在尝试将名为 "name" (nameIndex) 的字段从数据库移动到 viewpager 屏幕。我无法通过创建片段将游标值移动到 class。我阅读了有关将数据输入列表并从那里移动的方法,将所需位置的数量移动到 FragmentPager,但它并没有完全解决。有人可以知道解决这个问题的简单而优雅的方法吗?

当您实例化 FragmentPagerAdapter 时,将 ArrayList 作为参数传递给适配器构造函数

mSectionsPagerAdapter = new
                SectionsPagerAdapter(getSupportFragmentManager(), titles);

        // Set up the ViewPager with the sections adapter.
        mViewPager = (ViewPager) findViewById(R.id.container);
        mViewPager.setAdapter(mSectionsPagerAdapter);

在您的适配器中使用引用,并从数组中获取字符串,例如

public class SectionsPagerAdapter extends FragmentPagerAdapter {

    private ArrayList<String> strings;

    public SectionsPagerAdapter(FragmentManager fm, ArrayList<String> strings) {
        super(fm);

        this.strings = strings;
    }

    @Override
    public Fragment getItem(int position) {

        return PlaceholderFragment.newInstance(position + 1, strings.get(position + 1));
    }

    @Override
    public int getCount() {

        return strings.size();
    }
}

最后,在您的 Fragment class 中,将其作为参数传递,并作为全局变量从 onCreate 方法中获取

public static class PlaceholderFragment extends Fragment {
    /**
     * The fragment argument representing the section number for this
     * fragment.
     */
    private static final String ARG_SECTION_NUMBER = "section_number";

    private String title;

    public PlaceholderFragment() {
    }

    /**
     * Returns a new instance of this fragment for the given section
     * number.
     */
    public static PlaceholderFragment newInstance(int sectionNumber, String title) {
        PlaceholderFragment fragment = new PlaceholderFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, sectionNumber);
        args.putString("key", title);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        title = getArguments().getString("key");
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_my_gallery,
                container, false);
        TextView textView = (TextView)
                rootView.findViewById(R.id.section_label);
        textView.setText(getString(R.string.section_format,
                getArguments().getInt(ARG_SECTION_NUMBER)));
        return rootView;
    }
}

注意。为了更好地控制您的代码,如果您的片段数量有限,您应该使用 switch 语句进行所有情况。当超出数组的索引时,在您的适配器中调用 position + 1 可能会抛出 nullpointerexception。您可以使用 viewPager.setCurrentItem(position); 开始任何位置,带有 switch 语句的 FragmentPagerAdapter 示例应该看起来像

@Override
    public Fragment getItem(int position) {

        switch (position) {

            case 0:
                return PlaceholderFragment.newInstance(position, strings.get(position));
            case 1:
                return PlaceholderFragment.newInstance(position, strings.get(position));
            case 2:
                return PlaceholderFragment.newInstance(position, strings.get(position));
                default:
                    return something...
        }
    }