2017-07-29 86 views
0

我正在寻求帮助将Recyclerview从最后一个ID排序到第一个ID。如何将Recyclerview从最后一个ID排序到第一个ID?

我想在recyclerview中显示,当我在数据库中添加一行时。

如何显示数据库中最后一行作为列表中的第一张卡片?

这是我的PHP代码:

<?php 
    //Creating a connection 
    $con = mysqli_connect("--","---","----","-----"); 

     /* change character set to utf8 */ 
    $con->set_charset("utf8"); 

    if (mysqli_connect_errno()) 
    { 
     echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
    } 
    /*Get the id of the last visible item in the RecyclerView from the request and store it in a variable. For   the first request id will be zero.*/ 
    $id = $_GET["id"]; 

    $sql= "Select * from movies_table where id between ($id+1) and ($id+10)"; 

    $result = mysqli_query($con ,$sql); 

    while ($row = mysqli_fetch_assoc($result)) { 

     $array[] = $row; 

    } 
    header('Content-Type: text/html; charset=utf-8'); 

    echo json_encode($array, JSON_UNESCAPED_UNICODE); 

    mysqli_free_result($result); 

    mysqli_close($con); 

?> 

,这我recyclerview类:

public class ThreeFragment extends Fragment{ 

    private static final String TAG = ThreeFragment.class.getSimpleName(); 
    private List<Movie> movies; 
    private RecyclerView recyclerView; 
    private GridLayoutManager gridLayout; 
    private MoviesAdapter adapter; 


    public ThreeFragment() { 
     // Required empty public constructor 
    } 

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

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View view = inflater.inflate(R.layout.fragment_three, container, false); 

     recyclerView = (RecyclerView) view.findViewById(R.id.recyclerview); 
     movies = new ArrayList<>(); 
     getMoviesFromDB(0); 

     gridLayout = new GridLayoutManager(getActivity(), 2); 
     recyclerView.setLayoutManager(gridLayout); 

     adapter = new MoviesAdapter(getActivity(), movies); 
     recyclerView.setAdapter(adapter); 

     recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { 
      @Override 
      public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 

       if (gridLayout.findLastCompletelyVisibleItemPosition() == movies.size() - 1) { 
        getMoviesFromDB(movies.get(movies.size() - 1).getId()); 
       } 

      } 
     }); 
     return view; 
    } 




    private void getMoviesFromDB(int id) { 

     AsyncTask<Integer, Void, Void> asyncTask = new AsyncTask<Integer, Void, Void>() { 



      ProgressDialog pdLoading = new ProgressDialog(getActivity()); 

      @Override 
      protected void onPreExecute() { 
       super.onPreExecute(); 

       //this method will be running on UI thread 
       pdLoading.setMessage("\tدر حال بارگذاری..."); 
       pdLoading.setCancelable(false); 
       pdLoading.show(); 

      } 


      @Override 
      protected Void doInBackground(Integer... movieIds) { 

       OkHttpClient client = new OkHttpClient(); 
       Request request = new Request.Builder() 
         .url("http://astaneapp.ir/wp-php/movies.php?id=" + movieIds[0]) 
         .build(); 
       try { 
        Response response = client.newCall(request).execute(); 

        JSONArray array = new JSONArray(response.body().string()); 

        for (int i = 0; i < array.length(); i++) { 

         JSONObject object = array.getJSONObject(i); 

         Movie movie = new Movie(object.getInt("id"), object.getString("movie_name"), 
           object.getString("movie_image"), object.getString("movie_genre") , object.getString("movie_discription") , object.getString("movie_lat"), object.getString("movie_lon") , object.getString("movie_marker")); 

         ThreeFragment.this.movies.add(movie); 
        } 


       } catch (IOException e) { 
        e.printStackTrace(); 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
       return null; 
      } 

      @Override 
      protected void onPostExecute(Void aVoid) { 
       adapter.notifyDataSetChanged(); 
       pdLoading.dismiss(); 
      } 
     }; 

     asyncTask.execute(id); 
    } 
} 

我需要发送适配器类代码?

回答

0

你可以尝试这样的,

@Override 
protected void onPostExecute(Void aVoid) { 

    Collections.sort(ThreeFragment.this.movies, new Comparator<Movie>() { 
     public int compare(Movie o1, Movie o2) { 
      Integer firstItem = o1.getId(); 
      Integer secondItem = o2.getId(); 
      return secondItem.compareTo(firstItem); 
     } 
    }); 

    adapter.notifyDataSetChanged(); 
    pdLoading.dismiss(); 
} 
+0

感谢您的回答,我收到此错误:不兼容的类型:int不能转换为长 –

+0

你可以转换为整数,更新我的答案。 –

+0

谢谢,这段代码对我来说也有点问题,唯一的问题是我想把数据加载10到10.你能帮我解决这个问题吗?我发布了新的修改后的代码 –

0

您可以通过ID

$sql= "Select * from movies_table where id between ($id+1) and ($id+10) ORDER BY 'id' DESC"; 

按降序顺序在服务器端(PHP)订购您的数据,也可以重新安排你从获取数组服务器:

for(int i=(YourArrayData.size()-1);i>=0;i--) 
    { 
    newArrayList.add(YourArrayData.get(i)); 
    } 

add your newArrayList to adapter 
+0

感谢您的回答,我试了一下代码并没有做任何修改。 –

+0

@FarshadAsgharzadeh你得到的结果是什么? –

+0

该列表显示,像以前一样,从旧到新 –

相关问题