J'ai deux listes de vues, mais elles ne défilent pas. Comment puis-je corriger cela?
Voici mon layout.xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:fillViewport="true" >
<RelativeLayout
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:background="@drawable/backgrund" >
<!-- Header Starts -->
<LinearLayout
Android:id="@+id/header"
Android:layout_width="fill_parent"
Android:layout_height="40dip"
Android:layout_alignParentTop="true"
Android:background="@layout/header" >
</LinearLayout>
<!-- Header Ends -->
<!-- Footer Start -->
<TextView
Android:id="@+id/textAD"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignBottom="@+id/header"
Android:layout_alignParentRight="true"
Android:layout_marginBottom="14dp"
Android:layout_marginRight="26dp"
Android:text="Small Text"
Android:textAppearance="?android:attr/textAppearanceSmall"
Android:textColor="#FFFFFF" />
<ImageView
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_below="@+id/header"
Android:layout_gravity="center_horizontal"
Android:focusable="false"
Android:paddingBottom="5px"
Android:paddingTop="10px"
Android:src="@Android:drawable/divider_horizontal_bright" />
<View
Android:layout_width="fill_parent"
Android:layout_height="1dip"
Android:background="#000000"
Android:focusable="false" />
<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/linearLayout1"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:layout_below="@+id/header"
Android:orientation="vertical" >
<TextView
Android:id="@+id/textm"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:text="Malzemeler"
Android:textSize="20dp"
Android:textColor="#000000"/>
<EditText
Android:id="@+id/editaramalzeme"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:ems="10" />
<Button
Android:id="@+id/btnmalzlist"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:focusable="false"
Android:text="Ara" />
<ListView
Android:id="@+id/mylist"
Android:layout_width="match_parent"
Android:layout_height="420dp"
Android:layout_weight="1"
Android:background="#FFFFFF" >
</ListView>
<ListView
Android:id="@+id/listsecili"
Android:layout_width="wrap_content"
Android:layout_height="210dp"
Android:layout_weight="1"
Android:background="#FFFFFF" >
</ListView>
<EditText
Android:id="@+id/txtNot"
Android:layout_width="match_parent"
Android:layout_height="88dp"
Android:ems="10"
Android:gravity="top"
Android:inputType="textMultiLine"
Android:lines="6"
Android:singleLine="false" >
<requestFocus />
</EditText>
</LinearLayout>
<Button
Android:id="@+id/btnkaydet"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignParentLeft="true"
Android:layout_below="@+id/linearLayout1"
Android:text="malzeme ekle" />
<Button
Android:id="@+id/btntoplugonder"
style="?android:attr/buttonStyleSmall"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignRight="@+id/textAD"
Android:layout_below="@+id/btnkaydet"
Android:text="toplu gonder" />
</RelativeLayout>
</ScrollView>**
Ne mettez jamais ListView
dans ScrollView
. ListView
lui-même est scrollable.
Par défaut, ListView peut défiler. Ne mettez pas ScrollView à la liste
Pratiquement ce n'est pas bon à faire. Mais si vous voulez faire cela, fixez simplement wrap_content à la hauteur de listview.
Android:layout_height="wrap_content"
Vous ne devez pas placer un ListView dans un ScrollView car la classe ListView implémente son propre défilement et ne reçoit tout simplement pas de gestes, car ils sont tous gérés par le parent ScrollView
Ceci est mon code de travail. vous pouvez essayer avec ça.
row.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/listEmployeeDetails"
Android:layout_height="match_parent"
Android:layout_width="match_parent"
Android:layout_marginTop="5dp"
Android:layout_marginBottom="5dp"
Android:layout_gravity="center"
Android:background="#ffffff">
<TextView Android:id="@+id/tvEmpId"
Android:layout_height="wrap_content"
Android:textSize="12sp"
Android:padding="2dp"
Android:layout_width="0dp"
Android:layout_weight="0.3"/>
<TextView Android:id="@+id/tvNameEmp"
Android:layout_height="wrap_content"
Android:textSize="12sp"
Android:padding="2dp"
Android:layout_width="0dp"
Android:layout_weight="0.5"/>
<TextView
Android:layout_height="wrap_content"
Android:id="@+id/tvStatusEmp"
Android:textSize="12sp"
Android:padding="2dp"
Android:layout_width="0dp"
Android:layout_weight="0.2"/>
</LinearLayout>
details.xml
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/listEmployeeDetails"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:background="@color/page_bg"
Android:orientation="vertical" >
<LinearLayout
Android:id="@+id/lLayoutGrid"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:background="@color/page_bg"
Android:orientation="vertical" >
................... others components here............................
<ListView
Android:id="@+id/listView"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:alwaysDrawnWithCache="true"
Android:dividerHeight="1dp"
Android:horizontalSpacing="3dp"
Android:scrollingCache="true"
Android:smoothScrollbar="true"
Android:stretchMode="columnWidth"
Android:verticalSpacing="3dp"
Android:layout_marginBottom="30dp">
</ListView>
</LinearLayout>
</RelativeLayout>
Classe d'adaptateur:
import Java.util.List;
import Android.app.Activity;
import Android.content.Context;
import Android.graphics.Color;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.ViewGroup;
import Android.widget.BaseAdapter;
import Android.widget.TextView;
public class ListViewAdapter extends BaseAdapter {
private Context context;
private List<EmployeeBean> employeeList;
publicListViewAdapter(Context context, List<EmployeeBean> employeeList) {
this.context = context;
this.employeeList = employeeList;
}
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
EmployeeBeanHolder holder = null;
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
row = inflater.inflate(R.layout.row, parent, false);
holder = new EmployeeBeanHolder();
holder.employeeBean = employeeList.get(position);
holder.tvEmpId = (TextView) row.findViewById(R.id.tvEmpId);
holder.tvName = (TextView) row.findViewById(R.id.tvNameEmp);
holder.tvStatus = (TextView) row.findViewById(R.id.tvStatusEmp);
row.setTag(holder);
holder.tvEmpId.setText(holder.employeeBean.getEmpId());
holder.tvName.setText(holder.employeeBean.getName());
holder.tvStatus.setText(holder.employeeBean.getStatus());
if (position % 2 == 0) {
row.setBackgroundColor(Color.rgb(213, 229, 241));
} else {
row.setBackgroundColor(Color.rgb(255, 255, 255));
}
return row;
}
public static class EmployeeBeanHolder {
EmployeeBean employeeBean;
TextView tvEmpId;
TextView tvName;
TextView tvStatus;
}
@Override
public int getCount() {
return employeeList.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
}
classe de haricot employé:
public class EmployeeBean {
private String empId;
private String name;
private String status;
public EmployeeBean(){
}
public EmployeeBean(String empId, String name, String status) {
this.empId= empId;
this.name = name;
this.status = status;
}
public String getEmpId() {
return empId;
}
public void setEmpId(String empId) {
this.empId= empId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status =status;
}
}
en classe d'activité:
méthode onCreate:
public static List<EmployeeBean> EMPLOYEE_LIST = new ArrayList<EmployeeBean>();
//create emplyee data
for(int i=0;i<=10;i++) {
EmployeeBean emplyee = new EmployeeBean("EmpId"+i,"Name "+i, "Active");
EMPLOYEE_LIST .add(emplyee );
}
ListView listView;
listView = (ListView) findViewById(R.id.listView);
listView.setAdapter(new ListViewAdapter(this, EMPLOYEE_LIST));
Listview a donc des capacités de défilement intégrées. Donc, vous ne pouvez pas utiliser listview dans scrollview. Encapsulez-le dans n’importe quelle autre disposition, comme LinearLayout ou RelativeLayout.
Mettre ListView
dans une ScrollView
n'est jamais inspiré . Mais si vous voulez que votre comportement ressemble à XML, il y a 3 options pour moi:
Supprimer ScrollView
: En supprimant votre ScrollView
, vous pouvez attribuer à la ListView
s une taille spécifique par rapport à la présentation totale (soit la dp
soit le layout_weight
).
Remplacer ListView
s par LinearLayout
s: Vous pouvez ajouter les éléments de la liste en parcourant la liste des éléments, puis ajouter chaque vue de l'élément à la LinearLayout
correspondante en gonflant la vue et en définissant les données respectives (chaîne, image, etc.).
Si vous devez vraiment placer vos ListView
s dans la ScrollView
, vous devez rendre votre ListView
s non défilable (ce qui est pratiquement identique à la solution 2 ci-dessus, mais avec les codes ListView
), sinon la présentation ne fonctionnera pas comme prévu.
Pour rendre une ListView
non-scrollable, vous pouvez lire ce SO post , où la solution précise m'est semblable à celle ci-dessous:
listView.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
return (event.getAction() == MotionEvent.ACTION_MOVE);
}
});
Je sais que cette question a 4-5 ans, mais ça pourrait être utile:
Parfois, si vous ne disposez que de quelques éléments qui "quittent l'écran", la liste peut ne pas défiler. En effet, le système d'exploitation ne le voit pas comme dépassant réellement l'écran.
Je dis cela parce que j'ai rencontré ce problème aujourd'hui - je n'avais que 2 ou 3 éléments dépassant les limites de l'écran et ma liste ne pouvait pas défiler. Et c'était un vrai mystère. Dès que j'ai ajouté quelques autres, il a commencé à défiler.
Donc, vous devez vous assurer que ce n'est pas un problème de conception au début, comme la liste qui semble dépasser les limites de l'écran, mais en réalité, "ce n'est pas", et ajuster ses dimensions et ses valeurs de marge et voir si cela commence à "devenir scrollable". Ça l'a fait pour moi.
J'ai trouvé une solution délicate ... qui ne fonctionne que dans un RelativeLayout . Il suffit de placer une vue au-dessus d'une liste et de définir "vrai" sur View et faux pour le ListView
<ListView
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:id="@+id/listview
Android:clickable="false" />
<View
Android:layout_width="match_parent"
Android:background="@drawable/gradient_white"
Android:layout_height="match_parent"
Android:clickable="true"
Android:layout_centerHorizontal="true"
Android:layout_alignTop="@+id/listview" />