2

Я пытаюсь реализовать swipe для обновления в своем приложении. Когда запускается салфетка для обновления, сначала все данные извлекаются из JSON, а затем сохраняются в базе данных. После сохранения данных все новые данные будут добавлены в начало recyclerview. Я прочитал несколько статей и только узнал о добавлении одного элемента в верхней части списка. Но в случае моего приложения, где может быть доступно несколько экспонатов, что мне делать?Динамическое добавление данных из SQLite в начало recyclerview

Вот мой код для таблицы базы данных, где первый новый пост забирается с последнем идентификатором сообщения, который показан в recyclerview:

@Override 
public ArrayList<Post> getAllNewPost(int T) { 
    SQLiteDatabase db = this.getReadableDatabase(); 
    ArrayList<Post> postList = null; 
    try { 
     postList = new ArrayList<Post>(); 

     String QUERY = "SELECT * FROM " + TABLE_NAME + " INNER JOIN "+TABLE_FOLLOWER+ 
       " ON post_table.user_id = follower.user_id WHERE follower.follow = '1' AND post_table.post_id > "+T+" ORDER BY "+POST_ID+" DESC"; 
     Cursor cursor = db.rawQuery(QUERY, null); 
     if (!cursor.isLast()) { 
      while (cursor.moveToNext()) { 
       Post post = new Post(); 
       post.setPost_id(cursor.getString(0)); 
       Log.d("post_id",cursor.getString(0)); 
       post.setUser_id(cursor.getString(1)); 
       post.setUser_name(cursor.getString(2)); 
       post.setImg_link(cursor.getString(3)); 
       post.setPost_title(cursor.getString(4)); 
       post.setPost_cat(cursor.getString(6)); 
       post.setPost_time(cursor.getString(8)); 
       postList.add(post); 
      } 
     } 
     db.close(); 
    } catch (Exception e) { 
     Log.e("error", e + ""); 
    } 
    return postList; 
} 

Здесь адаптер массива recyclerview:

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

Context context; 
ArrayList<Post> listData = new ArrayList<>(); 
String rpostid,ruserid,rname,rcat,rdate,rtittle,urlThumnail; 
private VolleySingleton volleySingleton; 
ImageLoader imageLoader = VolleySingleton.getsInstance().getImageLoad(); 

public PostAdapter(ArrayList<Post> postList) { 
    this.listData=postList; 
} 

public PostAdapter(Context context){ 
    this.context = context; 
} 

@Override 
public PostAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { 
    View v = LayoutInflater.from(viewGroup.getContext()) 
      .inflate(R.layout.post_item, viewGroup, false); 
    return new posts(v); 
} 

public class posts extends ViewHolder { 
    TextView tvTittle,tvPostId,tvUseId,tvName,tvCat,tvDate; 
    ImageView row_img; 
    public posts(View v) { 
     super(v); 
     tvTittle = (TextView) v.findViewById(R.id.row_cmnt); 
     tvPostId = (TextView) v.findViewById(R.id.row_postid); 
     tvUseId = (TextView) v.findViewById(R.id.row_userid); 
     tvName = (TextView) v.findViewById(R.id.row_name); 
     tvCat = (TextView) v.findViewById(R.id.row_cat); 
     tvDate = (TextView) v.findViewById(R.id.row_date); 
     row_img = (ImageView) v.findViewById(R.id.row_img); 

     v.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       Intent intent; 
       TextView text = (TextView) v.findViewById(R.id.row_postid); 
       String lst_txt = text.getText().toString().trim(); 
       intent = new Intent(v.getContext(), PostView.class); 
       intent.putExtra("post_id", lst_txt); 
       v.getContext().startActivity(intent); 
      } 
     }); 
    } 
} 

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

    final posts holder = (posts) viewHolder; 
    Post post = listData.get(position); 
    rpostid = post.getPost_id(); 
    ruserid = post.getUser_id(); 
    rname = post.getUser_name(); 
    rcat = post.getPost_cat(); 
    rdate = post.getPost_time(); 
    rtittle = post.getPost_title(); 
    holder.tvPostId.setText(rpostid); 
    holder.tvUseId.setText(ruserid); 
    holder.tvName.setText(rname); 
    holder.tvCat.setText(rcat); 
    holder.tvDate.setText(rdate); 
    holder.tvTittle.setText(rtittle); 
    urlThumnail = post.getImg_link(); 
    Log.d("qwerty","link of image lru: "+ urlThumnail); 
    if (urlThumnail != null){ 
     imageLoader.get(urlThumnail, new ImageLoader.ImageListener() { 
      @Override 
      public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) { 
       holder.row_img.setImageBitmap(response.getBitmap()); 
       Log.d("qwerty","post attached 2"); 
      } 

      @Override 
      public void onErrorResponse(VolleyError error) { 
       Log.d("qwerty","post attached 3"); 
      } 
     }); 
    } 
} 

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

}

И вот код, по которому все новые сообщения будут извлечены из БД:

private ArrayList<Post> parseJSONResponse(JSONObject response) { 
    if (response == null || response.length() == 0) { 
    } else { 
     try { 
      JSONArray jsonArray = response.getJSONArray("post"); 
      for (int i = 0; i < jsonArray.length(); i++) { 
       JSONObject jsonObjectPOST = jsonArray.getJSONObject(i); 
       String post_id = jsonObjectPOST.getString(Key_post_id); 
       String user_id = jsonObjectPOST.getString(Key_user_id); 
       String user_name = jsonObjectPOST.getString(Key_user_name); 
       String img_link = jsonObjectPOST.getString(Key_img_link); 
       String post_title = jsonObjectPOST.getString(Key_post_title); 
       String post_desc = jsonObjectPOST.getString(Key_post_desc); 
       String post_exp_date = jsonObjectPOST.getString(Key_post_exp); 
       String post_cat = jsonObjectPOST.getString(Key_post_cat); 
       String post_time = jsonObjectPOST.getString(Key_post_time); 
       Log.d("response",post_id+" "+user_id+" "+user_name+" "+img_link); 
       Post postitem = new Post(); 
       postitem.setPost_id(post_id); 
       postitem.setUser_id(user_id); 
       postitem.setUser_name(user_name); 
       postitem.setImg_link(img_link); 
       postitem.setPost_title(post_title); 
       postitem.setDesc(post_desc); 
       postitem.setEXP(post_exp_date); 
       postitem.setPost_cat(post_cat); 
       postitem.setPost_time(post_time); 

       if(jsonObjectPOST.has(Key_post_id) && 
         jsonObjectPOST.has(Key_user_id) && 
         jsonObjectPOST.has(Key_user_name) && 
         jsonObjectPOST.has(Key_img_link) && 
         jsonObjectPOST.has(Key_post_title) && 
         jsonObjectPOST.has(Key_post_desc) && 
         jsonObjectPOST.has(Key_post_exp) && 
         jsonObjectPOST.has(Key_post_cat) && 
         jsonObjectPOST.has(Key_post_time)){ 

        if(!jsonObjectPOST.isNull(Key_post_id) && 
          !jsonObjectPOST.isNull(Key_user_id) && 
          !jsonObjectPOST.isNull(Key_user_name) && 
          !jsonObjectPOST.isNull(Key_img_link) && 
          !jsonObjectPOST.isNull(Key_post_title) && 
          !jsonObjectPOST.isNull(Key_post_desc) && 
          !jsonObjectPOST.isNull(Key_post_exp) && 
          !jsonObjectPOST.isNull(Key_post_cat) && 
          !jsonObjectPOST.isNull(Key_post_time)){ 

         handler.addPost(postitem); 
         new CountDownTimer(2000, 1000) { 
          public void onTick(long millisUntilFinished) {} 
          public void onFinish() { 
           postList = handler.getAllPost(); 
           t = Integer.parseInt(postList.get(1).getPost_id().toString().trim()); 
           Log.d("Check", "postid: "+t); 
           Hpbar.setVisibility(View.INVISIBLE); 
           Log.d("jsonCount", String.valueOf(postList)); 
           String AdapterData = String.valueOf(postList); 
           if(AdapterData.equals("[]")){ 
            Htvnopostfound.setVisibility(View.VISIBLE); 
           }else{ 
            adapter = new PostAdapter(postList); 
            listView.setAdapter(adapter); 
           } 
          } 
         }.start(); 

        }else{ 

        } 

       }else{ 

       } 
      } 

     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 
    return postList; 
} 

private ArrayList<Post> swipeJSONResponse(JSONObject response) { 
    if (response == null || response.length() == 0) { 
    } else { 
     try { 
      JSONArray jsonArray = response.getJSONArray("post"); 
      for (int i = 0; i < jsonArray.length(); i++) { 
       JSONObject jsonObjectPOST = jsonArray.getJSONObject(i); 
       String post_id = jsonObjectPOST.getString(Key_post_id); 
       String user_id = jsonObjectPOST.getString(Key_user_id); 
       String user_name = jsonObjectPOST.getString(Key_user_name); 
       String img_link = jsonObjectPOST.getString(Key_img_link); 
       String post_title = jsonObjectPOST.getString(Key_post_title); 
       String post_desc = jsonObjectPOST.getString(Key_post_desc); 
       String post_exp_date = jsonObjectPOST.getString(Key_post_exp); 
       String post_cat = jsonObjectPOST.getString(Key_post_cat); 
       String post_time = jsonObjectPOST.getString(Key_post_time); 
       Post postitem = new Post(); 
       postitem.setPost_id(post_id); 
       postitem.setUser_id(user_id); 
       postitem.setUser_name(user_name); 
       postitem.setImg_link(img_link); 
       postitem.setPost_title(post_title); 
       postitem.setDesc(post_desc); 
       postitem.setEXP(post_exp_date); 
       postitem.setPost_cat(post_cat); 
       postitem.setPost_time(post_time); 

       if(jsonObjectPOST.has(Key_post_id) && 
         jsonObjectPOST.has(Key_user_id) && 
         jsonObjectPOST.has(Key_user_name) && 
         jsonObjectPOST.has(Key_img_link) && 
         jsonObjectPOST.has(Key_post_title) && 
         jsonObjectPOST.has(Key_post_desc) && 
         jsonObjectPOST.has(Key_post_exp) && 
         jsonObjectPOST.has(Key_post_cat) && 
         jsonObjectPOST.has(Key_post_time)){ 

        if(!jsonObjectPOST.isNull(Key_post_id) && 
          !jsonObjectPOST.isNull(Key_user_id) && 
          !jsonObjectPOST.isNull(Key_user_name) && 
          !jsonObjectPOST.isNull(Key_img_link) && 
          !jsonObjectPOST.isNull(Key_post_title) && 
          !jsonObjectPOST.isNull(Key_post_desc) && 
          !jsonObjectPOST.isNull(Key_post_exp) && 
          !jsonObjectPOST.isNull(Key_post_cat) && 
          !jsonObjectPOST.isNull(Key_post_time)){ 

         handler.addPost(postitem); 
         new CountDownTimer(2000, 1000) { 
          public void onTick(long millisUntilFinished) {} 
          public void onFinish() { 
           postList = handler.getAllNewPost(t); 
           adapter.notifyItemInserted(1); 
           Log.d("check","post_id "+t+" hello"); 
           /*adapter = new PostAdapter(postList); 
           listView.setAdapter(adapter); 
           Log.d("check","post_id "+t+" hello 2");*/ 
           Log.d("check","post_id "+t+" hello 2"); 
           Hpbar.setVisibility(View.INVISIBLE); 
           swipeRefreshLayout.setRefreshing(false); 
          } 
         }.start(); 

        }else{ 

        } 

       }else{ 

       } 
      } 

     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 
    return postList; 
} 

При запуске parseJSONResponse используется и для swipeToRefreshswipeJSONResponse используется. В parseJSONResponse идентификатор последнего отображаемого сообщения хранится в int t, а затем int t передается swipeJSONResponse, чтобы получить новое сообщение.

Но после обновления новые данные не будут отображаться в списке. О, пожалуйста, скажите мне, как это сделать. Я прочитал несколько статей, в которых add используется, как таковой:

listview.add(0, item); 

Но я не знаю, как реализовать это с помощью нескольких строк данных одновременно. Заранее спасибо.

+0

я лично хотел бы использовать LoaderManager и и пусть CursorLoader получать обновления автоматически, когда данные были изменены. Для этого потребуется поставщик контента, но есть решения с открытым исходным кодом для генерации одного из них, если вы не хотите его самостоятельно кодировать. –

+0

@Simon вы можете объяснить больше о LoaderManager –

+0

. Сначала сначала реализуйте ContentProvider, который дает доступ к вашей базе данных: https : //developer.android.com/guide/topics/providers/content-provider-creating.html –

ответ

1

Правильный способ для обновления данных в ListView должны быть:

1) создать метод обновления данных в адаптере.В вашем случае может быть так:

public updateData(ArrayList<Post> postList) { 
    this.listData=postList; 
    notifyDataSetChanged(); 
} 

или, если вы хотите просто добавить данные в верхней части:

public addNewDataOnTop(ArrayList<Post> postList) { 
    this.listData.addAll(0,postList); 
    notifyDataSetChanged(); 
} 

2) Если у вас есть новые данные, чтобы добавить, не создать новый адаптер а просто обновить данные

  • При создании ListView в начале вы установите пустой адаптер:

    adapter = new PostAdapter(new ArrayList()); 
    listView.setAdapter(adapter); 
    
  • При получении новых данных, вы просто обновить адаптер:

    adapter.addNewDataOnTop(postList); 
    

Я надеюсь, что это помогло

+0

благодарю за ваш ответ, но все еще ничего не обновляет ... –

+0

Возможно, проблема здесь: 'adapter.notifyItemInserted (1);'. В этом случае вы уведомляете адаптер о том, что данные были изменены, но вы не обновляете объект postList в адаптере. Вы должны изменить его на это: 'adapter.addNewDataOnTop (postList);' после обновления адаптера с помощью методов в моем сообщении. Дайте мне знать, если он решит. –

+0

спасибо, ваш код ответа работал на самом деле, я реализовал его неправильно, но теперь он работает правильно. Еще раз спасибо –

0

Я хотел бы вставить каждый элемент в верхней части с помощью:

mArrayList.add(0, item1); 
notifyItemInserted(0); 

mArrayList.add(0, item2); 
notifyItemInserted(0); 

Выполните следующие действия для всех элементов.

+0

bu Нет элементов может отличаться ... чем –

+0

Что значит? – Kobe

+1

Имеется возможность иметь данные двух или более двух строк, чем их можно обрабатывать. –

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

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