web-dev-qa-db-fra.com

Comment faire défiler Android listview?

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>**
22
ozi

Ne mettez jamais ListView dans ScrollView. ListView lui-même est scrollable.

65
AndroidLearner

Par défaut, ListView peut défiler. Ne mettez pas ScrollView à la liste

11
Prasanna

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"
6
Dhrupal

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

4
Ram kiran

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));
3
Md. Kamruzzaman

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.

3
Yashdeep Patel

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:

  1. Supprimer ScrollView: En supprimant votre ScrollView, vous pouvez attribuer à la ListViews une taille spécifique par rapport à la présentation totale (soit la dp soit le layout_weight).

  2. Remplacer ListViews par LinearLayouts: 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.).

  3. Si vous devez vraiment placer vos ListViews dans la ScrollView, vous devez rendre votre ListViews 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);
  }
});

2
Touhid

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.

1
Robert Ruxandrescu

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" />
0
Tropp