2017-06-23 96 views
0

我想做一個recyclerview列表的演講,並使用的數據集存儲在SQLite數據庫中,我不知道我失蹤,但列表適配器仍然記錄零計數從列表,因此列表視圖不會被填充的物品填充sqlite數據到recyclerview列表

TeacherActivity

import android.annotation.TargetApi; 
import android.app.TimePickerDialog; 
import android.icu.util.Calendar; 
import android.os.Build; 
import android.os.Bundle; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.Snackbar; 
import android.support.design.widget.TextInputEditText; 
import android.support.design.widget.TextInputLayout; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.AppCompatButton; 
import android.support.v7.widget.AppCompatTextView; 
import android.support.v7.widget.DefaultItemAnimator; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.view.View; 
import android.widget.LinearLayout; 
import android.widget.TimePicker; 
import android.widget.Toast; 

import com.planet.noobs.testproject.Adapters.LecListAdapter; 
import com.planet.noobs.testproject.Data.DBHelper; 
import com.planet.noobs.testproject.Helpers.InputValidation; 
import com.planet.noobs.testproject.Model.Lectures; 
import com.planet.noobs.testproject.R; 

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

public class TeacherActivity extends AppCompatActivity implements View.OnClickListener { 

    LecListAdapter listAdapter; 
    private TextInputEditText editTextSubject; 
    private TextInputLayout textInputLayoutSubject; 
    private AppCompatButton buttonTimeSlot; 
    private AppCompatTextView textViewTime; 
    private AppCompatButton appCompatButtonSave; 
    private TimePickerDialog timePickerDialog; 
    private RecyclerView recyclerViewLec; 
    private FloatingActionButton fab; 
    private int mHour, mMinute; 
    private Lectures lectures; 
    private InputValidation inputValidation; 
    private DBHelper dbHelper; 
    private boolean gotTime = false; 
    private List<Lectures> lecturesList; 
    private LinearLayout addLecParent; 


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

     intiViews(); 
     initListeners(); 
     initObjects(); 
    } 

    private void intiViews() { 
     textViewTime = (AppCompatTextView) findViewById(R.id.timeView); 
     buttonTimeSlot = (AppCompatButton) findViewById(R.id.appCompatButtonTimeSlot); 
     textInputLayoutSubject = (TextInputLayout) findViewById(R.id.textInputLayoutSubject); 
     editTextSubject = (TextInputEditText) findViewById(R.id.appCompatEditTextSubject); 
     appCompatButtonSave = (AppCompatButton) findViewById(R.id.appCompatButtonSave); 
     recyclerViewLec = (RecyclerView) findViewById(R.id.listview_lectures); 
     fab = (FloatingActionButton) findViewById(R.id.lec_fab); 
     addLecParent = (LinearLayout) findViewById(R.id.parent_addlec); 
    } 

    private void initListeners() { 
     appCompatButtonSave.setOnClickListener(this); 
     buttonTimeSlot.setOnClickListener(this); 
     fab.setOnClickListener(this); 
    } 

    private void initObjects() { 

     inputValidation = new InputValidation(this); 
     lectures = new Lectures(); 

     lecturesList = new ArrayList<>(); 
     listAdapter = new LecListAdapter(lecturesList); 
     RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext()); 
     recyclerViewLec.setLayoutManager(mLayoutManager); 
     recyclerViewLec.setItemAnimator(new DefaultItemAnimator()); 
     recyclerViewLec.setHasFixedSize(true); 
     recyclerViewLec.setAdapter(listAdapter); 
     dbHelper = new DBHelper(getApplicationContext()); 
     refreshItems(); 
    } 

    private void refreshItems(){ 
     lecturesList.clear(); 
     lecturesList.addAll(dbHelper.getAllLec()); 
     listAdapter.notifyDataSetChanged(); 
    } 

    @Override 
    public void onClick(View v) { 
     switch (v.getId()) { 
      case R.id.appCompatButtonTimeSlot: 
       getTime(); 
       break; 
      case R.id.appCompatButtonSave: 
       postDataToDB(); 
       break; 
      case R.id.lec_fab: 
     } 
    } 

    @TargetApi(Build.VERSION_CODES.N) 
    public void getTime() { 
     // Get Current Time 

     final Calendar c; 
     c = Calendar.getInstance(); 
     mHour = c.get(Calendar.HOUR_OF_DAY); 
     mMinute = c.get(Calendar.MINUTE); 

     timePickerDialog = new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() { 
      @Override 
      public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 

       textViewTime.setText(new StringBuilder().append(hourOfDay) 
         .append(" : ") 
         .append(minute) 
         .append(getAMPM(hourOfDay))); 

       textViewTime.setText(textViewTime.getText().toString()); 
       gotTime = true; 
      } 
     }, mHour, mMinute, false); 
     timePickerDialog.show(); 
    } 

    private String getAMPM(int hourOfDay) { 
     String format; 
     if (hourOfDay == 0) { 
      hourOfDay += 12; 
      format = "AM"; 
     } else if (hourOfDay == 12) { 
      format = "PM"; 
     } else if (hourOfDay > 12) { 
      hourOfDay -= 12; 
      format = "PM"; 
     } else { 
      format = "AM"; 
     } 
     return format; 
    } 

    private void postDataToDB() { 
     if (!inputValidation.isInputEditTextSubject(editTextSubject, textInputLayoutSubject, "Enter the subject first.")) { 
      return; 
     } 
     if (!gotTime) { 
      Snackbar.make(recyclerViewLec, "Please select the time", Snackbar.LENGTH_LONG).show(); 
      return; 
     } 
     lectures.setLecTitle(editTextSubject.getText().toString().trim()); 
     lectures.setLecDateTime(textViewTime.getText().toString()); 

     dbHelper.addLec(lectures); 
     emptyEditText(); 
     Toast.makeText(this, "Lecture added", Toast.LENGTH_LONG).show(); 

    } 

    private void emptyEditText(){ 
     editTextSubject.setText(null); 
     textViewTime.setText(null); 
    } 

} 

LecListAdapter

import android.support.v7.widget.AppCompatTextView; 
import android.support.v7.widget.RecyclerView; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

import com.planet.noobs.testproject.Model.Lectures; 
import com.planet.noobs.testproject.R; 

import java.util.List; 


public class LecListAdapter extends RecyclerView.Adapter<LecListAdapter.LecViewHolder> { 

    private List<Lectures> mlec; 

    public LecListAdapter(List<Lectures> mlec) { 
     this.mlec = mlec; 
    } 


    @Override 
    public LecViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.teacher_lec_item, parent, false); 
     return new LecViewHolder(itemView); 
    } 

    @Override 
    public void onBindViewHolder(LecViewHolder holder, int position) { 
     holder.textViewLecTime.setText(mlec.get(position).toString()); 
     holder.textViewSub.setText(mlec.get(position).toString()); 
    } 

    @Override 
    public int getItemCount() { 
     Log.v(LecListAdapter.class.getSimpleName(), String.valueOf(mlec.size())); 
     return mlec.size(); 
    } 

    public class LecViewHolder extends RecyclerView.ViewHolder { 

     private AppCompatTextView textViewSub; 
     private AppCompatTextView textViewLecTime; 
     //private TextView emptyView; 
     public LecViewHolder(View itemView) { 
      super(itemView); 
      //emptyView = (TextView) itemView.findViewById(R.id.emptyView); 
      textViewSub = (AppCompatTextView) itemView.findViewById(R.id.lec_title); 
      textViewLecTime = (AppCompatTextView) itemView.findViewById(R.id.lec_time); 
     } 
    } 
} 

DbHelper.java

public class DBHelper extends SQLiteOpenHelper { 

    public static final String LOG_TAG = "SQL "; 
    //databse version 
    private static final int DATABASE_VERSION = 1; 
    //database name 
    private static final String DATABASE_NAME = "UserManager.db"; 
    //table name 
    private static final String TABLE_STUDENT = "student"; 

    //column's name 
    private static final String COLUMN_USER_ID = "user_id"; 
    private static final String COLUMN_USER_NAME = "user_name"; 
    private static final String COLUMN_CONTACT = "user_contact"; 
    private static final String COLUMN_USER_EMAIL = "user_email"; 
    private static final String COLUMN_USER_PASSWORD = "user_password"; 
    //create table query 
    private static final String CREATE_USER_TABLE = "CREATE TABLE " + TABLE_STUDENT + "(" + 
      COLUMN_USER_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
      COLUMN_USER_NAME + " TEXT, " + 
      COLUMN_CONTACT + " NUMBER, " + 
      COLUMN_USER_EMAIL + " TEXT, " + 
      COLUMN_USER_PASSWORD + " TEXT" + ")"; 

    //DROP TABLE IF EXISTS 
    private static final String DROP_USER_TABLE = "DROP TABLE IF EXISTS " + TABLE_STUDENT; 

    //Column's name for Books 

/* 
    private static final String TABLE_BOOKS = "books"; 

    private static final String COLUMN_BOOK_ID = "user_id"; 
    private static final String COLUMN_BOOK_TITLE = "book_title"; 
    private static final String COLUMN_BOOK_DESC = "book_desc"; 
    private static final String COLUMN_BOOK_ISSUE_DATE = "book_issue_date"; 

    private static final String CREATE_BOOK_TABLE = "CREATE TABLE "+ TABLE_BOOKS + "(" + 
      COLUMN_BOOK_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "+ COLUMN_BOOK_ID + 
      " Text, "+ COLUMN_BOOK_TITLE + " Text, " + COLUMN_BOOK_ISSUE_DATE + " Text, " + 
      COLUMN_BOOK_DESC + " Text" + ")"; 

    private static final String DROP_BOOKS_TABLE = "DROP TABLE IF EXISTS " + TABLE_BOOKS; 
*/ 

    // Columns name for lectures table 
    // Table name 
    private static final String TABLE_LECTURES = "lectures"; 

    private static final String COLUMN_LEC_ID = "lec_id"; 
    private static final String COLUMN_LEC_SUBJECT = "subject"; 
    private static final String COLUMN_TIME = "lec_time"; 

    private static final String CREATE_LECTURES_TABLE = "CREATE TABLE " + TABLE_LECTURES + "(" + 
      COLUMN_LEC_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
      COLUMN_LEC_SUBJECT + " TEXT, " + 
      COLUMN_TIME + " TEXT" + ")"; 

    private static final String DROP_LECTURES_TABLE = "DROP TABLE IF EXISTS " + TABLE_LECTURES; 

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


    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL(CREATE_USER_TABLE); 
     db.execSQL(CREATE_LECTURES_TABLE); 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // drop student table if exist 
/* 
     db.execSQL(DROP_USER_TABLE); 
     db.execSQL(DROP_LECTURES_TABLE); 
*/ 
     onCreate(db); 
    } 
    // Lectures helper methods 

    public void addLec(Lectures lectures) { 
     SQLiteDatabase db = this.getWritableDatabase(); 
     ContentValues values = new ContentValues(); 
     values.put(COLUMN_LEC_SUBJECT, lectures.getLecTitle()); 
     values.put(COLUMN_TIME, lectures.getLecDateTime()); 

     db.insert(TABLE_LECTURES, null, values); 
     Log.v(DBHelper.class.getSimpleName(),"addlec() is Working!"); 
     db.close(); 
    } 

    public List getAllLec() { 
     String[] COLUMNS = { 
       COLUMN_LEC_SUBJECT, 
       COLUMN_TIME 
     }; 

     List<Lectures> lecList = new ArrayList<Lectures>(); 
     String sortOrder = COLUMN_LEC_SUBJECT + " ASC"; 

     SQLiteDatabase db = this.getReadableDatabase(); 

     Cursor cursor = db.query(
       TABLE_LECTURES, 
       COLUMNS, 
       null, 
       null, 
       null, 
       null, 
       sortOrder); 

     if (cursor.moveToFirst()) { 
      do { 
       Lectures lec = new Lectures(); 
       lec.setLecTitle(cursor.getString(cursor.getColumnIndex(COLUMN_LEC_SUBJECT))); 
       lec.setLecDateTime(cursor.getString(cursor.getColumnIndex(COLUMN_TIME))); 
      } while (cursor.moveToNext()); 
     } 
     cursor.close(); 
     db.close(); 
     return lecList; 
    } 

    public List getAllUser() { 
     //columns to be fetched 
     String[] columns = { 
       COLUMN_USER_ID, 
       COLUMN_USER_EMAIL, 
       COLUMN_CONTACT, 
       COLUMN_USER_NAME, 
       COLUMN_USER_PASSWORD 
     }; 
     SQLiteDatabase db = this.getReadableDatabase(); 
     List<User> userList = new ArrayList<User>(); 

     String sortOrder = COLUMN_USER_NAME + " ASC"; 
     Cursor cursor = db.query(
       TABLE_STUDENT, 
       columns, 
       null, 
       null, 
       null, 
       null, 
       sortOrder 
     ); 

     if (cursor.moveToFirst()) { 
      do { 
       User user = new User(); 
       user.setId(Integer.parseInt(cursor.getString(cursor.getColumnIndex(COLUMN_USER_ID)))); 
       user.setName(cursor.getString(cursor.getColumnIndex(COLUMN_USER_NAME))); 
       user.setEmail(cursor.getString(cursor.getColumnIndex(COLUMN_USER_EMAIL))); 
       user.setContact(Long.parseLong(cursor.getString(cursor.getColumnIndex(COLUMN_CONTACT)))); 
       user.setPasswd(cursor.getString(cursor.getColumnIndex(COLUMN_USER_PASSWORD))); 
       userList.add(user); 
      } while (cursor.moveToNext()); 
     } 
     cursor.close(); 
     db.close(); 
     return userList; 
    } 


    // user helpers 
    public void addUser(User user) { 
     //open database with write permission 
     SQLiteDatabase db = this.getWritableDatabase(); 

     ContentValues values = new ContentValues(); 
     values.put(COLUMN_USER_NAME, user.getName()); 
     values.put(COLUMN_USER_EMAIL, user.getEmail()); 
     values.put(COLUMN_USER_PASSWORD, user.getPasswd()); 
     values.put(COLUMN_CONTACT, user.getContact()); 

     db.insert(TABLE_STUDENT, null, values); 
     db.close(); 
    } 

    /** 
    * This method is to delete user record 
    * 
    * @param user 
    */ 
    public void deleteUser(User user) { 
     SQLiteDatabase db = this.getWritableDatabase(); 
     // delete user record by id 
     db.delete(TABLE_STUDENT, COLUMN_USER_ID + " = ?", 
       new String[]{String.valueOf(user.getId())}); 
     db.close(); 
    } 

    public boolean checkUser(String email) { 
     //columns to be fetched 
     String[] columns = { 
       COLUMN_USER_ID 
     }; 

     SQLiteDatabase db = this.getReadableDatabase(); 
     //selection criteria in where clause 
     String selection = COLUMN_USER_EMAIL + " = ?"; 
     //selection arguments 
     String[] selection_arg = { 
       email 
     }; 

     Cursor cursor = db.query(
       TABLE_STUDENT, // table name 
       columns,  // columns to return 
       selection,  // Where clause selection 
       selection_arg, //Where clause selection value 
       null, 
       null, 
       null 
     ); 

     int count = cursor.getCount(); 
     cursor.close(); 
     db.close(); 

     return count > 0; 

    } 

    public boolean checkUser(String email, String passwd) { 
     //columns to be fetched 
     String[] columns = { 
       COLUMN_USER_ID 
     }; 

     SQLiteDatabase db = this.getReadableDatabase(); 
     //selection criteria in where clause 
     String selection = COLUMN_USER_EMAIL + " = ?" + " AND " + COLUMN_USER_PASSWORD + " = ?"; 
     //selection arguments 
     String[] selection_arg = { 
       email, 
       passwd 
     }; 

     Cursor cursor = db.query(
       TABLE_STUDENT, // table name 
       columns,  // columns to return 
       selection,  // Where clause selection 
       selection_arg, //Where clause selection value 
       null, 
       null, 
       null 
     ); 

     int count = cursor.getCount(); 
     cursor.close(); 
     db.close(); 

     return count > 0; 

    } 
} 

activity_teacher.xml

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <LinearLayout 
     android:id="@+id/parent_addlec" 
     android:layout_width="match_parent" 
     android:layout_height="120dp" 
     android:orientation="vertical" 
     android:padding="10dp" 

     > 

     <android.support.design.widget.TextInputLayout 
      android:id="@+id/textInputLayoutSubject" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"> 

      <android.support.design.widget.TextInputEditText 
       android:id="@+id/appCompatEditTextSubject" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:hint="Add Lectures" 
       android:inputType="text" 
       android:maxLength="15" 
       android:maxLines="1" 
       android:singleLine="true" /> 

     </android.support.design.widget.TextInputLayout> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:orientation="horizontal"> 

      <android.support.v7.widget.AppCompatTextView 
       android:id="@+id/timeView" 
       android:layout_width="0dp" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center_vertical" 
       android:layout_marginLeft="4dp" 
       android:layout_marginStart="4dp" 
       android:layout_weight="1" 
       android:textSize="20sp" /> 

      <android.support.v7.widget.AppCompatButton 
       android:id="@+id/appCompatButtonTimeSlot" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="Time Slot" /> 

      <android.support.v7.widget.AppCompatButton 
       android:id="@+id/appCompatButtonSave" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="Save" /> 

     </LinearLayout> 
    </LinearLayout> 

    <View 
     android:layout_width="match_parent" 
     android:layout_height="2dp" 
     android:background="#ccc" /> 

    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="40dp" 
     android:gravity="center_vertical" 
     android:text="Lectures Today" 
     android:textAlignment="center" 
     android:textSize="25sp" 
     android:textStyle="bold" /> 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <android.support.v7.widget.RecyclerView 
      android:id="@+id/listview_lectures" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 

     <android.support.design.widget.FloatingActionButton 
      android:id="@+id/lec_fab" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignBottom="@id/listview_lectures" 
      android:layout_alignParentEnd="true" 
      android:layout_alignParentRight="true" 
      android:layout_margin="@dimen/fab_margin" 
      android:src="@drawable/ic_plus" /> 

    </RelativeLayout> 
</LinearLayout> 
+0

檢查在調試模式下,你是否正從recyclerview的分貝與否,並在onBindViewHolder()的數據檢查數據通過與否。如果沒有數據,則不顯示任何東西 –

+0

所有不必要的佈局嵌套對性能都是不利的。 –

+0

謝謝主席先生,我調試了代碼,發現所有的數據流都能正常工作,但實際的問題出現在了DbHelper類函數getAllLec()中,因爲該函數沒有向列表添加任何項目,所以我添加了這個lecList 。新增(LEC); – rio257

回答

0

你傳入空的列表到您的適配器首先填補LIST再使用setAdapter方法。

lecturesList = new ArrayList<>(); 

RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext()); 
recyclerViewLec.setLayoutManager(mLayoutManager); 
recyclerViewLec.setItemAnimator(new DefaultItemAnimator()); 
recyclerViewLec.setHasFixedSize(true); 
dbHelper = new DBHelper(getApplicationContext()); 
refreshItems(); 

//setAdapter in last after put data into list. 
listAdapter = new LecListAdapter(lecturesList); 
recyclerViewLec.setAdapter(listAdapter); 
+0

你是對的,但列表是空的,但問題出在Dbhelper.java getAllLec(),所以我之前添加了lecList.add(lec); rio257