2017-04-08 58 views
0
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代码排序数组中Recyclerview(Java,Android的)

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或距离代码&名称& c点不再匹配。有谁知道如何解决这一问题?

回答

0

根据你的代码,你有多个arraylist的名字,距离,cpoint,当你排序一个列表排序列表和所有其他列表之间的映射丢失。 要解决这个问题,你必须保持所有人之间的映射,只要你基于属性进行排序。

更好地创建一个自定义类,如名称,距离,cpoint ....等字段和每当你排序在一个属性排序自定义对象的列表。通过这种方式,多个列表之间的映射不会丢失。

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

+0

关于如何做到这一点的任何示例 –

+0

我可以给你的例子,但它的复制粘贴。更好地尝试以上建议,如果您遇到任何问题,欢迎您。 –

+0

public class Data公共字符串名称; public String cPoints; public String latitude; public String longitude; public String code; public float distance; public Data(String n,String cP,String lat,String lon,String c,Float dis)names = n; cPoints = cP; latitude = lat; 经度= lon; code = c; distance = dis; } }到目前为止,我做到了这一点,但是如何从RecycleFrame代码中的JSON文件添加数据? –