PDA

View Full Version : لیست ویو افقی



reza_azizi2010
دوشنبه 30 دی 1392, 23:59 عصر
با سلام
میخاستم بدونم توی بازار، او قسمتی که اسکرین شاتهای برنامه رو نمایش میده چیه؟> لیست ویو؟ یا گرید ویو؟
و اگه لیسته، میشه بگین چطوری میشه لیست رو افقی کرد؟!

shahin bahari
سه شنبه 01 بهمن 1392, 00:40 صبح
Horizontal Scroll View هستش.

reza_azizi2010
سه شنبه 01 بهمن 1392, 10:53 صبح
Horizontal Scroll View هستش.
خب اگه تعداد عناصر از قبل مشخص نباشه، به مشکل میخوریم که. اینکه روی چه عنصری کلیک شده

shahin bahari
سه شنبه 01 بهمن 1392, 11:16 صبح
خب اگه تعداد عناصر از قبل مشخص نباشه، به مشکل میخوریم که. اینکه روی چه عنصری کلیک شده
توی کد هرچند تا که لازم هست اضافه میکنید و clickListener هرکدوم رو هم یکی میزارید و توی متد OnClick بررسی میکنید کدوم کلیک شده ( من clickListener رو this میزارم و onClickListener رو implement میکنم. گرچه هیچ فرقی نداره)

reza_azizi2010
سه شنبه 01 بهمن 1392, 11:20 صبح
اینجوری داینامیک نیست و فکر میکنم اصولی نباشه

shahin bahari
سه شنبه 01 بهمن 1392, 15:17 عصر
اینجوری داینامیک نیست و فکر میکنم اصولی نباشه
منظور شما از داینامیک چیه؟!
اگه ویجت ها رو داخل فایل XML بنویسید چون موقع اجرا قابل تغییر نیستند بهشون استاتیک میگن. اما اگه شما ویجت ها رو بسته به شرایط داخل کد جاوا اضافه کنید میشه داینامیک چون هر موقع که بخواید میتونید تغییر بدید.
حالا با این تعریف این روش 100% داینامیک حساب میشه!
از نظر اصولی بودن هم مشکلی نداره چون از هرچیز برای کاربرد اصلی خودش استفاده میکنیم. این تاپیک رو ببینید. تقریبا شبیه چیزی هست که شما میخواید:
http://barnamenevis.org/showthread.php?436072-%D8%B3%D8%A7%D8%AE%D8%AA-%D9%85%D9%86%D9%88%DB%8C%DB%8C-%D8%A7%D8%B2-%D8%AA%D8%B5%D8%A7%D9%88%DB%8C%D8%B1%28%D9%85%D8%A 7%D9%86%D9%86%D8%AF-%DB%8C%DA%A9-%DA%AF%D8%A7%D9%84%D8%B1%DB%8C-%D8%A7%D9%81%D9%82%DB%8C%29

reza_azizi2010
سه شنبه 01 بهمن 1392, 15:23 عصر
باز هم مثل لیست ویو روش نمیشه کنترل داشت
من اینو میخام!
http://www.dev-smart.com/archives/34

reza_azizi2010
سه شنبه 01 بهمن 1392, 22:34 عصر
اصلا کسی میدونه لیست افقی چطوری ساخته میشه؟

reza_azizi2010
چهارشنبه 02 بهمن 1392, 00:08 صبح
منظور شما از داینامیک چیه؟!
اگه ویجت ها رو داخل فایل XML بنویسید چون موقع اجرا قابل تغییر نیستند بهشون استاتیک میگن. اما اگه شما ویجت ها رو بسته به شرایط داخل کد جاوا اضافه کنید میشه داینامیک چون هر موقع که بخواید میتونید تغییر بدید.
مثل اینکه باید لیست افقی رو بیخیال شم!
میشه در مورد این قسمت توضیح بدین؟ یعنی چطوری باید مثلا یک imageview رو به تعدادی که زمان اجرا مشخص میشه درست کنم؟ منظورم تو قسمت xml و چطوری اسمها رو بهش بدم؟ کلا ممنون میشم یکم راهنمایی کنید

shahin bahari
چهارشنبه 02 بهمن 1392, 17:24 عصر
مثل اینکه باید لیست افقی رو بیخیال شم!
میشه در مورد این قسمت توضیح بدین؟ یعنی چطوری باید مثلا یک imageview رو به تعدادی که زمان اجرا مشخص میشه درست کنم؟ منظورم تو قسمت xml و چطوری اسمها رو بهش بدم؟ کلا ممنون میشم یکم راهنمایی کنید
میشه از همون طریقی که خود ListView رو ساختن یعنی مشتق کردن از AdapterView ساختش ولی recycle کردن ویو های اضافی و اسکرول کردن ویو ها یکم داستان داره. ولی این روش بی دردسر تره.
یه کلاس بسازید و اون رو از HorizontalScrollView مشتق کنید. حالا توی قسمت custom view ادیتور XML اسم کلاستون اضافه شده. اون رو به XML اضافهکنید و داخلش به عنوان child یه linear layout تعریف کنید.

<com.a.b.widget.yourClass
android:id="@+id/show_image_gallery"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:background="#7777" >

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:background="#0000" >
</LinearLayout>
</com.a.b.widget.yourClass>

کد جاوا هم یه چیزی شبیه این میشه. البته من AsyncTask های داخلش که برای لود تصویر بود و قسمت هایی که برای حاشیه و اسکرول و این چیز ها بود رو حذف کردم تا کد ساده تر بشه. الان این کد یه لیست از تصاویر میگیره و اون ها رو لود میکنه داخل اسرول ویو. برای Listener هم اگر تعریف کنید شماره تصویر که کلیک شده رو بر میگردونه.
public class yourclass extends HorizontalScrollView implements OnClickListener {

private final int image_size = 70;
private int image_min_margin = 7;
private Context context;
private onItemSelected event;

public interface onItemSelected {
abstract void ItemSelected(int item);
}

public yourclass(Context context) {
super(context);
this.context = context;
}

public yourclass(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
}

public yourclass(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.context = context;
}

public void setList(ArrayList<String> lst) {
LinearLayout ll = new LinearLayout(context);
try {
ll = (LinearLayout) this.getChildAt(0);
} catch (Exception e) {
throw new ClassCastException(
"The child of gallery must be only a linear layout");
}
for (int counter = 0; counter < lst.size(); counter++) {
ImageView iv = new ImageView(context);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
convertDpToPixel(image_size), convertDpToPixel(image_size));
params.topMargin = params.bottomMargin = convertDpToPixel(2);
params.rightMargin = params.leftMargin = convertDpToPixel(image_min_margin);
iv.setScaleType(ScaleType.FIT_XY);
iv.setOnClickListener(this);
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inJustDecodeBounds = true;
BitmapFactory.decodeFile(lst.get(counter), opt);
opt.inSampleSize = calculateInSampleSize(opt);
opt.inJustDecodeBounds = false;
opt.inPreferredConfig = Bitmap.Config.RGB_565;
iv.setImageBitmap(BitmapFactory.decodeFile(lst.get (counter), opt));
ll.addView(iv, params);
}
}

public void setOnItemSelected(onItemSelected e) {
event = e;
}

@Override
public void onClick(View v) {
for (int i = 0; i < ((LinearLayout) getChildAt(0)).getChildCount(); i++) {
View child = ((LinearLayout) getChildAt(0)).getChildAt(i);
if (child == v) {
scrolToItem(i);
if (event != null) {
event.ItemSelected(i);
}
return;
}
}
}

public void scrolToItem(final int X) {
post(new Runnable() {

@Override
public void run() {
smoothScrollTo((int) (convertDpToPixel(image_size)*X + X*2*convertDpToPixel(image_min_margin)), 0);
}
});
}

private int calculateInSampleSize(BitmapFactory.Options options) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > thumbnailY || width > thumbnailX) {
inSampleSize = (int) Math.pow(
2,
(int) (Math.log(Math.min((float) thumbnailY
/ (float) height, (float) thumbnailX
/ (float) width)) / Math.log(0.5)));
}
return inSampleSize;
}
}

private int convertDpToPixel(int dp) {
Resources resources = context.getResources();
DisplayMetrics metrics = resources.getDisplayMetrics();
float px = dp * (metrics.densityDpi / 160f);
return (int) px;
}
}

reza_azizi2010
چهارشنبه 02 بهمن 1392, 17:51 عصر
میشه بیشتر توضیح بدین
من میخام چندتا عکس بصورت افقی داشته باشم مثل چیزی که تو قسمت اسکرین شات بازار هست. و با کلیک رو هرکدوم، اون تصویر توی یک صفحه دیگه بزرگ نمایش داده بشه