2017-01-18 6 views
0

GIF OF ACTIVITY< --------RecyclerViewは、SQLiteのデータを表示しない

私はいくつかの方法、それ部分的に単にRecyclerViewアダプタ、から私のSQLiteのデータが表示されてやろうとしていますは動作しますが、具体的には動作しません。 ご意見がありましたら、お気軽にお気軽にどうぞ!

HERESに関連するコード:

MachineCreation.java

public class MachineCreation extends AppCompatActivity { 

private EditText etName, etLocation; 
private Button mButton; 
private DBHelpter mDBHelpter; 

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

    mDBHelpter = new DBHelpter(this); 
    etName = (EditText) findViewById(R.id.etName); 
    etLocation = (EditText) findViewById(R.id.etLocation); 
    mButton = (Button) findViewById(R.id.button); 


    mButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      String name = String.valueOf(etName.getText()); 
      String location = String.valueOf(etLocation.getText()); 
      mDBHelpter.insertNewMachine(name, location); 

      Intent intent = new Intent(MachineCreation.this, MainActivity.class); 
      startActivity(intent); 
     } 
    }); 
} 

machines_list.xml

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

<TextView 
    android:text="CALDAS" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_weight="1" 
    android:id="@+id/tvLocation" 
    android:layout_centerVertical="true" 
    android:textSize="36sp" 
    android:paddingTop="10dp" 
    android:paddingBottom="10dp" 
    android:paddingLeft="5dp"/> 

<TextView 
    android:text="$ 0.0" 
    android:textSize="36sp" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerVertical="true" 
    android:id="@+id/tvMoney" 
    android:paddingRight="5dp" 
    android:paddingBottom="10dp" 
    android:paddingTop="10dp"/> 

MainActivity

public class MainActivity extends AppCompatActivity { 

private DBHelpter mDBHelpter; 
private RecyclerView mRecyclerView; 
private ArrayList<MachinesClass> mList; 

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

    mDBHelpter = new DBHelpter(this); 

    mRecyclerView = (RecyclerView) findViewById(R.id.rvNew); 
    mRecyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext())); 
    mRecyclerView.setItemAnimator(new DefaultItemAnimator()); 
    mRecyclerView.setHasFixedSize(true); 
    mRecyclerView.setAdapter(new MachinesAdapter(getApplicationContext(), mList)); 

} 

activity_main.xml

<RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/activity_main" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context="tech.destinum.machines.MainActivity" 
android:layout_marginTop="@dimen/activity_vertical_margin" 
android:layout_marginBottom="@dimen/activity_vertical_margin" 
android:layout_marginLeft="@dimen/activity_horizontal_margin" 
android:layout_marginRight="@dimen/activity_horizontal_margin"> 

<android.support.design.widget.CoordinatorLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.design.widget.FloatingActionButton 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:clickable="true" 
     app:fabSize="mini" 
     app:srcCompat="@mipmap/ic_add_black_24dp" 
     android:id="@+id/floatingActionButton" 
     android:layout_gravity="bottom|right"/> 

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

DBHelper

public class DBHelpter extends SQLiteOpenHelper { 

private static final String DB_NAME = "machines.db"; 
private static final int DB_VERSION = 1; 

public static final String TABLE_MACHINES = "machines"; 
public static final String MACHINES_COLUMN_NAME = "name"; 
public static final String MACHINES_COLUMN_LOCATION = "location"; 
public static final String MACHINES_ID = "id"; 

public static final String TABLE_INCOME = "income"; 
public static final String INCOME_COLUMN_MONEY = "money"; 
public static final String INCOME_COLUMN_DATE = "date"; 
public static final String INCOME_COLUMN_NOTE = "note"; 
public static final String INCOME_ID = "id"; 

public DBHelpter(Context context) { 
    super(context, DB_NAME, null, DB_VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    String query1 = String.format("CREATE TABLE " + TABLE_MACHINES + "(" 
     + MACHINES_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " 
     + MACHINES_COLUMN_NAME + " TEXT NOT NULL, " 
     + MACHINES_COLUMN_LOCATION + " TEXT NOT NULL)", 
      TABLE_MACHINES, MACHINES_COLUMN_NAME, MACHINES_COLUMN_LOCATION, MACHINES_ID); 

    String query2 = String.format("CREATE TABLE " + TABLE_INCOME + "(" 
     + INCOME_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " 
     + INCOME_COLUMN_MONEY + " REAL NOT NULL, " 
     + INCOME_COLUMN_DATE + " DATE NOT NULL, " 
     + INCOME_COLUMN_NOTE + " TEXT NOT NULL)", 
      TABLE_INCOME, INCOME_ID, INCOME_COLUMN_MONEY, INCOME_COLUMN_DATE, INCOME_COLUMN_NOTE); 
    db.execSQL(query1); 
    db.execSQL(query2); 

} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    String query1 = String.format("DROP TABLE IF EXISTS " + TABLE_MACHINES); 
    String query2 = String.format("DROP TABLE IF EXISTS " + TABLE_INCOME); 
    db.execSQL(query1); 
    db.execSQL(query2); 
    onCreate(db); 

} 

public void insertNewMachine(String name, String location){ 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues values = new ContentValues(); 
    values.put(MACHINES_COLUMN_NAME, name); 
    values.put(MACHINES_COLUMN_LOCATION, location); 
    db.insertWithOnConflict(TABLE_MACHINES, null, values, SQLiteDatabase.CONFLICT_REPLACE); 
    db.close(); 
} 

public void updateMachine(long id, String name, String location){ 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues values = new ContentValues(); 
    values.put(MACHINES_COLUMN_NAME, name); 
    values.put(MACHINES_COLUMN_LOCATION, location); 
    db.update(TABLE_MACHINES, values, "id = ?", new String[]{Long.toString(id)}); 
    db.close(); 
} 

public void deleteMachine(long id){ 
    SQLiteDatabase db = this.getWritableDatabase(); 
    db.delete(TABLE_MACHINES, "id = ?", new String[]{id + ""}); 
    db.close(); 
} 

public ArrayList<MachinesClass> getAllMachines(){ 
    ArrayList<MachinesClass> machinesList = new ArrayList<>(); 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor cursor = db.rawQuery("SELECT * FROM "+ TABLE_MACHINES, null); 
    while (cursor.moveToNext()){ 
     final long id = cursor.getLong(cursor.getColumnIndex(MACHINES_ID)); 
     final String name = cursor.getString(cursor.getColumnIndex(MACHINES_COLUMN_NAME)); 
     final String location = cursor.getString(cursor.getColumnIndex(MACHINES_COLUMN_LOCATION)); 
     machinesList.add(new MachinesClass(id, name, location)); 
    } 
    cursor.close(); 
    db.close(); 
    return machinesList; 
} 

}

MachinesClass.java

public class MachinesClass { 
public long id; 
public String name, location; 

public MachinesClass(long id, String name, String location) { 
    this.id = id; 
    this.name = name; 
    this.location = location; 
} 

}

MachinesAdapter.java

public class MachinesAdapter extends RecyclerView.Adapter<MachinesAdapter.ViewHolder> { 

private ArrayList<MachinesClass> machinesList = new ArrayList<MachinesClass>(); 
private LayoutInflater mInflater; 

public MachinesAdapter(Context context, ArrayList<MachinesClass> machinesList){ 
    this.mInflater = LayoutInflater.from(context); 
    this.machinesList = machinesList; 
} 

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

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 
    MachinesClass item = machinesList.get(position); 
    holder.mLocation.setText(item.location); 
    notifyDataSetChanged(); 
} 

@Override 
public int getItemCount() { 
    return machinesList != null ? machinesList.size() : 0; 
} 

public static class ViewHolder extends RecyclerView.ViewHolder{ 

    public TextView mLocation, mMoney; 

    public ViewHolder(View itemView) { 
     super(itemView); 
     mLocation = (TextView) itemView.findViewById(R.id.tvLocation); 
     mMoney = (TextView) itemView.findViewById(R.id.tvMoney); 
    } 
} 

}


私は私のMainActivity.javaに行を変更する場合:

  • mRecyclerView.setAdapter(new MachinesAdapter(getApplicationContext(), mList = mDBHelpter.getAllMachines()));

  • mRecyclerView.setAdapter(new MachinesAdapter(getApplicationContext(), mList));

を私は次のエラーを取得します。

私はすべてのマシンを得るためにDBHelperへの呼び出しを行う必要があり知っているが、私はそれを正しくを行う方法がわかりません。 onBindViewHolderで

ERROR

FATAL EXCEPTION: main 
       Process: tech.destinum.machines, PID: 3604 
       java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 
        at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) 
        at java.util.ArrayList.get(ArrayList.java:308) 
        at tech.destinum.machines.MachinesAdapter.onBindViewHolder(MachinesAdapter.java:33) 
        at tech.destinum.machines.MachinesAdapter.onBindViewHolder(MachinesAdapter.java:14) 
        at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6279) 
        at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6312) 
        at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5258) 
        at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5521) 
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5363) 
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5359) 
        at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2141) 
        at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1525) 
        at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1488) 
        at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:585) 
        at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3506) 
        at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3254) 
        at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3767) 
        at android.view.View.layout(View.java:16630) 
        at android.view.ViewGroup.layout(ViewGroup.java:5437) 
        at android.support.design.widget.CoordinatorLayout.layoutChild(CoordinatorLayout.java:1167) 
        at android.support.design.widget.CoordinatorLayout.onLayoutChild(CoordinatorLayout.java:852) 
        at android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:871) 
        at android.view.View.layout(View.java:16630) 
        at android.view.ViewGroup.layout(ViewGroup.java:5437) 
        at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1079) 
        at android.view.View.layout(View.java:16630) 
        at android.view.ViewGroup.layout(ViewGroup.java:5437) 
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336) 
        at android.widget.FrameLayout.onLayout(FrameLayout.java:273) 
        at android.view.View.layout(View.java:16630) 
        at android.view.ViewGroup.layout(ViewGroup.java:5437) 
        at android.support.v7.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:437) 
        at android.view.View.layout(View.java:16630) 
        at android.view.ViewGroup.layout(ViewGroup.java:5437) 
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336) 
        at android.widget.FrameLayout.onLayout(FrameLayout.java:273) 
        at android.view.View.layout(View.java:16630) 
        at android.view.ViewGroup.layout(ViewGroup.java:5437) 
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743) 
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586) 
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1495) 
        at android.view.View.layout(View.java:16630) 
        at android.view.ViewGroup.layout(ViewGroup.java:5437) 
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336) 
        at android.widget.FrameLayout.onLayout(FrameLayout.java:273) 
        at com.android.internal.policy.PhoneWindow$DecorView.onLayout(PhoneWindow.java:2678) 
        at android.view.View.layout(View.java:16630) 
        at android.view.ViewGroup.layout(ViewGroup.java:5437) 
        at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2171) 
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1931) 
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107) 
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013) 
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) 
        at android.view.Choreographer.doCallbacks(Choreographer.java:670) 
        at android.view.Choreographer.doFrame(Choreographer.java:606) 
       at android. 
+0

'機械リスト。クリア();' - なぜあなたはあなたのリストを 'onBindViewHolder()'でクリアしていますか? –

+0

** **コードが更新され、machinesList.clear()が削除されました。まだGIFとして働いています。 – Ispam

答えて

0

だからしばらくは私がSOLUTIONを見つけ掘り起こした後、私は2行を削除し、 onBindViewHolder方法を変更しなければなりませんでした。 machinesList.clearおよびnotifyDataSetChanged()

入力いただきありがとうございました!

0

あなたはmachinesList.clear()を使用してmachinesListをクリアしています。それを再利用するのは間違いだと思います。

+0

** **コードが更新され、machinesList.clear()が削除されました。まだGIFとして働いています。 – Ispam

+0

@Ispamこの質問に回答としてマークして、未回答の質問を検索しながらこの質問をスキップできます。 –

+0

あなたは自分の答えを受け入れる前に** 24時間**を待たなければなりません。 – Ispam

関連する問題