2017-09-25 1 views
0

J'ai créé une application qui met en évidence les états américains en fonction de la densité de population. Je veux mettre en évidence uniquement les états que l'utilisateur doit voir. Ceci est fait en utilisant RecyclerView et checkbox.Actualiser l'activité en fonction de l'entrée à variation dynamique de la case à cocher

Ceci est mon fichier .xml de MainActivity.

<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:mapbox="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    tools:context="com.example.aadhilahmed.choroplethmapbox1.MainActivity"> 


    <com.mapbox.mapboxsdk.maps.MapView 
     android:id="@+id/mapView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     mapbox:mapbox_cameraTargetLat="37.996162943943155" 
     mapbox:mapbox_cameraTargetLng="-101.0299301147461" 
     mapbox:mapbox_cameraTilt="20" 
     mapbox:mapbox_cameraZoom="2" 
     mapbox:mapbox_styleUrl="mapbox://styles/aadhilahmed/cj7ps8l3a8uxs2rocjqnakcrs"/> 

    <android.support.v7.widget.RecyclerView 
     android:layout_width="150dp" 
     android:layout_height="250dp" 
     android:id="@+id/recyclerView" 
     android:paddingRight="5dp" 
     android:paddingBottom="8dp" 
     android:background="#ffffff" 
     android:layout_gravity="bottom|right"> 

    </android.support.v7.widget.RecyclerView> 
</FrameLayout> 

Ceci est ma MainActivity.

public class MainActivity extends AppCompatActivity { 

private MapView mapView; 
String jsonData; 
JSONObject jsonObject; 
JSONArray jsonArray; 
List<List<LatLng>> coordinates=new ArrayList<>(); 
List<String> colours=new ArrayList<>(); 
List<String> adapterLegend= Arrays.asList("0-10","10-20","20-50","50-100","100-200","200-500","500-1000","1000-10000"); 
int[] images={R.drawable.colormap1, 
       R.drawable.colormap2, 
       R.drawable.colormap3, 
       R.drawable.colormap4, 
       R.drawable.colormap5, 
       R.drawable.colormap6, 
       R.drawable.colormap7, 
       R.drawable.colormap8 
}; 
private RecyclerView recyclerView; 
private RecyclerView.Adapter adapter; 
private List<ListItem> listItemss; 
private List<ListItem> currentCheckedItems=new ArrayList<>(); 
int[] selectedRangeArray=new int[50]; 

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

    Mapbox.getInstance(this,"pk.eyJ1IjoiYWFkaGlsYWhtZWQiLCJhIjoiY2o2MXNzY3I5MHoyajMybW9raTI1emJmbiJ9.paxtpoOPEQDuVN19tlfpVw"); 
    setContentView(R.layout.activity_main); 

    mapView=(MapView)findViewById(R.id.mapView); 
    mapView.onCreate(savedInstanceState); 

    recyclerView=(RecyclerView)findViewById(R.id.recyclerView); 
    recyclerView.setHasFixedSize(true); 
    recyclerView.setLayoutManager(new LinearLayoutManager(this)); 

    listItemss=new ArrayList<>(); 
    for(int i=0;i<8;i++){ 
     ListItem listItem=new ListItem(images[i],adapterLegend.get(i)); 
     listItemss.add(listItem); 
    } 

    adapter=new MyAdapter(listItemss,this, new MyAdapter.OnItemCheckListener() { 
     @Override 
     public void onItemCheck(ListItem item) { 
      currentCheckedItems.add(item); 
     } 

     @Override 
     public void onItemUncheck(ListItem item) { 
      currentCheckedItems.remove(item); 
     } 
    }); 
    recyclerView.setAdapter(adapter); 

    RangeOfCheckedItems range=new RangeOfCheckedItems(); 
    selectedRangeArray=range.limitFinder(currentCheckedItems.size(),currentCheckedItems); 


    try 
    { 
     jsonData= convertJSONFile("stateData.geojson",MainActivity.this); 
     jsonObject=new JSONObject(jsonData); 
     jsonArray=jsonObject.getJSONArray("features"); 
     choroplethManipulation(); 

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



} 

public void drawMap(final List<List<LatLng>> points, final List<String> colur){ 
    mapView.getMapAsync(new OnMapReadyCallback() { 
     @Override 
     public void onMapReady(MapboxMap mapboxMap) { 
      for(int m=0;m< colours.size();m++) { 
       mapboxMap.addPolygon(new PolygonOptions() 
         .addAll(points.get(m)) 
         .fillColor(Color.parseColor(colur.get(m))) 
       ); 
      } 
     } 
    }); 
} 

public void choroplethManipulation() throws JSONException { 
    for(int state=0;state<jsonArray.length();state++) { 
     boolean checked = false; 

     //Choose color for the area 
     float orders = (float) jsonArray.getJSONObject(state).getJSONObject("properties").getDouble("density"); 
     for (int n = 0; n < currentCheckedItems.size(); n++) { 
      if ((int) orders > selectedRangeArray[n] && (int) orders < selectedRangeArray[n + 1]) 
       checked = true; 
     } 

     if (checked == true) { 
      //Collecting coordinates for drawing polygon 
      JSONObject geometry = jsonArray.getJSONObject(state).getJSONObject("geometry"); 
      String type = geometry.getString("type"); 

      if (type.equals("Polygon")) { 
       JSONArray points = geometry.getJSONArray("coordinates").getJSONArray(0); 
       List<LatLng> polygonpoints = new ArrayList<>(); 
       for (int i = 0; i < points.length(); i++) { 
        polygonpoints.add(new LatLng(points.getJSONArray(i).getDouble(1), points.getJSONArray(i).getDouble(0))); 
       } 
       coordinates.add(polygonpoints); 
       colours.add(ColorSelector.ColorChooser.chooseColor(orders)); 
      } else { 
       JSONArray points = geometry.getJSONArray("coordinates"); 
       for (int p = 0; p < points.length(); p++) { 
        JSONArray splits = points.getJSONArray(p).getJSONArray(0); 
        List<LatLng> polygonpoints = new ArrayList<>(); 
        for (int x = 0; x < splits.length(); x++) { 
         polygonpoints.add(new LatLng(splits.getJSONArray(x).getDouble(1), splits.getJSONArray(x).getDouble(0))); 
        } 
        coordinates.add(polygonpoints); 
        colours.add(ColorSelector.ColorChooser.chooseColor(orders)); 
       } 
      } 
     } 
    } 

    drawMap(coordinates,colours); 
} 


public String convertJSONFile(String filename, Context context) throws IOException { 
    AssetManager manager=context.getAssets(); 
    InputStream file=manager.open(filename); 
    byte[] formArray=new byte[file.available()]; 
    file.read(formArray); 
    file.close(); 

    return new String(formArray); 
} 

} 

Et c'est une petite classe qui donne les limites supérieures et inférieures des cases cochées.

public class RangeOfCheckedItems { 

int limits[]=new int[50]; 

public int[] limitFinder(int num,List<ListItem> checkedItems){ 

    for(int i=0;i<num;i++){ 
     String s=checkedItems.get(i).getRange(); 
     StringTokenizer st=new StringTokenizer(s,"-"); 
     limits[i]=Integer.parseInt(st.nextToken()); 
     limits[i+1]=Integer.parseInt(st.nextToken()); 
    } 
    return limits; 
} 
} 

Ceci est ma classe Adapter.

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { 
    interface OnItemCheckListener{ 
     void onItemCheck(ListItem item); 
     void onItemUncheck(ListItem item); 
    }; 

    private List<ListItem> listItems; 
    private Context context; 
    @NonNull 
    private OnItemCheckListener onItemCheckListener; 

    public MyAdapter(List<ListItem> listItems,Context context,@NonNull OnItemCheckListener onItemCheckListener){ 
     this.listItems=listItems; 
     this.context=context; 
     this.onItemCheckListener=onItemCheckListener; 

    } 


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

    @Override 
    public void onBindViewHolder(final ViewHolder holder, int position) { 
      ListItem listItem=listItems.get(position); 
      holder.image.setImageResource(listItem.getImage()); 
      holder.rangeinfo.setText(listItem.getRange()); 

      if(holder instanceof ViewHolder){ 
       final ListItem currentItem=listItems.get(position); 

       ((ViewHolder)holder).setOnClickListener(new View.OnClickListener(){ 

        @Override 
        public void onClick(View v) { 
         ((ViewHolder)holder).checkBox.setChecked(!((ViewHolder)holder).checkBox.isChecked()); 
         if(((ViewHolder)holder).checkBox.isChecked()){ 
          onItemCheckListener.onItemCheck(currentItem); 
         }else { 
          onItemCheckListener.onItemUncheck(currentItem); 
         } 
        } 
       }); 
      } 
    } 

    @Override 
    public int getItemCount() { 
     return listItems.size(); 
    } 

    public class ViewHolder extends RecyclerView.ViewHolder{ 

     public ImageView image; 
     public TextView rangeinfo; 
     public CheckBox checkBox; 

     public ViewHolder(View itemView) { 
      super(itemView); 

      image=(ImageView)itemView.findViewById(R.id.colorLegend); 
      rangeinfo=(TextView)itemView.findViewById(R.id.textLegend); 
      checkBox=(CheckBox)itemView.findViewById(R.id.checkboxLegend); 
      checkBox.setClickable(false); 
     } 

     public void setOnClickListener(View.OnClickListener onClickListener){ 
      itemView.setOnClickListener(onClickListener); 
     } 

    } 
} 

Mon problème est que je veux appeler choroplethManipulation() méthode seulement après que je reçois des entrées de cases à cocher. Mais après toute l'exécution seulement, mon activité se gonfle, donc je suis incapable de donner mes entrées et la variable checked reste toujours fausse. Une fois que j'ai coché les cases, j'ai besoin de mon activité pour réagir dynamiquement et afficher uniquement les résultats sélectionnés. Comment cela peut-il être fait?

+0

Pour mettre à jour votre 'recycleur view' que vous pouvez faire après avoir Cliquez sur la case à cocher vous devez mettre à jour votre éléments dans l'adaptateur et notifiez votre vue recycleur. Par exemple 'adapter.setItems (list); adapter.notifyDataSetChanged(); ' –

Répondre

0

Vous pouvez actualiser/recréer votre activité par la méthode recreate(), est sur la méthode par défaut sur Activity