PDA

View Full Version : راهنمایی در طراحی ListView



slr560
سه شنبه 07 مرداد 1393, 06:53 صبح
سلام دوستان .
بعد از اینکه UI خودم به صورت لی اوت بندی و تک تک ساختم یه سری مشکلات پیش اومد
الان میخوام از لیست استفاده کنم

این نمای یک سطر از لیست هست:

121687

شنبه تا جمعه
۷تا سطر داره

این xml یک سطر:

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


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="60dp"
style="@style/CustomStyleList">


<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:id="@+id/checkBox"/>


<TextView
android:id="@+id/day"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="شنبه"
android:layout_centerInParent="true"
android:layout_marginRight="2dp"
android:layout_toLeftOf="@id/checkBox"
style="@style/CustomTextView2"/>


<TextView
android:id="@+id/date"
android:text="23/5/2014"
android:textSize="15sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
style="@style/CustomTextView2"/>


<Spinner
android:id="@+id/food"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_toLeftOf="@id/date"
android:layout_marginRight="25dp"
style="@style/CustomTextView2"/>




</RelativeLayout>


بعدش اومدم set و get هارو تعریف کردم. به این صورت:

package ir.darabifard.daneshjo.model;




import android.widget.ArrayAdapter;


public class OtoItem {


private int chek;


private String day;


private String date;


private ArrayAdapter<String> food;


public OtoItem(int chek, String day, String date, ArrayAdapter<String> food) {
this.chek = chek;
this.day = day;
this.date = date;
this.food = food;


}


public int setChek(int num) {
return this.chek = num;


}


public int getChek() {
return this.chek;
}


public String setDays(String day) {
return this.day = day;
}


public String getDays() {
return this.day;
}


public String setDate(String date) {
return this.date = date;


}


public String getDate() {
return this.date;
}


public ArrayAdapter<String> setFood(ArrayAdapter<String> food) {
return this.food = food;
}


public ArrayAdapter<String> getFood() {
return this.food;
}
}




و در آخر آداپتور رو تعریف کردم. به این شکل:

package ir.darabifard.daneshjo.adapter;


import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.Spinner;
import android.widget.TextView;


import java.util.ArrayList;


import ir.darabifard.daneshjo.R;
import ir.darabifard.daneshjo.model.OtoItem;




public class OtoListAdapter extends BaseAdapter {


ArrayList<OtoItem> mOtoItems;


private Context mContext;


public OtoListAdapter(Context context, ArrayList<OtoItem> otoItems) {
this.mContext = context;
this.mOtoItems = otoItems;
}


@Override
public int getCount() {
return mOtoItems.size();
}


@Override
public Object getItem(int position) {
return mOtoItems.get(position);
}


@Override
public long getItemId(int position) {
return position;
}


@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) mContext
.getSystemService(mContext.LAYOUT_INFLATER_SERVICE );
convertView = inflater.inflate(R.layout.oto_list_item, null);
}


CheckBox checkBox = (CheckBox) convertView.findViewById(R.id.checkBox);
TextView day = (TextView) convertView.findViewById(R.id.day);
TextView date = (TextView) convertView.findViewById(R.id.date);
Spinner food = (Spinner) convertView.findViewById(R.id.food);


day.setText(mOtoItems.get(position).getDays());
date.setText(mOtoItems.get(position).getDate());
food.setAdapter(mOtoItems.get(position).getFood()) ;


return convertView;
}
}




آیا این کدهایی که نوشتم درسته؟ حالا چجوری این آداپتور رو بدم به لیست و مقدار بهش بدم؟
ممنون میشم راهنمایی کنین

slr560
سه شنبه 07 مرداد 1393, 10:18 صبح
یکم تغییرات دادم تو اجزای لیست ویو و اینجوری شد

121688

ولی چرا تو نصف صفحه هست؟
این آداپتورم:
package ir.darabifard.daneshjo.adapter;


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


import java.util.ArrayList;


import ir.darabifard.daneshjo.R;
import ir.darabifard.daneshjo.model.OtoItem;




public class OtoListAdapter extends BaseAdapter {


ArrayList<OtoItem> mOtoItems;
private Context mContext;


public OtoListAdapter(Context context, ArrayList<OtoItem> otoItems) {
this.mContext = context;
this.mOtoItems = otoItems;
}


@Override
public int getCount() {
return mOtoItems.size();
}


@Override
public Object getItem(int position) {
return mOtoItems.get(position);
}


@Override
public long getItemId(int position) {
return position;
}


@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) mContext
.getSystemService(mContext.LAYOUT_INFLATER_SERVICE );
convertView = inflater.inflate(R.layout.oto_list_item, null);
}


TextView day = (TextView) convertView.findViewById(R.id.day);
TextView date = (TextView) convertView.findViewById(R.id.date);
Spinner food = (Spinner) convertView.findViewById(R.id.food);


Typeface font = Typeface.createFromAsset(mContext.getAssets(), "Yekan.ttf");
day.setText(mOtoItems.get(position).getDays());
day.setTypeface(font);
date.setText(mOtoItems.get(position).getDate());
date.setTypeface(font);
food.setAdapter(mOtoItems.get(position).getFood()) ;


return convertView;
}
}




این کلاس OtoItem که get , set میکنه


package ir.darabifard.daneshjo.model;




import android.widget.ArrayAdapter;


public class OtoItem {




private String day;


private String date;


private ArrayAdapter<String> food;


public OtoItem(String day, String date) {
this.day = day;
this.date = date;
this.food = food;


}




public String setDays(String day) {
return this.day = day;
}


public String getDays() {
return this.day;
}


public String setDate(String date) {
return this.date = date;


}


public String getDate() {
return this.date;
}


public ArrayAdapter<String> setFood(ArrayAdapter<String> food) {
return this.food = food;
}


public ArrayAdapter<String> getFood() {
return this.food;
}
}




و اینم اکتویتی که لیست ویو داخلش هست:


package ir.darabifard.daneshjo;


import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;


import java.util.ArrayList;


import ir.darabifard.daneshjo.adapter.OtoListAdapter;
import ir.darabifard.daneshjo.model.OtoItem;




public class ListTest extends Activity {


OtoListAdapter mAdapter;


ListView mListView;


private String[] days;


private String[] date;


private ArrayList<OtoItem> otoItem;


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


days = getResources().getStringArray(R.array.days);
date = getResources().getStringArray(R.array.date);


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


otoItem = new ArrayList<OtoItem>();


otoItem.add(new OtoItem(days[0], date[0]));
otoItem.add(new OtoItem(days[1], date[1]));
otoItem.add(new OtoItem(days[2], date[2]));
otoItem.add(new OtoItem(days[3], date[3]));
otoItem.add(new OtoItem(days[4], date[4]));
otoItem.add(new OtoItem(days[5], date[5]));
otoItem.add(new OtoItem(days[6], date[6]));


mAdapter = new OtoListAdapter(this, otoItem);


mListView.setAdapter(mAdapter);






}
}




لی اوت لیست ویو انگار ست نشده. درسته؟ چجوری ستش کنم؟

rubiks.kde
سه شنبه 07 مرداد 1393, 12:00 عصر
دوست عزیز الان مشکل چیه؟
درست کردن ui اول یا دوم؟

slr560
سه شنبه 07 مرداد 1393, 12:03 عصر
دوست عزیز الان مشکل چیه؟
درست کردن ui اول یا دوم؟
UI دوم
یادم یه جایی به آداپتور یه آرگومان میدادیم که لی اوت لیست چجوری باش. اینجوری بود: android.R.layout.simple_list_item
نمیدونم مشکل از نزاشتن اینه یا چیزه دیگه.
اگه مشکل اینه کجا باید اضافش کنم
ممنون

akbar8298
سه شنبه 07 مرداد 1393, 16:29 عصر
UI دوم
یادم یه جایی به آداپتور یه آرگومان میدادیم که لی اوت لیست چجوری باش. اینجوری بود: android.R.layout.simple_list_item
نمیدونم مشکل از نزاشتن اینه یا چیزه دیگه.
اگه مشکل اینه کجا باید اضافش کنم
ممنون

سلام. نه دوست عزیز شما الان برای سطر ها لی اوت کاستوم ساختید و نیازی به استفاده از android.R.layout.simple_list_item ندارید. کاری که شما باید بکنید اینه که مشخصه width مربوط به TextView day رو به FILL_PARENT تغییر بدین و مقدار weight اون رو برابر 1 قراربدین. اگر دیدین کشیده شد همین کار رو برای date هم انجام بدین.

موفق باشید

slr560
سه شنبه 07 مرداد 1393, 17:32 عصر
سلام. نه دوست عزیز شما الان برای سطر ها لی اوت کاستوم ساختید و نیازی به استفاده از android.R.layout.simple_list_item ندارید. کاری که شما باید بکنید اینه که مشخصه width مربوط به TextView day رو به FILL_PARENT تغییر بدین و مقدار weight اون رو برابر 1 قراربدین. اگر دیدین کشیده شد همین کار رو برای date هم انجام بدین.

موفق باشید

نه داداش کاری به with نداره و من عرضش رو میخوام درست کنم . اونی که شما میگی طوله
و مشخصه weight هم وقتی تنظیم میکنیم چنتا ویو داشته باشیم . اینجا فقط یه سطره

slr560
سه شنبه 07 مرداد 1393, 19:06 عصر
آقا یکی راهنمایی کنه. اینقد فیلمو کلیپ تو یوتیوب سرچ کردم حجم نتم تموم شد :اشتباه:

کلاس آداپتورمو چجوری باید بنویسم؟
یه TextView روز دارم یه TextView تاریخ و یه اسپینر .
یکی خواهشا بگه من چه کدی باید تو آداپتورم بنویسم؟:افسرده:

rubiks.kde
سه شنبه 07 مرداد 1393, 22:16 عصر
دقیق بگید میخوایید چیکار کنید.ui دوم باید چه ویژگی داشته باشه.

slr560
سه شنبه 07 مرداد 1393, 22:26 عصر
دقیق بگید میخوایید چیکار کنید.ui دوم باید چه ویژگی داشته باشه.
ببینید من یه اکتیویتی دارم که میخوام یه لیست داخلش باشه . ایام هفته از شنبه تا جمعه داخلشه.

میخوام یه TextView برای ایام هفته سمت راست ٬ تاریخ وسط باشه و یک اسپینر که غذاها داخلشه سمت چپ
حالا اینجا یه نکته هست. میخوام وقتی روی یکی از سطرها کلیک شد اسپینر همون سطر فعال بشه و بشه انتخاب کرد.اسپینرها از قبل وقتی صفحه لود میشه پر میشن و فقط غیر فغال هستن. این کارو به نظرت با چک باکس انجام بدم یا اینکه خوده لیست ویو همچین قابلیتی داره که سطر انتخاب بشه؟؟
و در آخر اینکه یه باتن پایین صفحه هست که وقتی روی اون کلیک میشه آیتم اسپینر سطرهایی که انتخاب شده رو میگیره و دخیره میکنه
اصل کار اینه.
ممنون دوست عزیز

akbar8298
چهارشنبه 08 مرداد 1393, 23:33 عصر
نه داداش کاری به with نداره و من عرضش رو میخوام درست کنم . اونی که شما میگی طوله
و مشخصه weight هم وقتی تنظیم میکنیم چنتا ویو داشته باشیم . اینجا فقط یه سطره

بله شما درست می فرمائید. من سوال رو اشتباه متوجه شده بودم. عذر خواهی

اجبار هست که از لیست ویو استفاده بشه؟

slr560
چهارشنبه 08 مرداد 1393, 23:40 عصر
بله شما درست می فرمائید. من سوال رو اشتباه متوجه شده بودم. عذر خواهی

اجبار هست که از لیست ویو استفاده بشه؟
از چی دیگه میتونم استفاده کنم؟ card View هم جالب میشه

akbar8298
چهارشنبه 08 مرداد 1393, 23:43 عصر
با این کد میتونین مقدار عرض برای هر سطر رو بدست بیارین. توی arrayadapter موقع inflate کردن ویو از listItemHeight استفاده کنید.
Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefau ltDisplay();
DisplayMetrics dm = new DisplayMetrics();
display.getMetrics(dm);
int height = dm.heightPixels;
int listItemHeight = height / 7;

slr560
چهارشنبه 08 مرداد 1393, 23:56 عصر
با این کد میتونین مقدار عرض برای هر سطر رو بدست بیارین. توی arrayadapter موقع inflate کردن ویو از listItemHeight استفاده کنید.
Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefau ltDisplay();
DisplayMetrics dm = new DisplayMetrics();
display.getMetrics(dm);
int height = dm.heightPixels;
int listItemHeight = height / 7;

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

poorman
پنج شنبه 09 مرداد 1393, 13:00 عصر
سلام

شما مگه تعداد آیتم هاتون 7 تا ثابت نیست ؟

خب دلیلی نداره حتما از لیست ویو استفاده کنید

آیتم هاتون رو داخل یک اسکرول ویو بچینید

به نظرم اینطوری خیلی راحت تر کارهایی که میخواین انجام بدید رو میتونید مدیریت کنید

slr560
پنج شنبه 09 مرداد 1393, 13:04 عصر
سلام

شما مگه تعداد آیتم هاتون 7 تا ثابت نیست ؟

خب دلیلی نداره حتما از لیست ویو استفاده کنید

آیتم هاتون رو داخل یک اسکرول ویو بچینید

به نظرم اینطوری خیلی راحت تر کارهایی که میخواین انجام بدید رو میتونید مدیریت کنید

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

poorman
پنج شنبه 09 مرداد 1393, 13:09 عصر
دلیل اینکه لیست ویو کوچیک میشه مشخصه، شما مسلما دارید برای هر آیتم از یک layout استفاده میکنید که ارتفاعش wrap_content هست

بنابراین هر آیتم فضایی بیشتر از چیزی که نیاز داره رو اشغال نمیکنه

اگر قبلا این اتفاق نمی افتاده، به این دلیل بوده که یا محتوای داخل هر آیتم ارتفاع بیشتری داشته یا اینکه تعداد آیتم ها بیشتر بوده