【问题标题】:Sort Array in Recyclerview (Java, Android)Recyclerview中的排序数组(Java,Android)
【发布时间】:2017-04-08 17:20:01
【问题描述】:
   package com.example.sander.app;

import android.app.Fragment;
import android.app.FragmentTransaction;
import android.content.Intent;
import android.location.Location;
import android.os.Bundle;
import android.support.v7.widget.CardView;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextView;
import android.widget.Toast;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * Created by Sander on 6-4-2017.
 */

public class RecycleFrame extends Fragment {
    ArrayList<String> names = new ArrayList<>();
    ArrayList<String> cPoints = new ArrayList<>();
    ArrayList<String> code = new ArrayList<>();
    ArrayList<String> latitude = new ArrayList<>();
    ArrayList<String> longitude = new ArrayList<>();
    GPSTracker gps;
    ArrayList<Double> dLatitude = new ArrayList<>();
    ArrayList<Double> dLongitude = new ArrayList<>();
    ArrayList<Float> distance = new ArrayList<>();
    ArrayList<Data> dataList = new ArrayList<>();
    public RecycleFrame() {
        // Required empty public constructor
    }

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


    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.fragment_view, menu);
        super.onCreateOptionsMenu(menu,inflater);
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        Integer id = item.getItemId();
        if(id == R.id.action_A_Z){
            //Sorts the garages from A to Z
            Collections.sort(names);
            //Refreshes the fragment
            FragmentTransaction transaction = getFragmentManager().beginTransaction();
            transaction.detach(this).attach(this).commit();
            return true;
        }
        else if(id == R.id.action_Z_A){
            //Sorts the garages from Z to A
            Collections.reverse(names);
            //Refreshes the fragment
            FragmentTransaction transaction = getFragmentManager().beginTransaction();
            transaction.detach(this).attach(this).commit();
            return true;
        }
        else if (id == R.id.short_distance){
            Collections.sort(distance);
            FragmentTransaction transaction = getFragmentManager().beginTransaction();
            transaction.detach(this).attach(this).commit();
            return true;
        }
        return super.onOptionsItemSelected(item);
        }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        setHasOptionsMenu(true);
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_recycle, container, false);
        final RecyclerView VRecyclerView = (RecyclerView) view.findViewById(R.id.rv_recycler_view);
        RequestQueue rq = Volley.newRequestQueue(getActivity().getApplicationContext());
        String url= "http://test.dontstealmywag.ga/api/parkgarage_all.php";
        StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        // Do something with the response
                        try{
                            JSONObject o = new JSONObject(response);
                            JSONArray values=o.getJSONArray("");
                            if(names.size() == 0) {
                                for (int i = 0; i < values.length(); i++) {

                                    JSONObject jsonObject = values.getJSONObject(i);
                                    dataList.add(new Data(jsonObject.getString("parkgarage_name"), jsonObject.getString("charging_capcatity"), jsonObject.getDouble("langitude"),
                                            jsonObject.getDouble("longitude"), jsonObject.getString("parkgarage_code"), distance.get(i)));
                                    //names.add(jsonObject.getString("parkgarage_name"));
                                    //cPoints.add(jsonObject.getString("charging_capacity"));
                                    //code.add(jsonObject.getString("parkgarage_code"));
                                    //latitude.add(jsonObject.getString("langitude"));
                                    //longitude.add(jsonObject.getString("longitude"));
                                    dLatitude.add(jsonObject.getDouble("langitude"));
                                    dLongitude.add(jsonObject.getDouble("longitude"));
                                }
                            }
                        }  catch (JSONException ex){}
                        gps = new GPSTracker(getActivity());
                        //check if gps is on
                        if(!gps.canGetLocation()){
                            gps.showSettingsAlert();
                        }
                        Location myLocation = new Location("");
                        myLocation.setLatitude(gps.getLatitude());
                        myLocation.setLongitude(gps.getLongitude());
                        for(int z = 0; z < latitude.size(); z++){
                            Location parkingGarage = new Location("");
                            parkingGarage.setLatitude(dLatitude.get(z));
                            parkingGarage.setLongitude(dLongitude.get(z));
                            distance.add(myLocation.distanceTo(parkingGarage)/1000);
                        }


                        VRecyclerView.setHasFixedSize(true);
                        //RecycleAdapter adapter = new RecycleAdapter(names, cPoints, code, latitude, longitude, distance);
                        RecycleAdapter adapter = new RecycleAdapter(dataList);
                        VRecyclerView.setAdapter(adapter);
                        LinearLayoutManager llm = new LinearLayoutManager(getActivity());
                        VRecyclerView.setLayoutManager(llm);
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        // Handle error
                    }
                });
        rq.add(stringRequest);
        return view;
    }
}

这是我的 RecycleFrame 代码,下面是我的 RecyclerAdapter 代码

    package com.example.sander.app;

import android.app.Fragment;
import android.media.Image;
import android.os.Bundle;
import android.support.v7.widget.CardView;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import org.w3c.dom.Text;

import java.lang.reflect.Array;
import java.util.ArrayList;

/**
 * Created by Sander on 6-4-2017.
 */

public class RecycleAdapter extends RecyclerView.Adapter<RecycleAdapter.MyViewHolder> {
    ArrayList<Data> ArrayListData;
    public static class MyViewHolder extends RecyclerView.ViewHolder{
        public CardView mCardView;
        public TextView TextViewNames;

        public MyViewHolder(View v){
            super(v);
            mCardView = (CardView) v.findViewById(R.id.card_view);
            TextViewNames = (TextView) v.findViewById(R.id.text_view_names);

        }

    }
    public RecycleAdapter(ArrayList<Data> names){
        ArrayListData = names;
        //ArrayCharging= cPoints;
        //ArrayCode = code;
        //ArrayLatitude = latitude;
        //ArrayLongitude = longitude;
        //ArrayDistance = distance;
    }
    @Override
    public RecycleAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_card_view, parent, false);
        MyViewHolder vh = new MyViewHolder(v);
        return vh;
    }
    @Override
    public void onBindViewHolder(MyViewHolder holder, int position){

        holder.TextViewNames.setText(String.valueOf(ArrayListData.get(position)));
        //holder.TextViewNames.setText("Naam: " + ArrayNames.get(position));
        //holder.TextViewCharging.setText("Oplaadpunten: " + ArrayCharging.get(position));
        //holder.TextViewCode.setText("Code: " + ArrayCode.get(position));
        //holder.TextViewLatitude.setText("Positie: (" + ArrayLatitude.get(position) + ", " + ArrayLongitude.get(position)+ ")");
        //holder.TextViewDistance.setText(String.valueOf(ArrayDistance.get(position)));
        //holder.mImageView.setImageResource(R.drawable.ic_local_parking_black_24dp);
    }
    @Override
    public int getItemCount() { return ArrayListData.size(); }
}

我想要的是以下内容:我希望能够按下 3 点菜单中的一个项目并将其从 A 到 Z、Z 到 A 排序并按到特定位置的距离排序。排序工作正确(距离除外,但我可以自己解决)。唯一的问题是,当我从 A 到 Z 或 Z 到 A 或距离排序时,代码、名称和 cPoints 不再匹配。有谁知道如何解决这个问题?

【问题讨论】:

    标签: java android arrays sorting


    【解决方案1】:

    根据您的代码,您有多个用于名称、距离、cpoint 的数组列表,当您对一个列表进行排序时,排序列表与所有其他列表之间的映射丢失。 要解决此问题,您必须在根据属性进行排序时保持所有之间的映射。

    最好创建一个自定义类,其中包含名称、距离、cpoint 等字段......并且每当您对一个属性进行排序时,都会对自定义对象列表进行排序。通过这种方式,多个列表之间的映射不会丢失。

    还有另一种解决问题的低效方法。但我不会推荐。 尝试基于一个键同时对 4 个数组进行排序。就像如果要根据名称进行排序一样,请尝试在名称数组上实现选择排序,并在所有四个数组中交换交换元素以维护所有四个数组之间的映射。在此解决方案中,排序性能不佳。要实现这一点,请参考How to sort multiple ArrayLists based off order of another?

    【讨论】:

    • 有关如何执行此操作的任何示例
    • 我可以给你举个例子,但它就像复制粘贴一样。最好尝试上述建议,如果您遇到任何问题,欢迎您。
    • 公共类数据{公共字符串名称;公共字符串 cPoints;公共字符串纬度;公共字符串经度;公共字符串代码;公共浮动距离;公共数据(字符串 n,字符串 cP,字符串 lat,字符串 lon,字符串 c,浮点数){名称 = n; cPoints = cP;纬度 = 纬度;经度= lon;代码 = c;距离 = dis;到目前为止,我做了这个,但是如何从 RecycleFrame 代码中的 JSON 文件向其中添加数据?
    • 在迭代 json 数组的 for 循环中,创建 Data 对象并将列表传递给适配器并通知。 JSONObject jsonObject = values.getJSONObject(i); dataList.add(new Data(jsonObject.getString("parkgarage_name"), jsonObject.getString("charging_capacity")), jsonObject.getString("langitude"), jsonObject.getDouble("longitude"), jsonObject.getString("parkgarage_code "), ..);
    • dataList 应该类似于 Data [] = {},对吗?因为如果我这样做,它不知道“添加”方法。没关系,它应该是 ArrayList dataList = new ArrayList();
    猜你喜欢
    • 2011-02-28
    • 2011-06-09
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多