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?
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(); ' –