2016-03-06 50 views
0

我已經實現了recyclerView和SQLite數據庫來保存/檢索recylerview的數據,但我在recyclerView上獲取的數據不是應該顯示的數據。 recyclerView的工作原理應該沒有SQLite數據庫。recyclerView不會顯示我的列表項的'真實'數據

enter image description here

當加號被點擊,出現一個對話框與editext領域,用戶可以在其中輸入信息彈出:

這裏是DialogFragment類,其中用戶應當寫出他們的信息:

public class DialogAdd extends DialogFragment { 

private Button okButton; 
private EditText name, quantity, location, normalPrice, offerPrice; 
private List<ShopListItem> shopListItem; 
private Context context; 
DatabaseHelper dbHelper; 


@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    dbHelper = new DatabaseHelper(getContext()); 

    shopListItem = new ArrayList<>(); 
    context = getActivity(); 
} 


@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    final View rootView = inflater.inflate(R.layout.add_productdialog,container, false); 
    getDialog().setCanceledOnTouchOutside(false); 
    getDialog().setTitle("Add to shoplist"); 




    name = (EditText) rootView.findViewById(R.id.dialog_productname); 
    quantity = (EditText) rootView.findViewById(R.id.dialog_qantity); 
    location = (EditText) rootView.findViewById(R.id.dialog_location); 
    normalPrice = (EditText) rootView.findViewById(R.id.dialog_normalPrice); 
    offerPrice = (EditText) rootView.findViewById(R.id.dialog_offerPrice); 

    okButton = (Button) rootView.findViewById(R.id.dialog_okButton); 
    okButton.getBackground().setColorFilter(Color.parseColor("#2fbd4b"), PorterDuff.Mode.MULTIPLY); 
    okButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 


      if (name.getText().toString().isEmpty()) { 
       Toast.makeText(context, "You must add a name", Toast.LENGTH_LONG).show(); 
      } else { 

       dbHelper.insertData(name.toString() ,quantity.toString(),location.toString(),normalPrice.toString(),offerPrice.toString()); 
       getDialog().dismiss(); 
      } 


     } 
    }); 

    return rootView; 

} 

這是我創作的recylerview,適配器和數據庫mainActivity類別:

public class MainActivity extends AppCompatActivity{ 


private ImageButton addbutton; 
private DialogAdd dialogAdd; 
public static RecyclerView recyclerView; 
private List<ShopListItem> shopListItems; 
private SQLiteDatabase db; 
private Cursor cursor; 
private DatabaseHelper databaseHelper; 
private ShoplistAdapter adapter; 



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


    databaseHelper = new DatabaseHelper(this); 

    addbutton = (ImageButton) findViewById(R.id.addbtn); 
    addbutton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      dialogAdd = new DialogAdd(); 
      dialogAdd.show(getSupportFragmentManager(), "addDialog"); 
     } 
    }); 



    //RecyclerView 
    recyclerView = (RecyclerView)findViewById(R.id.rv_shoppinglist); 
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(App.getAppContex()); 
    linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); 
    recyclerView.setLayoutManager(linearLayoutManager); 



    initializeData(); 
    adapter = new ShoplistAdapter(shopListItems); 
    recyclerView.setAdapter(adapter); 


} 


private void initializeData(){ 

    shopListItems = new ArrayList<>(); 
    Cursor resultset = databaseHelper.getAllData(); 

    if (resultset.moveToFirst()){ 
     while(!resultset.isAfterLast()){ 

      shopListItems.add(new ShopListItem(resultset.getString(1), resultset.getString(2), resultset.getString(3), resultset.getString(4), resultset.getString(5))); 

      resultset.moveToNext(); 
     } 
    } 
    resultset.close(); 


    shopListItems.add(new ShopListItem("Potato", "2 KG", "MALL", "7 kr", "")); 
} 

此類數據庫所在的定義:

public class DatabaseHelper extends SQLiteOpenHelper { 

public static final String DATABASE_NAME ="dbshoplist.db"; 
public static final String TABLE_NAME ="product_table"; 

public static final String COL_ID = "ID"; 
public static final String COL_NAME ="NAME"; 
public static final String COL_QTY ="QUANTITY"; 
public static final String COL_LOCATION ="LOCATION"; 
public static final String COL_PRICE1 ="PRICE1"; 
public static final String COL_PRICE2 ="PRICE2"; 


/* 
This constructor creates the database 
*/ 
public DatabaseHelper(Context context) { 
    super(context, DATABASE_NAME, null, 1); 
    SQLiteDatabase db = this.getWritableDatabase(); 
} 


@Override 
public void onCreate(SQLiteDatabase db) { 

    db.execSQL("CREATE TABLE " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT,NAME TEXT,QUANTITY TEXT,LOCATION TEXT,PRICE1 TEXT,PRICE2 TEXT)"); 


} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

    db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); 
    onCreate(db); 
} 


public boolean insertData(String name, String qty, String location, String price1, String price2){ 


    SQLiteDatabase db = this.getWritableDatabase(); 

    // content value is a row, and we fill it with the put(); 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put(COL_NAME, name); 
    contentValues.put(COL_QTY, qty); 
    contentValues.put(COL_LOCATION, location); 
    contentValues.put(COL_PRICE1, price1); 
    contentValues.put(COL_PRICE2, price2); 


    long result = db.insert(TABLE_NAME, null,contentValues); 

    if(result == -1) { 
     return false; 
    }else{ 
     return true; 
     } 
    } 


public Cursor getAllData(){ 

    SQLiteDatabase db = this.getWritableDatabase(); 
    Cursor cursorResults = db.rawQuery("SELECT * FROM " + TABLE_NAME, null); 
    return cursorResults; 

} 

我recyclerView適配器類:

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

List<ShopListItem> shopListItems; 
public ShoplistAdapter(List<ShopListItem> shopListItems) { 
    this.shopListItems = shopListItems; 
} 


@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

    Context context = parent.getContext(); 
    LayoutInflater inflater = LayoutInflater.from(context); 
    View shoplist_itemView = inflater.inflate(R.layout.shop_list_item, parent, false); 
    ViewHolder viewHolder = new ViewHolder(shoplist_itemView); 

    return viewHolder; 
} 

@Override 
public void onBindViewHolder(final ViewHolder holder, final int position) { 


    holder.location.setText(shopListItems.get(position).location.toString()); 
    holder.normalPrice.setText(shopListItems.get(position).normalprice.toString()); 
    holder.offerPrice.setText(shopListItems.get(position).offerprice.toString()); 

    StringBuilder stringBuilder = new StringBuilder(); 
    stringBuilder.append(shopListItems.get(position).quantity + " " + shopListItems.get(position).name); 
    holder.productname.setText(stringBuilder); 

    if(!shopListItems.get(position).offerprice.toString().isEmpty()){ 
     holder.normalPrice.setPaintFlags(holder.normalPrice.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); 

    } 

    if(shopListItems.get(position).normalprice.isEmpty()){ 
     holder.normalPrice.setVisibility(View.GONE); 
    } 


    holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 

      if(isChecked == true){ 
       holder.productname.setPaintFlags(holder.productname.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); 
       holder.productname.setTextColor(Color.parseColor("#40000000")); 
      }else{ 
       holder.productname.setPaintFlags(0 | Paint.ANTI_ALIAS_FLAG); 
       holder.productname.setTextColor(Color.BLACK); 
      } 
     } 
    }); 
} 

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


public static class ViewHolder extends RecyclerView.ViewHolder{ 


    private CheckBox checkBox; 
    private TextView productname, quantity, location, normalPrice, offerPrice; 
    private ImageButton edit_icon, delete_icon; 

    public ViewHolder(View itemView) { 
     super(itemView); 

     productname = (TextView)itemView.findViewById(R.id.product_name); 
     location = (TextView)itemView.findViewById(R.id.product_location); 
     normalPrice = (TextView)itemView.findViewById(R.id.product_price); 
     offerPrice = (TextView)itemView.findViewById(R.id.product_offer_price); 
     edit_icon = (ImageButton)itemView.findViewById(R.id.editShopItem_Icon); 
     delete_icon = (ImageButton)itemView.findViewById(R.id.shopitem_delete_icon); 
     checkBox = (CheckBox) itemView.findViewById(R.id.bought_checkbox); 

    } 
} 

@Override 
public void onAttachedToRecyclerView(RecyclerView recyclerView) { 
    super.onAttachedToRecyclerView(recyclerView); 
} 
+0

你可以分享適配器的代碼嗎? –

+0

@howdoidothis是的先生!只是做了 – Muddz

+0

哦,你去了,這是因爲在onBindViewHolder下,你調用'toString()'來獲取文本。默認的'toString()'只是返回那個對象的表示,這不是你想要的 –

回答

1

發生這種情況,因爲我們在調用toString() ShopListItem對象的字段方法:shopListItems.get(position).location.toString()

而是爲ShopListItem類的字段創建getter方法,例如,

public getLocation() { 
    return location; 
} 

只需調用這些來獲取數據。

+0

哦,謝謝你!有效!!! 我有一個與recyclerView小問題。也許我可以發佈一個新問題(這樣你可以得到積分),你可以回答它?它關於讓它立即顯示添加的數據。現在我必須重新申請應用程序以顯示新的數據 – Muddz

+0

你有沒有試過在適配器上調用'notifyDataSetChaned()'? –

+0

是的!我爲她的這個問題提出了一個新的問題。看看: http://stackoverflow.com/questions/35850715/recyclerview-dont-show-inserted-sqlite-data-instantly – Muddz

相關問題