2016-06-21 23 views
3

我已經制作了一個測驗應用程序,其中我已將問題存儲在數據庫中,然後以列表的形式從數據庫中取出,並且我正在製作自定義片段以從ArrayList的,但我對每一個片段製作自定義片段後在應用程序中獲取錯誤

只得到1個問題這是我的數據庫代碼

package com.example.android.viewpager4; 
import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 

import java.util.ArrayList; 
import java.util.List; 

public class DbHelper extends SQLiteOpenHelper { 
    private static final int DATABASE_VERSION = 1; 
    // Database Name 
    private static final String DATABASE_NAME = "triviaQuiz"; 
    // tasks table name 
    private static final String TABLE_QUEST = "quest"; 
    // tasks Table Columns names 
    private static final String KEY_ID = "id"; 
    private static final String KEY_QUES = "question"; 
    private static final String KEY_ANSWER = "answer"; //correct option 
    private static final String KEY_OPTA= "opta"; //option a 
    private static final String KEY_OPTB= "optb"; //option b 
    private static final String KEY_OPTC= "optc"; //option c 
    private SQLiteDatabase dbase; 
    public DbHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 
    @Override 
    public void onCreate(SQLiteDatabase db) { 
     dbase=db; 
     String sql = "CREATE TABLE IF NOT EXISTS " + TABLE_QUEST + " (" 
       + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_QUES 
       + " TEXT, " + KEY_ANSWER+ " TEXT, "+KEY_OPTA +" TEXT, " 
       +KEY_OPTB +" TEXT, "+KEY_OPTC+" TEXT)"; 
     db.execSQL(sql);   
     addQuestions(); 
     //db.close(); 
    } 
    private void addQuestions() 
    { 
     Question q1=new Question("What is JP?","Jalur Pesawat", "Jack sParrow", "Jasa Programmer", "Jasa Programmer"); 
     this.addQuestion(q1); 
     Question q2=new Question("where the JP place?", "Monas, Jakarta", "Gelondong, Bangun Tapan, bantul", "Gelondong, Bangun Tapan, bandul", "Gelondong, Bangun Tapan, bantul"); 
     this.addQuestion(q2); 
     Question q3=new Question("who is CEO of the JP?","Usman and Jack", "Jack and Rully","Rully and Usman", "Rully and Usman"); 
     this.addQuestion(q3); 
     Question q4=new Question("what do you know about JP?", "JP is programmer home", "JP also realigy home", "all answer is true","all answer is true"); 
     this.addQuestion(q4); 
     Question q5=new Question("what do you learn in JP?","Realigy","Programming","all answer is true","all answer is true"); 
     this.addQuestion(q5); 
    } 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldV, int newV) { 
     // Drop older table if existed 
     db.execSQL("DROP TABLE IF EXISTS " + TABLE_QUEST); 
     // Create tables again 
     onCreate(db); 
    } 
    // Adding new question 
    public void addQuestion(Question quest) { 
     //SQLiteDatabase db = this.getWritableDatabase(); 
     ContentValues values = new ContentValues(); 
     values.put(KEY_QUES, quest.getQUESTION()); 
     values.put(KEY_ANSWER, quest.getANSWER()); 
     values.put(KEY_OPTA, quest.getOPTA()); 
     values.put(KEY_OPTB, quest.getOPTB()); 
     values.put(KEY_OPTC, quest.getOPTC()); 
     // Inserting Row 
     dbase.insert(TABLE_QUEST, null, values);   
    } 
    public List<Question> getAllQuestions() { 
     List<Question> quesList = new ArrayList<Question>(); 
     // Select All Query 
     String selectQuery = "SELECT * FROM " + TABLE_QUEST; 
     dbase=this.getReadableDatabase(); 
     Cursor cursor = dbase.rawQuery(selectQuery, null); 
     // looping through all rows and adding to list 
     if (cursor.moveToFirst()) { 
      do { 
       Question quest = new Question(); 
       quest.setID(cursor.getInt(0)); 
       quest.setQUESTION(cursor.getString(1)); 
       quest.setANSWER(cursor.getString(2)); 
       quest.setOPTA(cursor.getString(3)); 
       quest.setOPTB(cursor.getString(4)); 
       quest.setOPTC(cursor.getString(5)); 
       quesList.add(quest); 
      } while (cursor.moveToNext()); 
     } 
     // return quest list 
     return quesList; 
    } 
    public int rowcount() 
    { 
     int row=0; 
     String selectQuery = "SELECT * FROM " + TABLE_QUEST; 
     SQLiteDatabase db = this.getWritableDatabase(); 
     Cursor cursor = db.rawQuery(selectQuery, null); 
     row=cursor.getCount(); 
     return row; 
    } 
} 

,這是我question.java類

package com.example.android.viewpager4; 
public class Question { 
    private int ID; 
    private String QUESTION; 
    private String OPTA; 
    private String OPTB; 
    private String OPTC; 
    private String ANSWER; 
    public Question() 
    { 
     ID=0; 
     QUESTION=""; 
     OPTA=""; 
     OPTB=""; 
     OPTC=""; 
     ANSWER=""; 
    } 
    public Question(String qUESTION, String oPTA, String oPTB, String oPTC, 
        String aNSWER) { 

     QUESTION = qUESTION; 
     OPTA = oPTA; 
     OPTB = oPTB; 
     OPTC = oPTC; 
     ANSWER = aNSWER; 
    } 
    public int getID() 
    { 
     return ID; 
    } 
    public String getQUESTION() { 
     return QUESTION; 
    } 
    public String getOPTA() { 
     return OPTA; 
    } 
    public String getOPTB() { 
     return OPTB; 
    } 
    public String getOPTC() { 
     return OPTC; 
    } 
    public String getANSWER() { 
     return ANSWER; 
    } 
    public void setID(int id) 
    { 
     ID=id; 
    } 
    public void setQUESTION(String qUESTION) { 
     QUESTION = qUESTION; 
    } 
    public void setOPTA(String oPTA) { 
     OPTA = oPTA; 
    } 
    public void setOPTB(String oPTB) { 
     OPTB = oPTB; 
    } 
    public void setOPTC(String oPTC) { 
     OPTC = oPTC; 
    } 
    public void setANSWER(String aNSWER) { 
     ANSWER = aNSWER; 
    } 

} 

,這是我的自定義代碼片段

package com.example.android.viewpager4; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.RadioButton; 
import android.widget.TextView; 

import java.util.List; 

/** 
* Created by Vikas on 6/19/2016. 
*/ 
public class FirstFragment extends Fragment { 
    // Store instance variables 
    private String question; 
    private String radio_1,radio_2,radio_3; 

    private int page; 



    List<Question> quesList; 

    int qid=0; 
    Question currentQ; 
    TextView txtQuestion; 
    RadioButton rda, rdb, rdc; 


    // newInstance constructor for creating fragment with arguments 
    public static FirstFragment newInstance(int page, String question,String radio_1,String radio_2,String radio_3) 
    { 
     FirstFragment fragmentFirst = new FirstFragment(); 
     Bundle args = new Bundle(); 
     args.putInt("someInt", page); 
     args.putString("some_question", question); 
     args.putString("some_option1",radio_1); 
     args.putString("some_option1",radio_2); 
     args.putString("some_option1",radio_3); 

     fragmentFirst.setArguments(args); 
     return fragmentFirst; 
    } 

    // Store instance variables based on arguments passed 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     DbHelper db = new DbHelper(getContext()); 
     quesList = db.getAllQuestions(); //get all the questions from database 

     //getting the id of the question 
     currentQ = quesList.get(qid); 
     page = getArguments().getInt("someInt", 0); 
     question = getArguments().getString("some_question",currentQ.getQUESTION()); 
     radio_1=getArguments().getString("some_option1", currentQ.getOPTA()); 
     radio_2=getArguments().getString("some_option2", currentQ.getOPTB()); 
     radio_3=getArguments().getString("some_option3", currentQ.getOPTC()); 
     qid++; 
    } 

    // Inflate the view for the fragment based on layout XML 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment1_layout, container, false); 
     TextView question_view = (TextView) view.findViewById(R.id.question_id); 
     question_view.setText(question); 
     rda=(RadioButton)view.findViewById(R.id.radioButton1); 
     rdb=(RadioButton)view.findViewById(R.id.radioButton2); 
     rdc=(RadioButton)view.findViewById(R.id.radioButton3); 
     rda.setText(radio_1); 
     rdb.setText(radio_2); 
     rdc.setText(radio_3); 
     return view; 
    } 
} 

,這我的主要activity.java

package com.example.android.viewpager4; 

import android.os.Bundle; 
import android.support.v4.view.ViewPager; 
import android.support.v7.app.AppCompatActivity; 

import java.util.List; 
import java.util.Vector; 

public class MainActivity extends AppCompatActivity 
{ 
    List<Question> quesList; 
    int qid=0; 
    Question currentQ; 



    private PagerAdapter mPagerAdapter; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.viewpager_layout); 
     initialisePaging(); 
    } 

    private void initialisePaging() 
    { 

     DbHelper db = new DbHelper(this); 
     quesList = db.getAllQuestions(); //get all the questions from database 

     //getting the id of the question 
     currentQ = quesList.get(qid); 
     List<FirstFragment> fragments =new Vector<FirstFragment>(); 
     fragments.add(FirstFragment.newInstance(0,currentQ.getQUESTION(),currentQ.getOPTA(),currentQ.getOPTB(),currentQ.getOPTC())); 
     qid++; 
     fragments.add(FirstFragment.newInstance(1,currentQ.getQUESTION(),currentQ.getOPTA(),currentQ.getOPTB(),currentQ.getOPTC())); 
     qid++; 
     fragments.add(FirstFragment.newInstance(2,currentQ.getQUESTION(),currentQ.getOPTA(),currentQ.getOPTB(),currentQ.getOPTC())); 


     mPagerAdapter = new com.example.android.viewpager4.PagerAdapter(this.getSupportFragmentManager(),fragments); 
     ViewPager pager =(ViewPager)findViewById(R.id.viewpager); 
     pager.setAdapter(mPagerAdapter); 
    } 
} 

,這是我pageadapter.java

package com.example.android.viewpager4; 

import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 

import java.util.List; 

/** 
* Created by Vikas on 4/27/2016. 
*/ 
public class PagerAdapter extends FragmentPagerAdapter 
{ 
    private List<FirstFragment> fragments; 

    public PagerAdapter(FragmentManager fm, List<FirstFragment> fragments) { 
     super(fm); 
     this.fragments = fragments; 
    } 

    @Override 
    public Fragment getItem(int arg0) 
    { 
     return this.fragments.get(arg0); 
    } 

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

} 

,這整個代碼我後在每個片段中得到同樣的問題請告訴我應該做的變化請提前致謝,請提前致謝

+2

請發佈錯誤日誌? – pRaNaY

+0

您可以通過將'Question'對象直接傳遞到片段的'newInstance'方法而不是單個部分並查詢該對象的數據庫來節省一些CPU時間 –

回答

1

這是因爲在嘗試添加問題時出現錯誤。你一次又一次地添加相同的問題。

更改下面的代碼:

currentQ = quesList.get(qid); 
     List<FirstFragment> fragments =new Vector<FirstFragment>(); 
     fragments.add(FirstFragment.newInstance(0,currentQ.getQUESTION(),currentQ.getOPTA(),currentQ.getOPTB(),currentQ.getOPTC())); 
     qid++; 
     fragments.add(FirstFragment.newInstance(1,currentQ.getQUESTION(),currentQ.getOPTA(),currentQ.getOPTB(),currentQ.getOPTC())); 
     qid++; 
     fragments.add(FirstFragment.newInstance(2,currentQ.getQUESTION(),currentQ.getOPTA(),currentQ.getOPTB(),currentQ.getOPTC())); 

currentQ = quesList.get(qid); 
     List<FirstFragment> fragments =new Vector<FirstFragment>(); 
     fragments.add(FirstFragment.newInstance(0,currentQ.getQUESTION(),currentQ.getOPTA(),currentQ.getOPTB(),currentQ.getOPTC())); 
     qid++; 
currentQ = quesList.get(qid); 
     fragments.add(FirstFragment.newInstance(1,currentQ.getQUESTION(),currentQ.getOPTA(),currentQ.getOPTB(),currentQ.getOPTC())); 
     qid++; 
currentQ = quesList.get(qid); 
     fragments.add(FirstFragment.newInstance(2,currentQ.getQUESTION(),currentQ.getOPTA(),currentQ.getOPTB(),currentQ.getOPTC())); 
+0

嘿,人感謝您的幫助,但您能幫我嗎在這個問題上 –

+0

stackoverflow.com/questions/37929898/...我真的需要幫助這個其他我會放鬆我的實習,所以你可以請幫助 –

+0

嘿人感謝您的幫助,直到現在,但我有一個問題,我已經更新相同的自定義片段代碼,但它是給不幸的是你的應用程序已停止請看看它 –

0

我覺得這些三行您的問題起源,因爲所有的密鑰是相同的。

args.putString("some_option1",radio_1); 
args.putString("some_option1",radio_2); 
args.putString("some_option1",radio_3); 

一些建議,儘量重組喜歡你的適配器填充的代碼,以便

quesList = db.getAllQuestions(); 
for (int page = 0; page < quesList.size(); page++) { 
    Question currentQ = quesList.get(page); 
    // Is that page parameter needed in here? 
    FirstFragment questionFragment = FirstFragment.newInstance(page, currentQ); 
    fragments.add(questionFragment); 
} 

mPagerAdapter = new com.example.android.viewpager4.PagerAdapter(this.getSupportFragmentManager(),fragments); 

注意currentQnewInstance看起來比較清爽比currentQ.getQUESTION(),currentQ.getOPTA(),currentQ.getOPTB(),currentQ.getOPTC()


爲了防止周圍的名單拋片段對象,但是,您可以更改適配器以獲取問題列表。

public class QuestionPagerAdapter extends FragmentPagerAdapter 
{ 
    private List<Question> questions; 

    public PagerAdapter(FragmentManager fm, List<Question> questions) { 
     super(fm); 
     this.questions = questions; 
    } 

    @Override 
    public Fragment getItem(int position) 
    { 
     Question q = questions.get(position); 
     // Is that int parameter needed here? 
     return FirstFragment.newInstance(position, q); 
    } 

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

在這兩種這些情況下,您需要更新newInstance方法。

public static FirstFragment newInstance(int page, Question q) 
{ 
    FirstFragment fragmentFirst = new FirstFragment(); 
    Bundle args = new Bundle(); 
    args.putInt("someInt", page); // Is this needed? 
    args.putString("some_question", q.getQUESTION()); 
    args.putString("some_option1",q.getOPTA()); 
    args.putString("some_option2",q.getOPTB()); 
    args.putString("some_option3",q.getOPTC()); 

    fragmentFirst.setArguments(args); 
    return fragmentFirst; 
} 

然後,使該方法看起來乾淨了一點,你可以做的,就像你對數據庫鍵來完成這些參數字符串一些public static final String領域。

例如

public static final String ARG_QUESTION = "some_question"; 
public static final String ARG_OPT_A = "some_option1"; 
// etc. 

然後

args.putString(ARG_QUESTION, q.getQUESTION()); 
args.putString(ARG_OPT_A, q.getOPTA()); 
// etc. 

而且

Bundle args = getArguments(); 
if (args != null) 
{ 
    question = args.getString(ARG_QUESTION, currentQ.getQUESTION()); 
    radio_1 = args.getString(ARG_OPT_A, currentQ.getOPTA()); 
    // etc. 
} 

最後,使Question實施Parcelable將是最好的應用程序roach將數據傳遞到片段中,這樣,您不需要將currentQ從數據庫中取出。 (因爲您正在讀取整個數據庫,並且只有在缺少這些參數時纔會默認爲qid)。

+0

嘿人感謝您的所有幫助,但你能幫我在這個問題上 –

+0

http://stackoverflow.com/questions/37929898/im -try-import-open-data-kit-sc-that-i-got-from-github-but-i-kept-getting我真的需要這方面的幫助,否則我會放棄我的實習如此,請你幫忙 –

+0

很抱歉聽到這個消息,但實習只是一種學習體驗,而不是隨意的工作。告訴同事,如果他們不能幫助,你的老闆應該理解你的掙扎,並且願意爲你分配更多可管理的任務。 –

相關問題