کار با ExpandableListView  در اندروید

منتشرشده توسط حامد قنبری در تاریخ

ExpandableListView  از ویوهای قابل نمایش در اندروید است که به وسیله  آن  می توان هریک از آیتم ها ی قابل انتخاب از موضوعی را که بعنوان والد وهدر آن آیتم ها شناخته می شود در قالب یک لیست  مجزا و قابل پیمایش به کاربران نشان داد. در واقع هر گروه را می توان به صورت جداگانه به آیتم های متعددی توسعه داد که در صورت کلیک کاربر بر روی آن گروه ها، زیر گروه ها یا آیتم های مربوط به آن بصورت کشویی ظاهر می شود . بعبارت ساده تر ، ExpandableListView  برای گروه بندی داده ها بر اساس دسته بندی های متنوع استفاده می شود و وقتی کاربر هدر را لمس کند  این قابلیت باعث نمایان شدن  آیتم های مربوط به آن گروه  می شود.

به منظور درک بهتر موضوع مثالی برای دوستان آماده کرده ایم که امیداوریم مفید واقع شده باشد.

اگر در داخل برنامه اکلیپس یا اندروید استودیو قرار دارید پروژه جدیدی را  ایجاد کنید

اکلیپس :File ⇒ New Android ⇒ Application Project

اندروید استودیو :File ⇒ New  ⇒ New Project

اما اگر هنوز برنامه خود را باز نکرده اید یکی از برنامه های فوق را باز نموده و بعد از تعیین مشخصات(نامگذاری) ، تعیین حداقل sdk  و نوع اکتیویتی (blank  یا Empty) ، نام اکتیویتی ابتدایی و اصلی خود  را همان MainActivity قرار دهید. بعد از لود کامل برنامه ، در مسیر res ⇒layout لایه متناظر اکتیوتی اصلی یعنی activity_main را پیدا نمود و کدهای مندرج و پیش فرض آن را پاک کرده و کدهای 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="fill_parent"
    android:orientation="vertical"
    android:background="#f77e7e" >

    <ExpandableListView
        android:id="@+id/Expandablelist"
        android:layout_height="match_parent"
        android:layout_width="match_parent"/>

</LinearLayout>

به منظور نشان دادن header  یا گروه های ExpandableListView لازم است لایه xml  دیگر را با عنوان group.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="8dp"
    android:background="#000000">


    <TextView
        android:id="@+id/Headers"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="?android:attr/expandableListPreferredItemPaddingLeft"
        android:textSize="16dp"
        android:textColor="#64e0ff" />

</LinearLayout>

یک فایل XML دیگر با نام list_item.xml برای  نشان دادن لیست آیتم ها ایجاد کنید که دارای یک عنصر TextView خواهد بود.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="55dip"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/lblListItem"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textSize="14dip"
        android:paddingTop="3dp"
        android:paddingBottom="4dp"
        android:paddingLeft="?android:attr/expandableListPreferredChildPaddingLeft" />

</LinearLayout>

 

برای ایجاد نمای لیست از یک کلاس آداپتور استفاده می کنیم . بدین منظور یک کلاس جدید به نام ExpandableListAdapter.java ایجاد کنید و آن را به نوع BaseExpandableListAdapter گسترش دهید. این کلاس روش های مورد نیاز برای نمایش listview را فراهم می کند.

توجه کنید که ما از دو متد:

()getGroupView  –  برای نمایش هدر لیست

()getChildView  –  برای نمایش آیتم های هریک از هدرها یا گروه ها استفاده می کنیم.

package ir.psrd.example.ExpandableList;

/**
 * Created by h.ghanbari on 20/01/2018.
 */

import android.content.Context;
import android.graphics.Typeface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.TextView;

import java.util.HashMap;
import java.util.List;

public class AdapterExpandableList extends BaseExpandableListAdapter {

    private Context _context;
    private List<String> _listDataHeader; // header titles
    // child data in format of header title, child title
    private HashMap<String, List<String>> _listDataChild;

    public AdapterExpandableList(Context context, List<String> listDataHeader,
                                 HashMap<String, List<String>> listChildData) {
        this._context = context;
        this._listDataHeader = listDataHeader;
        this._listDataChild = listChildData;
    }

    @Override
    public Object getChild(int groupPosition, int childPosititon) {
        return this._listDataChild.get(this._listDataHeader.get(groupPosition))
                .get(childPosititon);
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }

    @Override
    public View getChildView(int groupPosition, final int childPosition,
                             boolean isLastChild, View convertView, ViewGroup parent) {

        final String childText = (String) getChild(groupPosition, childPosition);

        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) this._context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.list_item, null);
        }

        TextView txtListChild = (TextView) convertView
                .findViewById(R.id.lblListItem);

        txtListChild.setText(childText);
        return convertView;
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return this._listDataChild.get(this._listDataHeader.get(groupPosition))
                .size();
    }

    @Override
    public Object getGroup(int groupPosition) {
        return this._listDataHeader.get(groupPosition);
    }

    @Override
    public int getGroupCount() {
        return this._listDataHeader.size();
    }

    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
                             View convertView, ViewGroup parent) {
        String headerTitle = (String) getGroup(groupPosition);
        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) this._context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.group, null);
        }

        TextView lblListHeader = (TextView) convertView
                .findViewById(R.id.Headers);
        lblListHeader.setTypeface(null, Typeface.BOLD);
        lblListHeader.setText(headerTitle);

        return convertView;
    }

    @Override
    public boolean hasStableIds() {
        return false;
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }
}

حال کلاس اصلی خود یعنی MainActivity.java را باز کرده و کدهای زیر را در آن قرار می دهیم.

package ir.psrd.example.ExpandableList;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ExpandableListView;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class MainActivity extends Activity {

    AdapterExpandableList listAdapter;
    ExpandableListView expListView;
    List<String> listDataHeader;
    HashMap<String, List<String>> listDataChild;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // get the listview
        expListView = (ExpandableListView) findViewById(R.id.Expandablelist);

        // preparing list data
        prepareListData();

        listAdapter = new AdapterExpandableList(this, listDataHeader, listDataChild);

        // setting list adapter
        expListView.setAdapter(listAdapter);
    }

    /*
     * Preparing the list data
     */
    private void prepareListData() {
        listDataHeader = new ArrayList<String>();
        listDataChild = new HashMap<String, List<String>>();

        // Adding child data
        listDataHeader.add("بهترین فیلم های جشنواره");
        listDataHeader.add("بهترین کارگردانان");
        listDataHeader.add("بهترین بازیگران");

        // Adding child data
        List<String> films = new ArrayList<String>();
        films.add("سربداران");
        films.add("خواب و بیدار");
        films.add("دزد و پلیس");
        films.add("پاورچین");
        films.add("محکومین");
        films.add("لیسانسه ها");
        films.add("آژانس دوستی");

        List<String> Directors = new ArrayList<String>();
        Directors.add("ابراهیم حاتمی کیا");
        Directors.add("مهران مدیری");
        Directors.add("مهران غفوریان");
        Directors.add("علی شاه حاتمی");
        Directors.add("مسعود ده نمکی");
        Directors.add("سعیدآقاخانی");

        List<String> Actors = new ArrayList<String>();
        Actors.add("جواد رضویان");
        Actors.add("رضا عطاران");
        Actors.add("شهاب حسینی");
        Actors.add("مهناز افشار");
        Actors.add("رضا شفیعی جم");

        listDataChild.put(listDataHeader.get(0), films); // Header, Child data
        listDataChild.put(listDataHeader.get(1), Directors);
        listDataChild.put(listDataHeader.get(2), Actors);
    }
}

 

حال پروژه را اجرا کرده و از آن در آموزش هر چه بیشتر خود استفاده کنید. اگر مشکلی در اجرای کدها وجود دارد یا سوال مشخصی از نویسنده سایت دارید سوالات خود را در قسمت دیدگاه ها بیان کنید.

کپی برداری از محتوای سایت psrd، ممنوع بوده و پیگرد قانونی دارد. (تنها استفاده شخصی کاربران ، مجاز است) (کپی برداری توسط سایر وب سایت ها  غیرقانونی بوده و در صورت رویت به ستادسازماندهی اطلاع داده خواهد شد.

 

 

 

 

 

 

 

 

 

 

 


3 دیدگاه

نیما · می 7, 2018 در 1:57 ب.ظ

سلام دوست عزیز در صورت امکان همین سورس هارا با خواندن اطلاعات از دیتابیس قرار بدین به این صورت که اطلاعات گروه را از یک جدول و اطلاعات زیر گروه را از جدول دیگر بخواند.
خیلی ممنون و متشکر و دستتون درد نکنه که به دیگران در مسیر یادگیری کمک میکنید زنده باشید.

    حامد قنبری · آگوست 24, 2018 در 1:05 ب.ظ

    ممنونم. حتماً

مسلم · سپتامبر 20, 2018 در 7:48 ق.ظ

سلام
اگه میشه ارتباط با سرورشم بزارین خیلی ممنون

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

-- بارگیری کد امنیتی --