2017-01-12 20 views
1

Я разрабатываю приложение для сведения о листинге в базе данных. Список не работает. но он отображается в журнале как прекрасный. Почему мой recyclerview listling не работает. когда я использую bean1 = new Bean (cn.getName(), cn.getNumber(), cn.getSpeeddial()), он показывает ошибку.Android recyleview с использованием базы данных не работает

Мои коды показаны ниже.

SpeedDialViewActivity.java

public class SpeedDialViewActivity extends AppCompatActivity { 

    private List<Bean> beanList = new ArrayList<>(); 
    private RecyclerView recyclerView; 
    private ViewAdapter mAdapter; 
    Context context; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_speed_dial_view); 
     recyclerView = (RecyclerView) findViewById(R.id.recycler_view); 

     mAdapter = new ViewAdapter(beanList); 
     RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext()); 
     recyclerView.setLayoutManager(mLayoutManager); 
     recyclerView.setItemAnimator(new DefaultItemAnimator()); 
     recyclerView.setAdapter(mAdapter); 

     prepareData(); 


    } 

    private void prepareData() { 

     DatabaseHandler handler = new DatabaseHandler(getApplicationContext()); 
     Log.d("Reading: ", "Reading all contacts.."); 
     List<Bean> beanList = handler.getAllContacts(); 
     //Cursor cursor = (Cursor) handler.getAllContacts(); 

     //Bean bean1; 

     for (Bean cn : beanList) { 
      String log = "Id: " + cn.getId() + " ,Name: " + cn.getName() + " ,Phone: " + cn.getNumber(); 
      // Writing Contacts to log 
      Log.d("Name: ", log); 



      // bean1 = new Bean(cn.getName(), cn.getNumber(), cn.getSpeeddial()); // Error occurring 
      // beanList.add(bean1); 
      } 

    } 
    } 

    DatabaseHandler.java 

    public class DatabaseHandler extends SQLiteOpenHelper { 

    private static final int DATABASE_VERSION = 1; 
    private static final String DATABASE_NAME = "speeddial"; 
    private static final String TABLE_CONTACTS = "contacts"; 
    private static final String KEY_ID = "id"; 
    private static final String KEY_NAME = "name"; 
    private static final String KEY_PH_NO = "phone_number"; 
    private static final String KEY_SPEED_DIAL = "speed_dial_number"; 

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

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "(" 
       + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT," 
       + KEY_PH_NO + " TEXT" + KEY_SPEED_DIAL + " TEXT" + ")"; 
     db.execSQL(CREATE_CONTACTS_TABLE); 
    } 

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

     // Create tables again 
     onCreate(db); 
    } 

    void addContact(Bean bean) { 
     SQLiteDatabase db = this.getWritableDatabase(); 

     ContentValues values = new ContentValues(); 
     values.put(KEY_NAME, bean.getName()); // Contact Name 
     values.put(KEY_PH_NO, bean.getNumber()); // Contact Phone 
     values.put(KEY_PH_NO, bean.getSpeeddial()); // Contact Phone 

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

    Bean getBean(int id) { 
     SQLiteDatabase db = this.getReadableDatabase(); 

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

     Bean bean = new Bean(Integer.parseInt(cursor.getString(0)),cursor.getString(1), cursor.getString(2), cursor.getString(3)); 
     // return contact 
     return bean; 
    } 

    public List<Bean> getAllContacts() { 
     List<Bean> contactList = new ArrayList<Bean>(); 
     // Select All Query 
     String selectQuery = "SELECT * FROM " + TABLE_CONTACTS; 

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

     // looping through all rows and adding to list 
     if (cursor.moveToFirst()) { 
      do { 
       Bean contact = new Bean(); 
       contact.setId(Integer.parseInt(cursor.getString(0))); 
       contact.setName(cursor.getString(1)); 
       contact.setNumber(cursor.getString(2)); 
       // Adding contact to list 
       contactList.add(contact); 
      } while (cursor.moveToNext()); 
     } 

     // return contact list 
     return contactList; 
    } 
    } 

ViewAdapter.java

public class ViewAdapter extends RecyclerView.Adapter<ViewAdapter.MyViewHolder> { 

private List<Bean> beanList; 

public class MyViewHolder extends RecyclerView.ViewHolder { 
    public TextView name, number, speeddial_number; 

    public MyViewHolder(View view) { 
     super(view); 
     name = (TextView) view.findViewById(R.id.name); 
     number = (TextView) view.findViewById(R.id.number); 
     speeddial_number = (TextView) view.findViewById(R.id.speeddialNumber); 
    } 
} 

public ViewAdapter(List<Bean> beanList){ 
    this.beanList = beanList; 
} 

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

@Override 
public void onBindViewHolder(ViewAdapter.MyViewHolder holder, int position) { 
    Bean bean = beanList.get(position); 
    holder.name.setText(bean.getName()); 
    holder.number.setText(bean.getNumber()); 
    holder.speeddial_number.setText(bean.getSpeeddial()); 
} 

@Override 
public int getItemCount() { 
    return beanList.size(); 
} 
} 

Bean.java

public class Bean{ 
private int id; 
private String name; 
private String number; 
private String speeddial; 


public Bean(int id, String name, String number, String speeddial) { 
    this.id=id; 
    this.name=name; 
    this.number=number; 
    this.speeddial=speeddial; 
} 

public Bean(String name, String number, String speeddial) { 
    this.name=name; 
    this.number=number; 
    this.speeddial=speeddial; 
} 

public Bean() { 

} 


public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public String getNumber() { 
    return number; 
} 

public void setNumber(String number) { 
    this.number = number; 
} 

public String getSpeeddial() { 
    return speeddial; 
} 

public void setSpeeddial(String speeddial) { 
    this.speeddial = speeddial; 
} 
} 

Ошибка java.lang.RuntimeException: Невозможно начать деятельность ComponentInfo {com.app.appname/com.app.appname}: java .util.ConcurrentModificationException

Пожалуйста, помогите мне

+1

Сообщите свое мнение об ошибке. –

+0

java.lang.RuntimeException: Не удалось запустить активность ComponentInfo {com.app.appname/com.app.appname}: java.util.ConcurrentModificationException –

ответ

1

Вы не добавляете контакты вы выборку в списке, а не делать уведомит набор данных изменилось. Измените метод OnPrepare() следующим образом

private void prepareData() { 

    DatabaseHandler handler = new DatabaseHandler(getApplicationContext()); 
    Log.d("Reading: ", "Reading all contacts.."); 
    List<Bean> beanList = handler.getAllContacts(); 
    this.beanList.addAll(beanList); 
    mAdapter.notifyDatasetChanged(); 

} 
+0

Показывает, что не удается разрешить 'notifyDatasetChanged' –

+0

использовать этот файл mAdapter.notifyDataSetChanged(); –

0

пройти один и тот же список в prepareData(beanList) и добавлять элементы в этом списке. И измените свой метод на что-то вроде prepareData(List<Bean> beanList>). после успешного добавления, просто вызовите метод mAdapter.notifyDataSetChanged(), чтобы ваш адаптер мог знать, что некоторые элементы были добавлены в список.

+0

Это показывает, что не удается разрешить 'notifyDatasetChanged'. –

+0

mAdapter.notifyDataSetChanged(); –

+0

см. Отредактированный ответ. –

0

Вы не указали андроид: имя в теге приложения в файле манифеста. Таким образом, вы просто объект контекста использования или использования SpeedDialViewActivity.this

DatabaseHandler Обработчик = новый DatabaseHandler (mContext);

      or 

обработчик DatabaseHandler = новый DatabaseHandler (SpeedDialViewActivity.this);

private void prepareData() { 

    DatabaseHandler handler = new DatabaseHandler(SpeedDialViewActivity.this); 
    Log.d("Reading: ", "Reading all contacts.."); 
    List<Bean> beanList = handler.getAllContacts(); 
    //Cursor cursor = (Cursor) handler.getAllContacts(); 

    //Bean bean1; 

    for (Bean cn : beanList) { 
     String log = "Id: " + cn.getId() + " ,Name: " + cn.getName() + " ,Phone: " + cn.getNumber(); 
     // Writing Contacts to log 
     Log.d("Name: ", log); 



     // bean1 = new Bean(cn.getName(), cn.getNumber(), cn.getSpeeddial()); // Error occurring 
     // beanList.add(bean1); 
     } 

} 

 Смежные вопросы

  • Нет связанных вопросов^_^