2013-08-08 3 views
0

그래서 ListView 및 해당 사용자 지정 어댑터가 있습니다 데이터베이스에 값을 추가하고 목록을 다시 채우십시오. 그래서 다음과 같은 방법으로 항목을 추가했습니다 : q, w, e, r , t는, Y는 유 난, O, P 같이 채워진리스트 뷰는 다음과 같다 (Q)은, E, R, T, Y, Q, Q, QListView 첫 번째 항목을 여러 번 추가

, 승 이것은 커스텀 어댑터

public class TestListAdapter extends BaseAdapter { 
    private static ArrayList<FlashCard> flashCardItems; 

    private LayoutInflater mInflater; 
    private Context context; 
    public TestListAdapter(Context context, ArrayList<FlashCard> results) { 
     this.context = context; 
     flashCardItems = results; 
     mInflater = LayoutInflater.from(context); 

    } 

    public int getCount() { 
     return flashCardItems.size(); 
    } 

    public Object getItem(int position) { 
     return flashCardItems.get(position); 
    } 

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

    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.flashcard, null); 
      holder = new ViewHolder(); 
      holder.flipper = (ViewFlipper) convertView.findViewById(R.id.flashcard); 
      convertView.setTag(holder); 
     } 
     else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     holder.flipper.addView(FlashCard.createQuestionCard(context,flashCardItems.get(position).getQuestion())); 


     return convertView; 
    } 

    static class ViewHolder { 
     ViewFlipper flipper; 
    } 

} 

이것은 데이터베이스 처리기입니다.

public class DatabaseHandler extends SQLiteOpenHelper { 

    // All Static variables 
    // Database Version 
    private static final int DATABASE_VERSION = 1; 

    // Database Name 
    private static final String DATABASE_NAME = "mySchoolDB"; 

    // Flashcards table name 
    private static final String TABLE_FLASHCARDS = "flashcards"; 

    // Flashcards Table Columns names 
    private static final String KEY_ID = "id"; 
    private static final String QUESTION = "question"; 
    private static final String ANSWER = "answer"; 

    public DatabaseHandler(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    // Creating Tables 
    @Override 
    public void onCreate(SQLiteDatabase db) { 
     String CREATE_FLASHCARDS_TABLE = "CREATE TABLE " + TABLE_FLASHCARDS + "(" 
       + KEY_ID + " INTEGER PRIMARY KEY," + QUESTION + " TEXT," 
       + ANSWER + " TEXT" + ")"; 
     db.execSQL(CREATE_FLASHCARDS_TABLE); 
    } 

    // Upgrading database 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // Drop older table if existed 
     db.execSQL("DROP TABLE IF EXISTS " + TABLE_FLASHCARDS); 

     // Create tables again 
     onCreate(db); 
    } 

    /** 
    * All CRUD(Create, Read, Update, Delete) Operations 
    */ 

    // Adding new Flashcard 
    public void addFlashcard(FlashCard flashcard) { 
     SQLiteDatabase db = this.getWritableDatabase(); 

     ContentValues values = new ContentValues(); 
     values.put(QUESTION, flashcard.getQuestion()); // flashcard Name 
     values.put(ANSWER, flashcard.getAnswer()); // flashcard Phone 

     // Inserting Row 
     db.insert(TABLE_FLASHCARDS, null, values); 
     db.close(); // Closing database connection 
    } 

    // Getting single FlashCard 
    public FlashCard getFlashcard(int id) { 
     SQLiteDatabase db = this.getReadableDatabase(); 

     Cursor cursor = db.query(TABLE_FLASHCARDS, new String[] { KEY_ID, 
       QUESTION, ANSWER }, KEY_ID + "=?", 
       new String[] { String.valueOf(id) }, null, null, null, null); 
     if (cursor != null) 
      cursor.moveToFirst(); 

     FlashCard flashcard= new FlashCard(Integer.parseInt(cursor.getString(0)), 
       cursor.getString(1), cursor.getString(2)); 
     cursor.close(); 
     db.close(); 
     // return FlashCard 
     return flashcard; 
    } 

    // Getting All Flashcards 
    public ArrayList<FlashCard> getAllFlashcards() { 
     ArrayList<FlashCard> FlashcardList = new ArrayList<FlashCard>(); 
     // Select All Query 
     String selectQuery = "SELECT * FROM " + TABLE_FLASHCARDS; 

     SQLiteDatabase db = this.getWritableDatabase(); 
     Cursor cursor = db.rawQuery(selectQuery, null); 

     // looping through all rows and adding to list 
     if (cursor.moveToFirst()) { 
      do { 
       FlashCard flashcard = new FlashCard(Integer.parseInt(cursor.getString(0)),cursor.getString(1),cursor.getString(2)); 

       // Adding Flashcard to list 
       FlashcardList.add(flashcard); 
      } while (cursor.moveToNext()); 
     } 

     cursor.close(); 
     db.close(); 
     // return Flashcard list 
     return FlashcardList; 
    } 

    // Updating single Flashcard 
    public int updateFlashcard(FlashCard flashcard) { 
     SQLiteDatabase db = this.getWritableDatabase(); 

     ContentValues values = new ContentValues(); 
     values.put(QUESTION, flashcard.getQuestion()); 
     values.put(ANSWER, flashcard.getAnswer()); 
     db.close(); 
     // updating row 
     return db.update(TABLE_FLASHCARDS, values, KEY_ID + " = ?", 
       new String[] { String.valueOf(flashcard.getID()) }); 

    } 

    // Deleting single Flashcard 
    public void deleteFlashcard(FlashCard flashcard) { 
     SQLiteDatabase db = this.getWritableDatabase(); 
     db.delete(TABLE_FLASHCARDS, KEY_ID + " = ?", 
       new String[] { String.valueOf(flashcard.getID()) }); 
     db.close(); 
    } 


    // Getting Flashcards Count 
    public int getFlashcardsCount() { 
     String countQuery = "SELECT * FROM " + TABLE_FLASHCARDS; 
     SQLiteDatabase db = this.getReadableDatabase(); 
     Cursor cursor = db.rawQuery(countQuery, null); 
     cursor.close(); 

     // return count 
     return cursor.getCount(); 
    } 


    public void deleteAllFlashCards(){ 
     SQLiteDatabase sdb= this.getWritableDatabase(); 
     sdb.delete(TABLE_FLASHCARDS, null, null); 
     sdb.close(); 
    } 



} 

는 이것은

public class TestList extends ListView 
{ 
    private Context context; 
    private ArrayList<FlashCard> stringArray = new ArrayList<FlashCard>(); 

    public TestList(Context context) { 
     super(context); 
     this.context = context; 
     setResults(); 
    } 

    public void setResults() { 
     DatabaseHandler db = new DatabaseHandler(context); 
     stringArray = db.getAllFlashcards(); 

     setAdapter(new TestListAdapter(context, stringArray)); 
    } 

    public TestList(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    public void addFlashCardDialog() { 
     final AlertDialog.Builder builder = new AlertDialog.Builder(context); 
     builder.setTitle("Add flashcard"); 
     final EditText question = new EditText(context); 
     question.setHint("Question"); 
     final EditText answer = new EditText(context); 
     answer.setHint("Answer"); 
     LinearLayout qa = new LinearLayout(context); 
     qa.setOrientation(LinearLayout.VERTICAL); 
     qa.addView(question); 
     qa.addView(answer); 
     builder.setView(qa); 

     builder.setPositiveButton("Add", new DialogInterface.OnClickListener() { 

      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       FlashCard f = new FlashCard(question.getText().toString(), answer.getText().toString()); 
       DatabaseHandler db = new DatabaseHandler(context); 
       db.addFlashcard(f); 
       setResults(); 

      } 
     }); 

     builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 

      } 
     }); 
     builder.show(); 
    } 
} 

답변

0

addView() 현재 존재하는 뷰를 교체하지 않는 목록보기입니다. convertView 재활용 할 돌아 오면, 'Q'는 이미 ViewFlipper 내부에 존재하는, 당신은 q는 멀리 갈와 '유'

holder.flipper.addView(FlashCard.createQuestionCard(context,flashCardItems.get(position).getQuestion())); 

가 새로보기 지느러미 내부의보기를 설정 시도로 대체합니다 addView()를 사용하는 대신 값을 반환합니다.

예 : 문제가 ViewFlipper 당신이 당신의 어댑터를 사용하고있는에서 오는

TextView text = (TextView) ViewFlipper.findViewById(R.id.textView); 
    text.setText(flashCardItems.get(position).getQuestion()); 
0

.

안드로이드의 목록보기는 뷰 리사이클을 사용하지만 (보기는 convertView가 getView에서 사용하는 것임) 뷰가 재활용 될 때마다 어떻게 처리하는지에 따라 다른 뷰를 플리퍼에 추가 할 때 필요한 작업 convertView가 null 일 때보기를 추가하고 데이터를 나타 내기 위해 플리퍼에서보기를 수정합니다. 질문 카드보기의 작동 방식을 모르므로 그냥 추측하고 있습니다.

public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.flashcard, null); 
     holder = new ViewHolder(); 
     holder.flipper = (ViewFlipper) convertView.findViewById(R.id.flashcard); 
     holder.card = FlashCard.createQuestionCard(context,flashCardItems.get(position).getQuestion()); 
     holder.filpper.addView(holder.card); 
     convertView.setTag(holder); 
    } 
    else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 
    holder.card.setQuestion(flashCardItems.get(position).getQuestion()); 


    return convertView; 
} 

분명히 당신은 당신의 뷰 홀더를 조정하고 적절한 유형 카드 필드를 추가하고 questionCard보기에 setQuestion 방법을 추가해야하지만 당신은 아이디어를 얻을.

+0

도움이되었지만 한 항목을 클릭 할 때 해당 항목과 임의의 항목이 뒤집혀서 listview의 마지막 몇 항목을 클릭하면 널 포인트 예외가 발생합니다. 내 onitemclick에서이 일을하고있다 LinearLayout ll = (LinearLayout) av.getChildAt (i); \t \t ViewFlipper vf = (ViewFlipper) ll.getChildAt (0); 그 라인은 nullpointer를 던지고 있습니다. 그러나 마지막 몇 분 동안 만 –

+0

나는'av'가 당신의 목록보기라고 생각하고있다. 그러나 나는 당신이 클릭 한보기를 원한다면 어쨌든 알고있다. 그러면 onItemClick 메소드에 전달 된'view' 매개 변수를 사용한다. – Eluvatar

+0

나는 그것을 뒤로 가져 간다. 당신의 해결책은 도움이되지 않았다. (그것도 똑같은 일을한다. –

관련 문제