2017-01-12 11 views
1

私はデータベースにリストの詳細のためのアプリを開発しています。リスティングは機能していません。それはログとして大丈夫と表示されています。なぜ私のrecyclerlerview listlingが機能していないのですか? bean1 = new Bean(cn.getName()、cn.getNumber()、cn.getSpeeddial())を使用しているときにエラーが表示されます。Android recyleview listing with database does not working with

マイコードを以下に示します。

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

を助けてください。

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)で同じリストを渡すと、このリストの項目を追加し、次のようにあなたのonPrepare()メソッドを変更します。正常に追加したら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); 
     } 

}