0

저는 새로운 Android입니다. 응용 프로그램을 만들었으며 phpmyadmin에있는 테이블에서 json 데이터를 가져 와서 응용 프로그램의 데이터베이스에 저장합니다. 그리고 데이터를 읽고 RecyclerView에 표시하지만 처음으로 앱을 실행하면 테이블 데이터베이스에 아무것도 표시되지 않습니다. 하지만 두 번째로 앱은 원하는대로 데이터를 읽고 표시 할 수 있습니다.웹에서 JSON 데이터를 가져 와서 RecyclerView를 사용하여 표시

누구나 두 번째로 앱을 처음 실행하는 데 도움주세요.

db.querydata("Create table if not exists tbl_mon_app (_ID integer primary key, IDMon integer not null, IDCH integer not null, TenMon text not null, Gia text not null, ImgUrl text not null, ImgLocal text)"); 
    Cursor c = db.getdata("select * from tbl_mon_app"); 
    int count = c.getCount(); 

     RequestQueue requestQueue = Volley.newRequestQueue(this); 
     StringRequest stringRequest = new StringRequest(Request.Method.GET, booking, 
       new Response.Listener<String>() { 
        @Override 
        public void onResponse(String response) { 

         if (response.equals("{\"DSMON\":[]}")) { 

         } else 

          try { 
           JSONObject jsonRootObject = new JSONObject(response); 
           JSONArray jsonArray = jsonRootObject.optJSONArray("DSMON"); 
           for (int i = 0; i < jsonArray.length(); i++) { 
            JSONObject jsonObject = jsonArray.getJSONObject(i); 
            boolean check = false; 
            IDmon = jsonObject.optString("ID").toString(); 
            IDcuahang = jsonObject.optString("IDCH").toString(); 
            Tenmon = jsonObject.optString("TenMon").toString(); 
            Gia = jsonObject.optString("Gia").toString(); 
            Imgurl = jsonObject.optString("ImgUrl").toString(); 
            String imgname = Imgurl.substring(Imgurl.lastIndexOf("/") + 1); 


            Cursor ds = db.getdata("select * from tbl_mon_app"); 
            if (ds.moveToFirst()) { 
             while (!ds.isAfterLast()) { 
              if (IDmon.equals(ds.getString(ds.getColumnIndex("IDMon")))) { 
               check = true; 
               break; 
              } 
              ds.moveToNext(); 
             } 
            } 
            if (check) { 
             db.querydata("update tbl_mon_app set IDCH='" + IDcuahang + "', TenMon='" + Tenmon + "', Gia='" + Gia + "', ImgUrl='" + Imgurl + "', ImgLocal='" + "hismart/hinhmon/" + imgname + "' where IDMon='" + IDmon + "'"); 


            } else { 
             db.querydata("insert into tbl_mon_app values(null,'" + IDmon + "','" 

               + IDcuahang + "','" + Tenmon + "','" + Gia + "','" + Imgurl + "','" + "hismart/hinhmon/" + imgname + "')"); 
            } 
            ds.close(); 
           } 
           db.close(); 


          } catch (JSONException e) { 
           e.printStackTrace(); 
          } 
        } 
       }, 
       new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 
         Log.d("Lỗi", "Lỗi" + "\n" + error.toString()); 
        } 
       } 
     ); 
     requestQueue.add(stringRequest); 

확인 데이터베이스 이름 : 다음은 내 코드입니다

Cursor cur = db.getdata("select * from tbl_mon_app"); 
      if (cur.moveToFirst()) { 

       while (!cur.isAfterLast()) { 

        Toast.makeText(BookActivity.this, cur.getString(cur.getColumnIndex("Gia")), Toast.LENGTH_SHORT).show(); 
        ArrIDMon.add(cur.getString(cur.getColumnIndex("IDMon"))); 
        cur.moveToNext(); 

       } 
      } 

      if (cur.moveToFirst()) { 

       while (!cur.isAfterLast()) { 

        // Toast.makeText(BookActivity.this, cur.getString(cur.getColumnIndex("TenMon")), Toast.LENGTH_SHORT).show(); 
        ArrTenmon.add(cur.getString(cur.getColumnIndex("TenMon"))); 
        cur.moveToNext(); 

       } 
      } 

      if (cur.moveToFirst()) { 

       while (!cur.isAfterLast()) { 

        // Toast.makeText(BookActivity.this, cur.getString(cur.getColumnIndex("Gia")), Toast.LENGTH_SHORT).show(); 
        ArrGia.add(cur.getString(cur.getColumnIndex("Gia"))); 
        cur.moveToNext(); 

       } 
      } 
      if (cur.moveToFirst()) { 

       while (!cur.isAfterLast()) { 

        // Toast.makeText(BookActivity.this, cur.getString(cur.getColumnIndex("Gia")), Toast.LENGTH_SHORT).show(); 
        ArrImgUrl.add(cur.getString(cur.getColumnIndex("ImgUrl"))); 
        cur.moveToNext(); 

       } 
      } 

      if (cur.moveToFirst()) { 

       while (!cur.isAfterLast()) { 

        // Toast.makeText(BookActivity.this, cur.getString(cur.getColumnIndex("Gia")), Toast.LENGTH_SHORT).show(); 
        ArrImgLocal.add(cur.getString(cur.getColumnIndex("ImgLocal"))); 
        cur.moveToNext(); 

       } 
      } 

가 ArrayList에 데이터를 추가하고있는 데이터 세트가 여기

String abc = MainActivity.resultQR.getContents(); 
    Toast.makeText(this, String.valueOf(count), Toast.LENGTH_SHORT).show(); 

    // add data to arraylist 
    for (int i = 0; i < count; i++) { 

     Album a = new Album(abc, ArrIDMon.get(i), ArrTenmon.get(i), ArrGia.get(i), ArrImgLocal.get(i), ArrImgUrl.get(i)); 
     albumList.add(a); 
     adapter.notifyDataSetChanged(); 
    } 

    cur.close(); 

} 

을 변경 통지 설정 : tbl_mon_app 데이터베이스가 위에 추가 읽기 Recycleview 어댑터

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

private Context mContext; 
private List<Album> albumList; 
public CardView cardView; 
public View itemView; 
public ClipData.Item currentItem; 
String folder_main = "hismart/hinhmon"; 
File fileloc = new File(Environment.getExternalStorageDirectory(), folder_main); 
String IDCH = "1"; 
SwipeRefreshLayout swipeContainer; 

public class MyViewHolder extends RecyclerView.ViewHolder { 
    public TextView title, count; 
    public ImageView thumbnail, overflow; 


    public MyViewHolder(View view) { 
     super(view); 
     title = (TextView) view.findViewById(R.id.title); 
     count = (TextView) view.findViewById(R.id.count); 
     thumbnail = (ImageView) view.findViewById(R.id.thumbnail); 
     overflow = (ImageView) view.findViewById(R.id.overflow); 
     swipeContainer = (SwipeRefreshLayout) view.findViewById(R.id.swipeRefreshLayout); 
    } 
} 


public AlbumsAdapter(Context mContext, List<Album> albumList) { 
    this.mContext = mContext; 
    this.albumList = albumList; 
} 

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

    return new MyViewHolder(itemView); 
} 

@Override 
public void onBindViewHolder(final MyViewHolder holder, final int position) { 
    Db db = new Db(mContext); 



     Album album = albumList.get(position); 
     holder.title.setText(album.getName()); 
     holder.count.setText(album.getGia() + " vnđ"); 
     Glide.with(mContext).load(album.getUrl()).into(holder.thumbnail); 
} 

getset 정보]

public class Db extends SQLiteOpenHelper { 
public Db(Context context) { 
    super(context, "Db.sqlite", null, 1); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
} 

public Cursor getdata(String sql) { 
    SQLiteDatabase db = getWritableDatabase(); 
    Cursor c = db.rawQuery(sql, null); 
    return c; 
} 

public void querydata(String sql) { 
    SQLiteDatabase db = getWritableDatabase(); 
    db.execSQL(sql); 
} 

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
} 
} 
+0

를 추가하려면? 읽을 가치가 없습니다. 코드를 다시 포맷하십시오. – nhoxbypass

+0

@nhoxbypass 이 메서드는 JSON 데이터를 데이터베이스에 저장 한 다음 읽어서 Arraylist에 추가합니다. 제발 날 도와 줬어, 2 일이 걸렸어. ( – lnmh

+0

@nhoxbypass가 말했듯이 코드가 섞여서 읽기가 힘들지만 문제는 Volley가 비동기식으로 실행되지만 어댑터를 즉시 업데이트한다는 것입니다. – charlag

답변

0

귀하의 데이터 비동기 적으로 서버에서 오는

public class Album { 
private String id_table; 
private String id; 
private String name; 
private String gia; 
private String thumbnail; 
private String url; 


public Album() { 
} 

public Album(String id_table, String id, String name, String gias, String thumbnail, String url) { 

    this.id_table = id_table; 
    this.id = id; 
    this.name = name; 
    this.gia = gias; 
    this.thumbnail = thumbnail; 
    this.url = url; 


} 

public String getId_table() { 
    return id_table; 
} 

public void setId_table(String id_table) { 
    this.id_table = id_table; 
} 

public String getId() { 
    return id; 
} 

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

public String getName() { 
    return name; 
} 

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

public String getGia() { 
    return gia; 
} 

public void setGia(String gia) { 
    this.gia = gia; 
} 

public String getThumbnail() { 
    return thumbnail; 
} 

public void setThumbnail(String thumbnail) { 
    this.thumbnail = thumbnail; 
} 


public String getUrl() { 
    return url; 
} 

public void setUrl(String url) { 
    this.url = url; 
} 


} 

데이터베이스. 그래서 내부 onCreate(), 처음에는 응용 프로그램에서 귀하의 데이터를 아직 서버에서 온되지 않습니다, 그래서 그것도 귀하의 sqlite 데이터베이스에 requestQueue.add(stringRequest) 아래의 코드를 실행할 때 비어 있습니다.

는 서버에서 새 항목을 통해 public void onResponse(String response) 루프 내에서, 서버에서 새로운 신선한 데이터를 추가 구문 분석하고`에서 onCreate()`내부의 방법을 선언 왜

for (int i = 0; i < jsonArray.length(); i++) { 
    JSONObject jsonObject = jsonArray.getJSONObject(i); 
    boolean check = false; 
    IDmon = jsonObject.optString("ID").toString(); 
    IDcuahang = jsonObject.optString("IDCH").toString(); 
    Tenmon = jsonObject.optString("TenMon").toString(); 
    Gia = jsonObject.optString("Gia").toString(); 
    Imgurl = jsonObject.optString("ImgUrl").toString(); 
    String imgname = Imgurl.substring(Imgurl.lastIndexOf("/") + 1); 

    Album a = new Album(abc, IDmon, Tenmon, Gia, imgname, Imgurl); 
    albumList.add(a); 
    adapter.notifyDataSetChanged(); 
} 
+0

대단히 감사합니다! 내 목숨을 구하십시오. 다시 한번 감사드립니다 !!! – lnmh

+0

@lnmh 오신 것을 환영합니다! – nhoxbypass

관련 문제