Veuillez suggérer toute approche que j'utilise pour le créer.
Requête: Je crée une vue 2-Spinner, où je dois ajouter une liste de pays/villes, donc comme si je sélectionne l'Inde, je reçois 50 articles dans la liste déroulante, le problème avec ceci est qu'il prend toute la page en hauteur.
Ce que je veux: Je veux créer une vue déroulante, où l'utilisateur ne peut voir que 10 éléments dans la vue déroulante, d'autres éléments seront affichés chaque fois que l'utilisateur faites défiler le vue déroulante.
Vous pouvez utiliser la réflexion.
Spinner spinner = (Spinner) findViewById(R.id.spinner);
try {
Field popup = Spinner.class.getDeclaredField("mPopup");
popup.setAccessible(true);
// Get private mPopup member variable and try cast to ListPopupWindow
Android.widget.ListPopupWindow popupWindow = (Android.widget.ListPopupWindow) popup.get(spinner);
// Set popupWindow height to 500px
popupWindow.setHeight(500);
}
catch (NoClassDefFoundError | ClassCastException | NoSuchFieldException | IllegalAccessException e) {
// silently fail...
}
Vous pouvez également affecter l'emplacement et la taille de la vue déroulante en sous-classant Spinner
et en remplaçant sa getWindowVisibleDisplayFrame(Rect outRect)
qui est utilisée par Android.widget.PopupWindow
pour les calculs. Définissez simplement outRect
pour limiter la zone dans laquelle la liste déroulante peut être affichée.
Cette approche n'est bien sûr pas adaptée à tous les scénarios, car vous souhaitez parfois placer une vue déroulante afin de ne pas masquer une autre vue ou par une autre condition connue uniquement "en dehors de l'instance".
Dans mon cas, je devais postuler FLAG_LAYOUT_NO_LIMITS
drapeau à ma fenêtre d'activité, ce qui a provoqué l'énorme outRect
et donc une partie de la vue déroulante s'est parfois cachée derrière la barre de navigation. Afin de restaurer le comportement d'origine, j'ai utilisé le remplacement suivant:
@Override
public void getWindowVisibleDisplayFrame(Rect outRect) {
WindowManager wm = (WindowManager) getContext.getSystemService(Context.WINDOW_SERVICE);
Display d = wm.getDefaultDisplay();
d.getRectSize(outRect);
outRect.set(outRect.left, <STATUS BAR HEIGHT>, outRect.right, outRect.bottom);
}
pour cela, j'ai créé le mien, PopUpWindow comme suggéré par @theLittleNaruto, dans la section des commentaires.
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:orientation="vertical"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content">
<Button
Android:layout_marginTop="80dp"
Android:id="@+id/btn"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="Country"
Android:layout_gravity="center_vertical|center_horizontal"/>
</LinearLayout>
popup_example.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:orientation="vertical"
Android:padding="10dip" >
<ListView
Android:id="@+id/lstview"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
/>
</LinearLayout>
showpopup_1.Java
package com.example.spinnerworking;
import Android.app.Activity;
import Android.content.Context;
import Android.graphics.Color;
import Android.os.Bundle;
import Android.util.Log;
import Android.view.Gravity;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.ViewGroup;
import Android.widget.AdapterView;
import Android.widget.AdapterView.OnItemClickListener;
import Android.widget.ArrayAdapter;
import Android.widget.BaseAdapter;
import Android.widget.Button;
import Android.widget.ImageButton;
import Android.widget.ListView;
import Android.widget.PopupWindow;
import Android.widget.TextView;
import Android.widget.PopupWindow.OnDismissListener;
import Android.widget.Toast;
public class showpopup_1 extends Activity {
boolean click = true ;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final LayoutInflater inflater = (LayoutInflater) this
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final Button b = (Button) findViewById(R.id.btn);
final View pview = inflater.inflate(R.layout.popup_example,
(ViewGroup) findViewById(R.layout.main));
final PopupWindow pw = new PopupWindow(pview);
Log.i("hello", "hello") ;
b.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (click) {
// if onclick written here, it gives null pointer exception.
// if onclick is written here it gives runtime exception.
pw.showAtLocation(v, Gravity.CENTER_HORIZONTAL, 0, 0);
pw.update(8, 0, 150, 200);
String[] array = new String[] { "tushar", "pandey",
"almora" };
ListView lst = (ListView) pview.findViewById(R.id.lstview);
adapterHello adapter = new adapterHello(showpopup_1.this);
lst.setAdapter(adapter);
lst.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
Toast.makeText(showpopup_1.this, "pandey",
Toast.LENGTH_SHORT).show();
}
});
click = false ;
}
else
{
pw.dismiss();
click = true;
}
}
});
}
}
class adapterHello extends BaseAdapter {
String array[] = new String[] { "tushar", "pandey", "almora", "hello",
"tushar", "pandey", "almora", "hello", "tushar", "pandey",
"almora", "hello" };
showpopup_1 context;
public adapterHello(showpopup_1 context) {
this.context = context;
}
public int getCount() {
// TODO Auto-generated method stub
return array.length;
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return arg0;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
TextView text = new TextView(context);
text.setHeight(30);
text.setPadding(10, 8, 0, 0);
text.setTextColor(Color.BLACK);
text.setText(array[position]);
text.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Log.i("clicked", "tushar");
}
});
return text;
}
}
Android:popupBackground="#00000000"
au SpinnergetDropDownView();
parentParams = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, (int) Utils.convertDpToPx(350));
parentParams.gravity = Gravity.BOTTOM;
parent.setLayoutParams(parentParams);
Android:dropDownVerticalOffset="60dp"
Vous pouvez utiliser cette bibliothèque impressionnante MaterialSpinner qui fera tout le travail dur pour vous.
Télécharger: implementation 'com.jaredrummler:material-spinner:1.3.1'
fileName.xml :
<com.jaredrummler.materialspinner.MaterialSpinner
Android:id="@+id/spinner"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
app:ms_dropdown_max_height="400dp"/>
définir la hauteur à l'aide de app:ms_dropdown_max_height="400dp"