24 اسفند 1397 ساعت 13:44

آموزش ایجاد لیست ویو ListView سفارشی در اندروید

در این آموزش برنامه ای (Listview) ایجاد خواهیم کرد که شامل لیستی حاوی توضیحات و یک ایکن می باشد، که با کلیک بر روی هر ردیف یک SnackBar محتوی متن و  توضیحات آن ردیف نمایش داده خواهد شد.

با سلام در این آموزش قصد داریم با استفاده از CustomAdapter یک ListView سفارشی در اندروید ایجاد کنیم، پس تا انتهای مطلب با ما همراه باشید.

ListView سفارشی یا Custom چیست؟

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

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

 

در این آموزش برنامه ای ایجاد خواهیم کرد که شامل لیستی می باشد که شامل توضیحات و یک ایکن می باشد و با کلیک بر روی هر ردیف یک SnackBar محتوی متن و  توضیحات آن ردیف نمایش داده خواهد شد.

 

روش ایجاد ListView:

ابتدا یک فایلxml  با نام row_item.xml  در پوشه layout ایجاد و کدهای زیر را در آن قرار دهید:

 

RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="10dp">

    <TextView
        android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:text="Marshmallow"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:textColor="@android:color/black" />


    <TextView
        android:id="@+id/type"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/name"
        android:layout_marginTop="5dp"
        android:text="Android 6.0"
        android:textColor="@android:color/black" />

    <ImageView
        android:id="@+id/item_info"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:src="@android:drawable/ic_dialog_info" />


    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true">

        <TextView
            android:id="@+id/version_heading"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="API: "
            android:textColor="@android:color/black"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/version_number"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="23"
            android:textAppearance="?android:attr/textAppearanceButton"
            android:textColor="@android:color/black"
            android:textStyle="bold" />

    </LinearLayout>

</RelativeLayout>

 

ساختار پروژه بصورت زیر می باشد:

 

 

حال فایل main_activity.xml پروژه خود را بصورت زیر تغییردهید (در این آموزش فایل xml اصلی با نام content_main.xml صدا زده می شود) :

 

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context="com.journaldev.customlistview.MainActivity"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:showIn="@layout/activity_main">

    <ListView
        android:id="@+id/list"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

</RelativeLayout>

 

حال برای ایجاد یک ArrayAdapter سفارشی یک کلاس با نام DataModel ایجاد خواهیم کرد و سپس کدهای زیر را در آن قرار خواهیم داد:

public class DataModel {

    String name;
    String type;
    String version_number;
    String feature;

    public DataModel(String name, String type, String version_number, String feature ) {
        this.name=name;
        this.type=type;
        this.version_number=version_number;
        this.feature=feature;

    }

    public String getName() {
        return name;
    }
    
    public String getType() {
        return type;
    }
    
    public String getVersion_number() {
        return version_number;
    }
    
    public String getFeature() {
        return feature;
    }
    
}

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

 

حال برای ایجاد آداپتور سفارشی که DataModel  را به listView متصل کند کلاسی با نام CustomAdapter.java ایجاد و کدهای زیر را در آن قرار می دهیم:

این کلاس از ArrayAdapter ارث بری میکند که برای ایجاد لیست از  کلاس DataModel استفاده خواهد کرد.


public class CustomAdapter extends ArrayAdapter<DataModel> implements View.OnClickListener{

    private ArrayList<DataModel> dataSet;
    Context mContext;

    // View lookup cache
    private static class ViewHolder {
        TextView txtName;
        TextView txtType;
        TextView txtVersion;
        ImageView info;
    }

    public CustomAdapter(ArrayList<DataModel> data, Context context) {
        super(context, R.layout.row_item, data);
        this.dataSet = data;
        this.mContext=context;

    }

    @Override
    public void onClick(View v) {

        int position=(Integer) v.getTag();
        Object object= getItem(position);
        DataModel dataModel=(DataModel)object;

        switch (v.getId())
        {
            case R.id.item_info:
                Snackbar.make(v, "Release date " +dataModel.getFeature(), Snackbar.LENGTH_LONG)
                        .setAction("No action", null).show();
                break;
        }
    }

    private int lastPosition = -1;

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // Get the data item for this position
        DataModel dataModel = getItem(position);
        // Check if an existing view is being reused, otherwise inflate the view
        ViewHolder viewHolder; // view lookup cache stored in tag

        final View result;

        if (convertView == null) {

            viewHolder = new ViewHolder();
            LayoutInflater inflater = LayoutInflater.from(getContext());
            convertView = inflater.inflate(R.layout.row_item, parent, false);
            viewHolder.txtName = (TextView) convertView.findViewById(R.id.name);
            viewHolder.txtType = (TextView) convertView.findViewById(R.id.type);
            viewHolder.txtVersion = (TextView) convertView.findViewById(R.id.version_number);
            viewHolder.info = (ImageView) convertView.findViewById(R.id.item_info);

            result=convertView;

            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
            result=convertView;
        }

        Animation animation = AnimationUtils.loadAnimation(mContext, (position > lastPosition) ? R.anim.up_from_bottom : R.anim.down_from_top);
        result.startAnimation(animation);
        lastPosition = position;

        viewHolder.txtName.setText(dataModel.getName());
        viewHolder.txtType.setText(dataModel.getType());
        viewHolder.txtVersion.setText(dataModel.getVersion_number());
        viewHolder.info.setOnClickListener(this);
        viewHolder.info.setTag(position);
        // Return the completed view to render on screen
        return convertView;
    }
}
In the above code we’ve added a onClickList

 

 

در کد بالا ما یک inClickListener را به ImageView اضافه کردیم که یک SnackBar که شامل توضیح هر ردیف می باشد را نمایش خواهد داد.

متد getView() متدی می باشد که موقعیت هر ردیف را در listview برای ما ایجاد و نمایش می دهد.

همچینین با استفاده از xml برای لیست تعریف خواهیم کرد که هنگامی که لیست به سمت بالا یا پایین حرکت می کند این کار با انیمیشن انجام شود.

 

برای ایجاد انیمیشن در فایل res یک پوشه بنام anim ایجاد و سپس درون این فایل یک فایل xml بنام down_from_top.xml ایجاد و محتویات آن را مطابق زیر تغییر دهید:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="@android:anim/decelerate_interpolator">
    <translate
        android:fromXDelta="0%" android:toXDelta="0%"
        android:fromYDelta="-100%" android:toYDelta="0%"
        android:duration="400" />
</set>

حال فایل دیگری در پوشه anim ایجاد و نام آن را up_from_bottom.xml و کد های زیر را در آن قرار دهید:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="@android:anim/decelerate_interpolator">
    <translate
        android:fromXDelta="0%" android:toXDelta="0%"
        android:fromYDelta="100%" android:toYDelta="0%"
        android:duration="400" />
</set>

دو فایل   down_from_top.xml و up_from_bottom.xml برای ایجاد انیمیشن و متحرک سازی ایتم ها در هنگام بالا و یا پایین کشیدن لیست می باشد.

حال محتویات فایل MainActivity.java مطابق زیر میباشد

در این فایل ابتدا کلاس DataModel تعریف و سپس نمونه های به آن افزوده شد و سپس برای ایجاد list از کلاس سفارشی ایجاد شده یعنی CustomAdapter استفاده شده است.


public class MainActivity extends AppCompatActivity {

    ArrayList<DataModel> dataModels;
    ListView listView;
    private static CustomAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        listView=(ListView)findViewById(R.id.list);

        dataModels= new ArrayList<>();

        dataModels.add(new DataModel("Apple Pie", "Android 1.0", "1","September 23, 2008"));
        dataModels.add(new DataModel("Banana Bread", "Android 1.1", "2","February 9, 2009"));
        dataModels.add(new DataModel("Cupcake", "Android 1.5", "3","April 27, 2009"));
        dataModels.add(new DataModel("Donut","Android 1.6","4","September 15, 2009"));
        dataModels.add(new DataModel("Eclair", "Android 2.0", "5","October 26, 2009"));
        dataModels.add(new DataModel("Froyo", "Android 2.2", "8","May 20, 2010"));
        dataModels.add(new DataModel("Gingerbread", "Android 2.3", "9","December 6, 2010"));
        dataModels.add(new DataModel("Honeycomb","Android 3.0","11","February 22, 2011"));
        dataModels.add(new DataModel("Ice Cream Sandwich", "Android 4.0", "14","October 18, 2011"));
        dataModels.add(new DataModel("Jelly Bean", "Android 4.2", "16","July 9, 2012"));
        dataModels.add(new DataModel("Kitkat", "Android 4.4", "19","October 31, 2013"));
        dataModels.add(new DataModel("Lollipop","Android 5.0","21","November 12, 2014"));
        dataModels.add(new DataModel("Marshmallow", "Android 6.0", "23","October 5, 2015"));

        adapter= new CustomAdapter(dataModels,getApplicationContext());

        listView.setAdapter(adapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                DataModel dataModel= dataModels.get(position);

                Snackbar.make(view, dataModel.getName()+"\n"+dataModel.getType()+" API: "+dataModel.getVersion_number(), Snackbar.LENGTH_LONG)
                        .setAction("No action", null).show();
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

 

نتیجه نهایی:

 

شما می توانید مقادیر دلخواه خود را در کلاس DataModel تعریف و با تغییر در فایلxml لیست، آن را مطابق برنامه و سلیقه خود تغییر دهید. 

 

امیدوارم این آموزش برای شما مفید واقع شده باشه.

 

در صورتی که سوالی دارید از بخش نظرات ارسال نمایید

 

2701 admin
نظرات

برای اطلاع از پاسخ به نظر شما می توانید ایمیل یا شماره موبایل خود را وارد نمایید. *

ایمیل و شماره موبایل شما کاملا مخفی خواهد ماند و در سایت نمایش داده نخواهد شد. *

پاسخ به نظر
اگر نظری برای این مطلب ارسال شد از طریق ایمیل مرا اطلاع بده!

هنوز برای این مطلب نظری ارسال نشده است!
0