دوره‌ای که می‌تونه مسیر شغلیت رو عوض کنه! دوره‌ای که می‌تونه مسیر شغلیت رو عوض کنه!
🎯 ثبت نام

‏ آموزش نحوه ی استفاده از ‏List‏ در اندروید-بهینه سازی کارایی آداپتور اندروید

 

clip_image001

دوره آموزش برنامه نویسی اندروید

کلیه حقوق مادی و معنوی این مقاله متعلق به آموزشگاه تحلیل داده می باشد و هر گونه استفاده غیر قانونی از آن پیگرد قانونی دارد.

 

 

آموزش نحوه ی استفاده از ‏List‏ در اندروید قسمت سوم

 12. بهینه سازی کارایی

برنامه ی زیر نسخه ی بهینه سازی شده ی آداپتور را از مثال پیشین بکار می برد. کلاس MyPerformanceArrayAdapter را مشابه کد زیر ایجاد کنید.

package de.vogella.android.listactivity;
import android.app.Activity;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.ArrayAdapter;

import android.widget.ImageView;

import android.widget.TextView;

public class MyPerformanceArrayAdapter extends ArrayAdapter<String> {

 
private final Activity context;
 
private final String[] names;
 
static class ViewHolder {
   
public TextView text;
   
public ImageView image;
  }

 
public MyPerformanceArrayAdapter(Activity context، String[] names) {
   
super(context، R.layout.rowlayout، names);
   
this.context = context;
   
this.names = names;
  }

  @Override
 
public View getView(int position، View convertView، ViewGroup parent) {
    View rowView = convertView;

   
// reuse views
   
if (rowView == null) {
      LayoutInflater inflater = context.getLayoutInflater();

      rowView = inflater.inflate(R.layout.rowlayout،
null);
     
// configure view holder
      ViewHolder viewHolder =
new ViewHolder();
      viewHolder.text = (TextView) rowView.findViewById(R.id.TextView01);

      viewHolder.image = (ImageView) rowView
         .findViewById(R.id.ImageView01);

      rowView.setTag(viewHolder);

    }

   
// fill data
    ViewHolder holder = (ViewHolder) rowView.getTag();

   
String s = names[position];
    holder.text.setText(s);

   
if (s.startsWith("Windows7") || s.startsWith("iPhone")
        || s.startsWith(
"Solaris")) {
      holder.image.setImageResource(R.drawable.no);

    }
else {
      holder.image.setImageResource(R.drawable.ok);

    }

   
return rowView;
  }

}

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

package de.vogella.android.listactivity;
import android.app.ListActivity;

import android.os.Bundle;

public class MyListActivity extends ListActivity {

 
public void onCreate(Bundle icicle) {
   
super.onCreate(icicle);
   
String[] values = new String[] { "Android"
، "iPhone"، "WindowsMobile"،
       
"Blackberry"، "WebOS"، "Ubuntu"، "Windows7"، "Max OS X"،
       
"Linux"، "OS/2" };
    setListAdapter(
new MyPerformanceArrayAdapter(this، values));
  }

}

13. آموزش نحوه ی نمایش دو آیتم به صورت همزمان در یک ListView

می توان با استفاده از کلاس SimpleAdapter داده های دو المان را نمایش داد. این کلاس به آرایه ای از رشته ها (Array of Strings) (داده from) نیاز دارد که در آن فیلدهای داده ورودی (input data) تعریف می شوند. کلاس ذکر شده همچنین به آرایه ای از int ها نیاز دارد که شناسه ی ابزارک ها را در layout برای سطری که این فیلدها به آن نگاشت می شوند، تعریف می کند. داده های واقعی در حقیقت فهرستی از نگاشت ها (Maps) است.  Map به ازای هر فیلد یک مقدار در داده ی from تعریف می کند.

کد زیر مثالی را نمایش می دهد که در آن layout از پیش تعریف شده ای برای سطر گفته شده دوباره بکار گرفته می شود.

package de.vogella.android.listactivity;
import java.util.ArrayList;

import java.util.HashMap;

import java.util.Map;

import android.app.ListActivity;

import android.os.Bundle;

import android.widget.SimpleAdapter;

public class MyTwoListItemsActivity extends ListActivity {

 
protected void onCreate(Bundle savedInstanceState) {
   
super.onCreate(savedInstanceState);
    ArrayList<Map<
String، String>> list = buildData();
   
String[] from = { "name"، "purpose" };
    int[] to = { android.R.id.text1، android.R.id.text2 };

    SimpleAdapter adapter =
new SimpleAdapter(this، list،
        android.R.layout.simple_list_item_2،
from، to);
    setListAdapter(adapter);

  }

 
private ArrayList<Map<String، String>> buildData() {
    ArrayList<Map<
String، String>> list = new ArrayList<Map<String، String>>();
    list.add(putData(
"Android"، "Mobile"));
    list.add(putData(
"Windows7"، "Windows7"));
    list.add(putData(
"iPhone"، "iPhone"));
   
return list;
  }

 
private HashMap<String، String> putData(String name، String purpose) {
    HashMap<
String، String> item = new HashMap<String، String>();
    item.put(
"name"، name);
    item.put(
"purpose"، purpose);
   
return item;
  }

  }

14. انتخاب چندین آیتم در ListView

ارتباط و تعامل بین مدل و ListView

بدیهی است که شما پی در پی نیاز دارید، آیتم ها را در ListView انتخاب کنید. از آن جایی که سطرهای ListView در حال بازیابی (recycle) شدن هستند، شما قادر نخواهید بود selection (انتخاب) را در سطح View ذخیره کنید.

 

listView با تعامل و مدل کامل

Selection تنها یک نمونه است و شما می توانید تعاملات بسیار دیگری بین سطر و مدل تصور کنید.

جهت ماندگار کردن selection، لازم است مدل داده ای را با وضعیت انتخاب شده تطبیق (update) دهید.

برای این منظور (بروز رسانی مدل داده در ListView) باید کلاس Adapter خود را تعریف کنید. حال در کلاس مذکور یک گوش فراخوان (listener) به View الصاق می کنید که مسئولیت انتخاب المان های مدل را بر عهده دارد. در صورت انتخاب، وضعیت مدل بروز رسانی می شود. اکنون می توانید آن را به عنوان یک تگ به View اضافه کرده تا بدان دسترسی پیدا داشته باشید.

 آموزش : Domain Model و Rows interaction

در این بخش همچنان از پروژه ی  de.vogella.android.listactivityاستفاده کنید.

Model زیر را که حامل اسم و اطلاعات لازمه می باشد ایجاد کنید.

package de.vogella.android.listactivity;
public class Model {

 
private String name;
 
private boolean selected;
 
public Model(String name) {
   
this.name = name;
    selected =
false;
  }

 
public String getName() {
   
return name;
  }

 
public void setName(String name) {
   
this.name = name;
  }

 
public boolean isSelected() {
   
return selected;
  }


 
public void setSelected(boolean selected) {
   
this.selected = selected;
  }

}

 فایل layout جدیدی به نام rowbuttonlayout.xml ایجاد کنید.

<?xml version="1.0" encoding="utf-8" ?>

‎‎<relativelayout xmlns:android="http://schemas.android.com/apk/res/android"

                 android:layout_width="match_parent"

                 android:layout_height="wrap_content">

        <textview android:id="@+id/label"

                    android:layout_width="wrap_content"

                    android:layout_height="wrap_content"

                    android:text="@+id/label"

                    android:textsize="30px">

            </TextView>

            <checkbox android:id="@+id/check"

                        android:layout_width="wrap_content"

                        android:layout_height="wrap_content"

                        android:layout_alignparentright="true"

                        android:layout_marginleft="4px"

                        android:layout_marginright="10px">

                </CheckBox>

</relativelayout>

Adapter زیر را ایجاد کنید. آداپتور مزبور یک گوش فراخوان به Checkbox view اضافه می کند. در صورت انتخاب checkbox داده ی زیربنا مدل تغییر می یابد. checkbox المان مدل مربوطه را با فراخوانی متد getTag () تخصیص می دهد.

package de.vogella.android.listactivity;
import java.util.List;

import android.app.Activity;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.ArrayAdapter;

import android.widget.CheckBox;

import android.widget.CompoundButton;

import android.widget.TextView;

public class InteractiveArrayAdapter extends ArrayAdapter<Model> {

 
private final List<Model> list;
 
private final Activity context;
 
public InteractiveArrayAdapter(Activity context، List<Model> list) {
   
super(context، R.layout.rowbuttonlayout، list);
   
this.context = context;
   
this.list = list;
  }

 
static class ViewHolder {
   
protected TextView text;
   
protected CheckBox checkbox;
  }

  @Override
 
public View getView(int position، View convertView، ViewGroup parent) {
    View view =
null;
   
if (convertView == null) {
      LayoutInflater inflator = context.getLayoutInflater();

      view = inflator.inflate(R.layout.rowbuttonlayout،
null);
      final ViewHolder viewHolder =
new ViewHolder();
      viewHolder.text = (TextView) view.findViewById(R.id.label);

      viewHolder.checkbox = (CheckBox) view.findViewById(R.id.check);

      viewHolder.checkbox
         .setOnCheckedChangeListener(
new CompoundButton.OnCheckedChangeListener() {
            @Override
           
public void onCheckedChanged(CompoundButton buttonView،
                boolean isChecked) {

              Model element = (Model) viewHolder.checkbox
                 .getTag();

              element.setSelected(buttonView.isChecked());

            }

          });

      view.setTag(viewHolder);

      viewHolder.checkbox.setTag(list.get(position));

    }
else {
      view = convertView;

      ((ViewHolder) view.getTag()).checkbox.setTag(list.get(position));

    }

    ViewHolder holder = (ViewHolder) view.getTag();

    holder.text.setText(list.get(position).getName());

    holder.checkbox.setChecked(list.get(position).isSelected());

   
return view;
  }

}

در مرحله ی پایانی activity خود را مطابق با کد زیر اصلاح کنید.

package de.vogella.android.listactivity;
import java.util.ArrayList;

import java.util.List;

import android.app.ListActivity;

import android.os.Bundle;

import android.widget.ArrayAdapter;

public class MyList extends ListActivity {

/** Called when the activity is first created. */
 
public void onCreate(Bundle icicle) {
   
super.onCreate(icicle);
   
// create an array of Strings، that will be put to our ListActivity

    ArrayAdapter<Model> adapter =
new InteractiveArrayAdapter(this،
        getModel());

    setListAdapter(adapter);

  }

 
private List<Model> getModel() {
    List<Model> list =
new ArrayList<Model>();
    list.add(get(
"Linux"));
    list.add(get(
"Windows7"));
    list.add(get(
"Suse"));
    list.add(get(
"Eclipse"));
    list.add(get(
"Ubuntu"));
    list.add(get(
"Solaris"));
    list.add(get(
"Android"));
    list.add(get(
"iPhone"));
   
// Initially select one of the items
    list.get(
1).setSelected(true);
   
return list;
  }

 
private Model get(String s) {
   
return new Model(s);
  }

}

اگر برنامه ی خود را اجرا کنید، می توانید آیتم ها را علامت گذاری (flag) کنید. تغییرات بوجود آمده در مدل شما به نمایش گذاشته می شود.

15. پیاده سازی ExpandableListView

ExpandableListView

ExpandableListView به منظور گروه بندی داده های لیست در رده ها (category) ی مختلف بکار می رود. وییو مورد نظر این قابلیت را دارد که در صورت کلیک روی سرایند (توسط کابر)، گروها بسط داده می شوند.

 ExpandableListView به آداپتوری از نوع BaseExpandableList نیاز دارد.

در مثالی که پیش رو دارید دو layout تعریف می کنید که یکی به گروه (group) و دیگری به سطر جزئیات (detail row) تعلق می گیرد.

مثالی از ExpandableListView

در مثال زیر یک expandablelistview مشابه تصویر زیر ایجاد می کنید.

ExpandableListView

 

برای این تمرین پروژه ای به نام com.vogella.android.listview.expandable ایجاد کرده و activity آن را MainActivity نام گذاری کنید.

فایل های layout زیر را ایجاد کنید. ابتدا فایل layout/activity_main.xml را ایجاد کنید.

1394/07/27 4272 3036
رمز عبور : tahlildadeh.com یا www.tahlildadeh.com
نظرات شما

نظرات خود را ثبت کنید...