【问题标题】:How to sort the Recyclerview from last ID to first ID?如何将 Recyclerview 从最后一个 ID 排序到第一个 ID?
【发布时间】:2018-01-05 07:45:48
【问题描述】:

我正在寻求帮助,将 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);
    }
}

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

【问题讨论】:

    标签: java php android mysql


    【解决方案1】:

    您可以在服务器端 (php) 按 DESC order by id 对数据进行排序

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

    或者您可以重新排序从服务器获得的数组:

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

    【讨论】:

    • 感谢回答,我试了代码,没有做任何改动。
    • @FarshadAsgharzadeh 你得到什么结果?
    • 列表显示,和以前一样,从旧到新
    • 在 php 中,一切都是相反的!谢谢!但在java代码中“大小”代码显示为红色!你能在我的代码中举例吗?
    • 对不起,我回复晚了,数据库数据被颠倒了,我得到了我想要的,唯一的问题是我希望数据加载10到10。你能帮我吗这个案子也是?我发布新的修改代码
    【解决方案2】:

    你可以这样试试,

    @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();
    }
    

    【讨论】:

    • 感谢您的回答,我收到此错误:不兼容的类型:int 无法转换为 Long
    • 谢谢,这段代码也对我有用,唯一的问题是我希望数据加载 10 到 10。在这种情况下你能帮我吗?我发布新的修改代码
    • @FarshadAsgharzadeh “这个代码对我也有用” 就是你所说的。如果这解决了原始问题,则应将其视为正确答案。如果您对新代码有其他问题,那么您需要提出一个新问题,而不是在您询问后附加到另一个可能的问题。
    • @fred-ii 它有效,但不完全!其他部分解决了!我要彻底解决。
    猜你喜欢
    • 1970-01-01
    • 2015-10-19
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多