بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

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

مدیریت گفتگو
محمد خوش نظر 12 سال پیش
آخرین تغییر: 12 سال پیش

سلام دوستان

اولا بهتون اطمینان میدم که من قبل از پرسیدن این سوال سرچ کردم و تنها 1 سوال مانند سوال خودم در سرویس پیدا کردم ولی متاسفانه چیزی ازش متوجه نشدم!

سوال که واضحه! میخوام وقتی روی هریک از آیتمهای لیست ویو کلیک میکنم به یک اکتیویتی خاص بره( منظور من Intent نیست)! اما از اونجایی که یک سری کد پیدا کردم که نتونستم محل قرارگیریشو پیدا کنم. یعنی اگر با توجه به ویدیوی لیست ویو پیش بریم کدهای موجود در این لینک یا این لینک رو باید در کدوم اکتیویتی کپی کنم؟

در اکتیویتی AdapterNote ؟ یا در اکتیویتی ای که لیست ویو تعریف شده (منظورم کنار حلقه for ای هستش که تعداد آیتم هارو میسازه) ؟

و مورد بعدی اینه که ایکلیپس من اصلا onItemClick رو شناسایی نمیکنه!؟

ممنون

نظرات

Dadparvar 12 سال پیش
جناب خوش نظر ، باتوجه به اینکه بنده فعلا در سطح مبتدی هستم ، چیزی که بلدم اینه که شما برای لایه ای که لیست رو در بر میگیره یک آیدی در نظر بگیرید (همونی که در ویدئو آیدی layoutRoot داده شد.حالا در موقغ onClickListener نوشتن براش ، از دستور if استفاده کنید که چنانچه مثلا title آیتم فلان چیز بود ، فلان intent انجام شه و اگر چیز دیگر بود صفحه دیگری باز شه و الی ...) البته حتما روش حرفه ای ای وجود خواهد داشت. (ایین روشی بود که تا اینجا به یاد گرفتم بنده)
محمد خوش نظر 12 سال پیش
جناب دادپرور سلام. ممنون از راهنماییتون. آقا شکست نفسی میفرمایید. شما مبتدی باشید من دیگه خیلی داغونم.خخخخخ جدا از شوخی راهی که گفتید رو تست کردم اما نتیجه نداد! ینی onClickListener برای لیست ویو کار نمیکنه و باید از onItemClick استفاده کرد که متاسفانه ایکلیپس من شناسایی نمیکنه! مشکل من با جای کدها هستش! محل قرارگیری کدها باید توی اکتیویتی AdapterNote باشه؟؟؟؟
Dadparvar 12 سال پیش
برای سهولت کار برای سایر عزیزان ، علاوه بر پروژه ، توضیحات و کد نیز در متن پاسخم در پاسخ چهارم درج شد (بله در AdapterNote .البته این برای سایرین هست.شما که مشکلتون برطرف شد)

پاسخ‌ها 4

مجتبی یگانه 12 سال پیش

خوب پاسخ من رو در اولین لینک مطالعه کردید ، اما اینجا توضیح بیشتری میزارم شاید کمکتون کنه :)

برای جابجایی بین اکتیویتی ها باید از intent استفاده بشه ، من یک مثال به این شکل برای استفاده در لیست ویو مطرح میکنم 

اگر ID <10 برو به Activity1 در غیر اینصورت برو به Activity2

private void onItemClickProcess(int ID) {
	if (id < 10) {
		startActivity(new Intent(activityMain.this, Activity1.class));
	}
	else {
		startActivity(new Intent(activityMain.this, Activity2.class));
	}
}

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

onItemClickProcess(item.ID);

نظرات

محمد خوش نظر 12 سال پیش
جناب A.L.U از پاسخ شما هم ممنونم. اما عرض کردم مشکل من Intent نیست! ینی میدونم با Intent باید برم به اکتیویتی دیگه! عرض کردم مثلاهمین تیکه کد شما رو من باید در اکتیویتی AdapterNote بکار ببرم؟ضمن اینکه onItemClick رو ایکلیپس من اصلا شناسایی نمیکنه در اکتیویتی AdapterNote! امیدوارم منظورم رو واضح رسونده باشم. ممنون
مجتبی یگانه 12 سال پیش
ببخشید ، متوجه منظورتون نشده بودم ، خداروشکر حل شد :)
Hossein Rezaei 12 سال پیش

من روی پروژه Notes خود استاد اینکارو انجام میدم که مفهومتر باشه

اول یک فیل ID به StructureNote اضافه میکنیم:

 public class StructNote {

public String title;
public int ID;//<<<<<<<<<<<<<<<<<<<<<
public String description;
public boolean done;
}

بعد هر جایی که مقادیر لیست ویو مقدار دهی اولیه میشن، مقدار ID اونها رو هم ست میکنیم، برای مثال من توو کلاس G مقداردهی اولیه رو انجام میدم:

 public class G extends Application {

public static Activity currentActivity;
public static Context context;
public static LayoutInflater inflator;
public static ArrayList<StructNote> notes = new ArrayList<StructNote>();


@Override
public void onCreate() {
super.onCreate();
context = this.getApplicationContext();
inflator = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
initialization();

}


private void initialization() {
for (int i = 0; i < 10; i++) {
StructNote note = new StructNote();
note.description = "description number " + i;
note.done = false;
note.title = "Title number " + i;
note.ID = i;//<<<<<<<<<<<<<<<<<<<<<
notes.add(note);
}
}
}

خب حالا توی کلاس AdapterNote با توجه به ID هر فیلد، اون رو به اکتیویتی دلخواه راهنمایی میکنم:(من فقط تابع fill که دستکاری شده رو مینویسم)

         public ViewHolder(View view) {

layoutRoot = (ViewGroup) view.findViewById(R.id.layoutRoot);//شامل همه ی عناصر یک فیلد است،یعنی در حقیقت لایه در بر دارنده کل یک فیلد
}


public void fill(final ArrayAdapter<StructNote> adaptor, final StructNote item, final int position) {

txtTitle.setText(item.title);
txtDescription.setText(item.description);
chkDone.setChecked(item.done);

layoutRoot.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {

//جان ALU حالا با توجه به مثال<<<<<<<<<<<<<<<<<<<<<

if (item.ID < 5) {
Intent intent = new Intent(G.currentActivity, ActivitySecond.class);
G.currentActivity.startActivity(intent);
} else {
Intent intent = new Intent(G.currentActivity, ActivityThird.class);
G.currentActivity.startActivity(intent);
}

}
});

}
}

نظرات

محمد خوش نظر 12 سال پیش
ممنونم آقای رضایی. من تمام این کارهارو انجام دادم اما در نهایت وقتی روی هر آیتم کلیک میکنم فورس کلوز میده! ضمن اینکه من 12 تا آیتم دارم. ینی شرط داخل if های تودرتو برابر با اعداد 1 تا 12 میشه! اما باز هم کار نمیکنه!!
Hossein Rezaei 12 سال پیش
خواهش میکنم، آیا لیست تمام اکتیویتی هاتون رو به منیفست اضافه کردین؟من این کد اول رو خودم زدم توو Eclips و وقتی مطمئن شدم درسته upload ش کردم. ضمنا موقع crash شما میتونید توو logcat ببینید که Error مربوط به چیه و کدوم خط از برنامه باعث کرش میشه
محمد خوش نظر 12 سال پیش
شرمنده انقد غرق تعریف و بازی با کد شده بودم که یادم رفته بود اکتیویتی رو تعریف کنم. خدا خیرت بده برادر :دی
ahmad1989 12 سال پیش

این کدو در نظر بگیر:

 mylistview.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

      }
    });

حالا تو تابع onItemclick یه دستور سوییچ بر اساس مقادیر position مینویسی بعد تو هر کدوم از قسمت های سوییچ دستور رفتن به یک اکتیویتی رو وارد میکنی:

switch(position){
case 0:
Intent intent =newIntent(G.currentActivity,Activity1.class);
G.currentActivity.startActivity(intent);
break();
case 1:
Intent intent =newIntent(G.currentActivity,Activity2.class);
G.currentActivity.startActivity(intent);
break();
.
.
.
.

 

نظرات

محمد خوش نظر 12 سال پیش
خب درسته! اما گفتم که اصلا setOnItemClickListener در layoutRoot شناسایی نمیشه که بخوام براش کیس بنویسم! مشکل منم همینجاست!!
spring 12 سال پیش
درضمن جناب خوش نظرsetOnItemClickListener ازرویدادهای لیست ویو هست پس تو layoutRoot شناسایی نمیشه!layoutRoot هم ست تاچ داره که میشه استفاده کرد.پس مشکل از اکلیپس شما نیست وهم میشه از روش آقای رضایی و aluبه نتیجه رسید وهم طبق کد فوق ،جایی که لیست ویو تعریف شده است.بهر حال خداروشکر که به نتیجه رسیدید.
محمد خوش نظر 12 سال پیش
ممنون خانوم Solin . بله خودمم متوجه شدم که ست آن آیتم متعلق به لیست ویو هستش. در واقع الان دنبال این هستم که کدومش بهینه تره و سریعتر کار میکنه.
Dadparvar 12 سال پیش

همونطور که در دیدگاهم در پست اول درج کردم ، ببینید با همون onClickListener ساده میتونید اینکار رو انجام بدید.

من پروژه جلسه دهم رو طوری ویرایش کردم که وقتی در لیست ، روی آیتم Title 1 کلیک کنید بره در صفحه ای ، و اگر روی Title 2 ، یعنی روی آیتم دوم بطور کل ، کلیک کنید بره به صفحه دیگر ، و اگر روی سومی کلیک کنید بره به صفحه جدید دیگر. (بقیه آیتم هارو هم غیرفعال کردم که شلوغ نشه)

دانلود پروژه: MyListView.zip
فایل AdapterNote ویرایش شده.قسمت fill .کدش در نهایت به این شکل در اومد:

layoutRoot.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
if (item.title.equals("Title 1")) {
Intent intent = new Intent(G.currentActivity, ActivityTitleOne.class);
G.currentActivity.startActivity(intent);
} else if (item.title.equals("Title 2")) {
Intent intent = new Intent(G.currentActivity, ActivityTitleTwo.class);
G.currentActivity.startActivity(intent);
} else if (item.title.equals("Title 3")) {
Intent intent = new Intent(G.currentActivity, ActivityTitleThree.class);
G.currentActivity.startActivity(intent);
}

}
});

طبیعیه که کلاس های صفحات ساخته شده و فایل xml شون هم ساخته شده و در Manifest هم تعریف شدند.

نظرات


پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .