Java 用光标、Viewpager中的数据填充数组

Java 用光标、Viewpager中的数据填充数组,java,arrays,sqlite,android-viewpager,cursor,Java,Arrays,Sqlite,Android Viewpager,Cursor,我试图用游标中的数据填充数组,但如何填充呢?这是我的代码: public class Tab3Up extends Activity { private HipotecaDbAdapter dbAdapter; private Cursor cursor; private long id ; @Override public void onCreate(Bundle savedInstanceState) { supe

我试图用游标中的数据填充数组,但如何填充呢?这是我的代码:

public class Tab3Up extends Activity {

     private HipotecaDbAdapter dbAdapter;
        private Cursor cursor;
        private long id ;

     @Override
     public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.imageslide);
      ViewPagerAdapter adapter = new ViewPagerAdapter(this, imageArra);
      ViewPager myPager = (ViewPager) findViewById(R.id.view_pager);
      myPager.setAdapter(adapter);
      myPager.setCurrentItem(0);

         dbAdapter = new HipotecaDbAdapter(this);
            dbAdapter.abrir();
            cursor = dbAdapter.getRegistro(id);
           }
     private int imageArra[] = { R.drawable.foto1, R.drawable.foto2,
               R.drawable.foto3, R.drawable.foto4, };
和我的适配器:

public class ViewPagerAdapter extends PagerAdapter {

     Activity activity;
     int imageArray[];

     public ViewPagerAdapter(Activity act, int[] imgArra) {
      imageArray = imgArra;
      activity = act;
     }

     public int getCount() {
      return imageArray.length;
     }
          //MORE CODE HERE....
有了这段代码,我的应用程序运行得很好,但我需要更改主代码,用
sqlite-bd
中的数据填充数组。My
sqlite bd
有一个保存所有图像路径的字段

像这样的

ArrayList<Integer> array=new ArrayList<Integer>();
        if (cursor.moveToFirst()) {
           do {
               array.add(cursor.getInt(cursor.getColumnIndex(HipotecaDbAdapter.C_COLUMNA_FOTO1))); //<< pass column index here instead of i

             } while (cursor.moveToNext());
        }

        //fotos[0] = (Integer[])array.toArray(new Integer[array.size()]);
ArrayList数组=新的ArrayList();
if(cursor.moveToFirst()){
做{

array.add(cursor.getInt(cursor.getColumnIndex(HipotecaDbAdapter.C_COLUMNA_FOTO1));/这并不是对您问题的真正回答,但是,我也从sqlite中提取数据并将其显示在视图页面中。在这里,我尝试提取联系人信息(姓名和电话号码)。每个联系人信息都将显示在不同的屏幕中

我是这样做的:

Step 1: in my on create method, I am setting my adapter that I have made to display specific content.

public class ViewTest extends Activity {

    private List<String> testContactName = new ArrayList<String>();
    private List<String> testContactNumber = new ArrayList<String>();
    MyAdapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.viewpager_layout);

        ViewPager mViewPager = (ViewPager) findViewById(R.id.pager);
        mAdapter = new MyAdapter();
        mViewPager.setAdapter(mAdapter);

        try {
            getAllContacts();
        } catch (Exception e) {
            // TODO Auto-generated catch block


    e.printStackTrace();
    }

}



    Step 2 : Just getting all contacts from the database and adding the values to my arraylist.

public void getAllContacts() {
    Cursor cursor = getContentResolver().query(
            ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
            null,
            null,
            null,
            ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME
                    + " COLLATE LOCALIZED ASC");

    // Looping through the contacts and adding them to arrayList
    while (cursor.moveToNext()) {
        String name = cursor
                .getString(cursor
                        .getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
        String phoneNumber = cursor
                .getString(cursor
                        .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

        testContactName.add(name);
        mAdapter.notifyDataSetChanged();
        Log.i("Name: " + "" + "---", name);
        testContactNumber.add(phoneNumber);
        mAdapter.notifyDataSetChanged();
        Log.i("Number: " + "" + "---", phoneNumber);
    }

    cursor.close();
}

    Step 3: Defining my adapter.
private class MyAdapter extends PagerAdapter {

    public MyAdapter() {

        super();

    }

    @Override
    public int getCount() {

        return testContactName.size();

    }

    @Override
    public boolean isViewFromObject(View collection, Object object) {

        return collection == ((View) object);
    }

    @Override
    public Object instantiateItem(View collection, int position) {

        LayoutInflater inflater = (LayoutInflater) collection.getContext()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View view = inflater.inflate(R.layout.viewpager_items, null);

        TextView contactName = (TextView) view.findViewById(R.id.labelText);
        TextView contactNumber = (TextView) view
                .findViewById(R.id.answerText);

        try {
            contactName.setText(testContactName.get(position));
            contactNumber.setText(testContactNumber.get(position));
        } catch (Exception e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        ((ViewPager) collection).addView(view, 0);
        return view;

    }

    @Override
    public void destroyItem(View collection, int position, Object view) {
        ((ViewPager) collection).removeView((View) view);
        mAdapter.notifyDataSetChanged();

    }

}
步骤1:在我的on create方法中,我正在设置我制作的适配器以显示特定内容。
公共类ViewTest扩展了活动{
私有列表testContactName=new ArrayList();
私有列表testContactNumber=new ArrayList();
MyAdapter mAdapter;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
//TODO自动生成的方法存根
super.onCreate(savedInstanceState);
setContentView(R.layout.viewpager\u布局);
ViewPager mViewPager=(ViewPager)findViewById(R.id.pager);
mAdapter=新的MyAdapter();
mViewPager.setAdapter(mAdapter);
试一试{
getAllContacts();
}捕获(例外e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
第2步:从数据库中获取所有联系人,并将这些值添加到我的arraylist中。
public void getAllContacts(){
Cursor Cursor=getContentResolver().query(
ContactsContract.CommonDataTypes.Phone.CONTENT\u URI,
无效的
无效的
无效的
Contacts contract.CommonDataTypes.Phone.DISPLAY\u NAME
+“核对本地化ASC”);
//循环浏览联系人并将其添加到arrayList
while(cursor.moveToNext()){
字符串名称=游标
.getString(游标
.getColumnIndex(ContactsContract.CommonDataTypes.Phone.DISPLAY_NAME));
字符串phoneNumber=光标
.getString(游标
.getColumnIndex(ContactsContract.CommonDataTypes.Phone.NUMBER));
testContactName.add(name);
mAdapter.notifyDataSetChanged();
Log.i(“名称:“+”+“--”,名称);
testContactNumber.add(电话号码);
mAdapter.notifyDataSetChanged();
Log.i(“号码:“+”+“--”,电话号码);
}
cursor.close();
}
步骤3:定义我的适配器。
私有类MyAdapter扩展了PagerAdapter{
公共MyAdapter(){
超级();
}
@凌驾
public int getCount(){
返回testContactName.size();
}
@凌驾
公共布尔值isViewFromObject(视图集合,对象){
返回集合==((视图)对象);
}
@凌驾
公共对象实例化项(视图集合,int位置){
LayoutInflater充气器=(LayoutInflater)集合。getContext()
.getSystemService(上下文布局\充气机\服务);
视图=充气机。充气(R.layout.viewpager_项,空);
TextView contactName=(TextView)view.findViewById(R.id.labelText);
TextView联系人号码=(TextView)视图
.findviewbyd(R.id.answerText);
试一试{
setText(testContactName.get(position));
contactNumber.setText(testContactNumber.get(position));
}捕获(异常e1){
//TODO自动生成的捕捉块
e1.printStackTrace();
}
((ViewPager)集合).addView(视图,0);
返回视图;
}
@凌驾
公共项(视图集合、int位置、对象视图){
((ViewPager)集合)。移除视图((视图)视图);
mAdapter.notifyDataSetChanged();
}
}
}

最后,布局:

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"></android.support.v4.view.ViewPager>

如果需要viewpager_items.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/background"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/background_dark"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/labelText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="30dp"
        android:background="@android:color/background_dark"
        android:gravity="left"
        android:text="Loading..."
        android:textColor="#FFFFFF"
        android:textSize="24sp"
        android:textStyle="bold"
        android:typeface="sans" />

    <View
        android:layout_width="match_parent"
        android:layout_height="3dp"
        android:background="@android:color/background_dark" />

    <ScrollView
        android:id="@+id/scrollView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/answerText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="30dp"
            android:gravity="left"
            android:padding="5dp"
            android:text="Loading.."
            android:textColor="#FFFFFF"
            android:textSize="24sp" />
    </ScrollView>

</LinearLayout>

希望这能让你对你的问题有所了解


希望这也能帮助其他观众:)

到底是什么问题?你无法从游标获取数组?你无法将此数组发送到ViewPagerAdapter?两者都是,我不知道如何处理数组,首先我需要将数据从游标发送到数组,然后再发送到ViewPagerAdapter。最后一段代码是我最后一次尝试。这非常有用。But当我添加几个
文本视图
按钮
时,滑动速度变慢了。有什么想法吗?@PranjalCholadhara在某种程度上是正确的,但这是旧的。我认为有很多新的库来处理sqlite,例如Realm:以及使用CursorAdapter实现的回收器视图。我已经准备好了代码,但没有幸运的是,我没有太多的时间根据这些问题的需要重新创建这些东西。但是,是的,这两个库值得一看:)