ورود

View Full Version : مشکل جستجو در listview سفارشی?????



civilroid
پنج شنبه 05 تیر 1393, 22:30 عصر
سلام اساتید،من یک listview سفارشی ساختم که شامل 10 آیتم است.عنوان آیتم ها و متن هر آیتم رو در فایل string.xml تعریف کردم و یک activity هم برای نمایش محتوای هر آیتم ساختم که با کلیک روی هر آیتم محتوای اون در این activity نشون داده میشه.
حالا میخوام امکان سرچ در عنوان آیتم ها رو ایجاد کنم،فرض کنید عنوان اولین آیتم در listview "نرم افزار" و عنوان آیتم پنجم "سخت افزار" است.مشکل اینجاست که وقتی عنوان سخت افزار رو سرچ میکنم این آیتم به عنوان اولین آیتم در نتایج جستجو قرار میگیره و با کلیک روی اون محتویات اولین آیتم یعنی نرم افزار نمایش داده میشه:ناراحت:و به همین ترتیب برای سایر جستجوها محتواهای بی ربط نمایش داده میشن چون با سرچ کردن موقعیت آیتم ها در لیست جابجا میشه.:افسرده:کمک

SASAN_AH
جمعه 06 تیر 1393, 08:43 صبح
سلام دوست عزیز
شما برای هر ایتمتون یه مقدار ندادین

مثلا من با این مثال
با کلیک روی نرم افزار به page 1 میره و با کلیک روی سخت افزار به page 2.


@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);

if (adapter.getItem(position).equals("نرم افزار")) {
startActivity(new Intent(MainActivity.this, Page1.class));
} else if (adapter.getItem(position).equals("سخت افزار")) {
startActivity(new Intent(MainActivity.this, Page2.class));
} else if ( ) {
.
.
.
.
.
.
.
.
,و سایر کدها هم به همین شکل برای سایر آیتم هاتون

civilroid
جمعه 06 تیر 1393, 13:32 عصر
ممنون از جوابتون ولی شما برای هر آیتم یک اکتیویتی جداگانه ساختین،فرض کنید لیست شامل 200 آیتم باشه دیگه نمیشه این روش رو به کار برد.من فقط یک اکتیویتی برای نمایش تمام آیتم ها دارم ولی نمیدونم در oneListItemClick چی بنویسم:افسرده:

SASAN_AH
جمعه 06 تیر 1393, 13:45 عصر
اینم راه خودش رو داره شما اینکارو کنید برای هر دکمه یه مقدار تعیین کنید که با کلیک اون مقدار رو بگیره مثلا اگه ایتم اول کلیک شد 1 بگیره ایتم دوم کلیک شد 2 رو بگیر شما برید این ها رو یاد بگیرید

civilroid
جمعه 06 تیر 1393, 14:24 عصر
اگر امکانش هست یه نمونه کد بزارید ممنون میشم:ناراحت:

SASAN_AH
جمعه 06 تیر 1393, 14:35 عصر
زیاد میشه باید یاد بگیرید
در ضمن شما توی یک اکتیویتی چه چیزای رو میفرستین یا دارین؟

civilroid
جمعه 06 تیر 1393, 14:38 عصر
دوتا textview که مقدارشون رو از string.xml میگیرن.یکی عنوان هر آیتم یکی هم محتوای اون آیتم

SASAN_AH
جمعه 06 تیر 1393, 14:46 عصر
دوتا textview که مقدارشون رو از string.xml میگیرن.یکی عنوان هر آیتم یکی هم محتوای اون آیتم


این نه!

وقتی رو یکی ایتم های لیست ویو کلیک بشه چه اتفاقی میفته تو اکتیویتی شما

civilroid
جمعه 06 تیر 1393, 14:58 عصر
قراره با کلیک روی آیتمی که سرچ شده به اکتیویتی نمایش محتوا منتقل بشیم. که در کد زیر اسمش Show_Subjets.class هست

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> parent, final View view,
int position, long id) {

Intent i = new Intent(getApplicationContext(), Show_Subjects.class);
String Subject_number = String.valueOf(position+1);
i.putExtra("subject_number", Subject_number);
startActivity(i);

}

});

SASAN_AH
جمعه 06 تیر 1393, 15:29 عصر
میخواهید با کلیک رو هر ایتم علاقمندی ها رو نشون بده؟

civilroid
جمعه 06 تیر 1393, 16:10 عصر
نه علاقه مندی ها در اکتیویتی جداگانه ساختم و مشکلی نداره فقط مشکل اینه بعد از جستجو آیتم های جستجو شده کاربر رو به جایی که درسته هدایت نمیکنن

SASAN_AH
جمعه 06 تیر 1393, 17:36 عصر
شما دقیق نمیگید
از دیتابیس استفاده میکنید
یه غیر این

civilroid
جمعه 06 تیر 1393, 20:08 عصر
نه دیتابیس ندارم،یه اکتیویتی اصلی که توش listview قرار داره،اطلاعات این لیست درون string.xml قرار داره،و یک اکتیویتی هم برای اینکه با کلیک هر آیتم به اون منتقل شده و محتوا رو ببینیم.تا اینجا کاملا کار میکنه.حالا بالای این لیست یک edittext برای سرچ توی عناوین لیست گذاشتم که سرچ رو هم انجام میده،فقط با کلیک روی نتیجه سرچ به محتوای درست منتقل نمیشه.برنامه نویسیم لنگ میزنه وگرنه میدونم که سادست و با دو خط کد حل میشه:افسرده:

SASAN_AH
جمعه 06 تیر 1393, 20:47 عصر
مشکلی نداره شما هم بلد میکنید:لبخند:

درسته همون کد اولی دادم کارت رو راه میندازه ولی باید یه تغییراتی بهش بدی با توجه به کد هات()من نمیدونم چی کردی()
با کلیک رو هر ایتم چطوری از string میگیرید و در یه اکتیویتی دیگه ارسال میکنید؟
1_ از طریق مقدار
2_از طریق آدرس

civilroid
جمعه 06 تیر 1393, 22:37 عصر
توی روح گوگل با این اندرویدش که انداخت به جون ملت:لبخند:

ببین میتونی مشکلو حل کنی مهندس ثواب داره خرج سه تا زن گردنمه:لبخند:

این کد اکتیویتی اصلی ک توش سرچ انجام میشه
import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;


public class Search extends ListActivity {
Button search;
TextView matn;

public ListView lv;
public Globals global = new Globals();
public int Subjects_total_number;
public String[] Subjects;


// Listview Adapter
ArrayAdapter<String> adapter;

// Search EditText
EditText inputSearch;

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

lv = (ListView) findViewById(R.id.list_view);
inputSearch = (EditText) findViewById(R.id.inputSearch);
search=(Button) findViewById (R.id.button1);

search.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View arg0) {
Intent toFehrest=new Intent(Search.this ,Fehrest.class); ;
startActivity(toFehrest);

}
});

Subjects_total_number = global.Subjects_total_number;
Subjects = new String[Subjects_total_number];
for(int x = 1; x < Subjects_total_number+1; x = x+1) {
String this_subject = "subject_" + String.valueOf(x);
int resID = getResources().getIdentifier(this_subject, "string", getPackageName());
Subjects[x-1] = getResources().getString(resID);
}




lv = getListView();

adapter = new ArrayAdapter<String>(this, R.layout.list, R.id.tv_list, Subjects);
lv.setAdapter(adapter);

/**
* Enabling Search Filter
* */

inputSearch.addTextChangedListener(new TextWatcher() {

@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub

}

@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub

}

@Override
public void afterTextChanged(Editable arg0) {

Search.this.adapter.getFilter().filter(arg0);
}
});

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> parent, final View view,
int position, long id) {

Intent i = new Intent(getApplicationContext(), Show_Subjects.class);
String Subject_number = String.valueOf(position+1);
i.putExtra("subject_number", Subject_number);
startActivity(i);


}
});


}


}


اینم کد اکتیویتی که بعد از کلیک روی آیتم های لیست محتوای آیتم توش نمایش داده میشه

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class Show_Subjects extends Activity {

Button home;
Button share;
static TextView tv1;
static TextView tv2;

private void shareIt() {
//sharing implementation here
Intent intent = new Intent(Intent.ACTION_SEND);
String one=tv1.getText().toString();
String two=tv2.getText().toString();
intent.setType("text/plain");
String my_string =""+one+"\n"+two;
intent.putExtra(Intent.EXTRA_TEXT, my_string);
startActivity(Intent.createChooser(intent, "اشتراک این مطلب از طریق:"));
}



public String Subject_number;
public SharedPreferences shared;
public SharedPreferences.Editor editor;
Globals global = new Globals();
public ImageView iv_favorites;

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

home=(Button) findViewById (R.id.btn_home);
share=(Button) findViewById (R.id.btn_share);

home.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View arg0) {

Intent toFehrest=new Intent(Show_Subjects.this ,Fehrest.class); ;
startActivity(toFehrest);

}
});

share.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View arg0) {
shareIt();

}
});



iv_favorites = (ImageView) findViewById(R.id.imageView1);

Bundle extras = getIntent().getExtras();
if (extras != null) {
Subject_number = extras.getString("subject_number");
}

tv1 = (TextView) findViewById(R.id.textView1);
String stringName_1 = "subject_" + String.valueOf(Subject_number);;
int resID_1 = getResources().getIdentifier(stringName_1, "string", getPackageName());
tv1.setText(resID_1);

tv2 = (TextView) findViewById(R.id.textView2);
String stringName_2 = "subject_text_" + String.valueOf(Subject_number);;
int resID_2 = getResources().getIdentifier(stringName_2, "string", getPackageName());
tv2.setText(resID_2);

// Favorites
shared = getSharedPreferences("Prefs", MODE_PRIVATE);
editor = shared.edit();

final int subject_number_int = Integer.parseInt(Subject_number);
final String this_subject = "subject_" + String.valueOf(subject_number_int);

final Boolean b1 = shared.getBoolean(this_subject, false);
if (b1){
iv_favorites.setImageResource(R.drawable.favorite_ selected);
}else{
iv_favorites.setImageResource(R.drawable.favorite_ not_selected);
}

iv_favorites.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
Boolean b2 = shared.getBoolean(this_subject, false);
if (b2){
editor.putBoolean(this_subject, false);
editor.commit();
iv_favorites.setImageResource(R.drawable.favorite_ not_selected);
// show message
String message = getResources().getString(R.string.favorites_remove d);
Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show();
}else{
editor.putBoolean(this_subject, true);
editor.commit();
iv_favorites.setImageResource(R.drawable.favorite_ selected);
// show message
String message = getResources().getString(R.string.favorites_added) ;
Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show();
}
}
});
}
}

SASAN_AH
جمعه 06 تیر 1393, 23:54 عصر
توی اکتیویتی سرچ چرا ارث بری از لیست اکتیویتی کردین با این وجود که از لیست شخصی استفاده کردین؟(1) کد رو از جایی برداشتین خب اونجا توضیحات کامل داده(2)

civilroid
شنبه 07 تیر 1393, 13:37 عصر
مشکل فقط توی قسمت onItemclick در اکتیویتی سرچ هست بقیش کار میکنه،توضیح نداده بود

civilroid
شنبه 07 تیر 1393, 19:16 عصر
آقا من که همه کد رو گذاشتم باز کسی نمیتونه راهنمایی کنه؟هزارتا فن زدم هیچکدوم کار نکرد:گریه:ذکات دانشتون رو بدید خب

SASAN_AH
شنبه 07 تیر 1393, 19:45 عصر
بنظرم این جستجو برای این لیست نشه استفاده کرد
چون از کد ها معلوم هست که دارای 3 موضوع هست که بین این 3 موضوع جستجو میشه نه یه لیست ویو شخصی شده/
و در کل جستجو رو از طریق ادرس داره انجام میده


این کد شاید خودش باش!



lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> parent, final View view,
int position, long id) {

final String item = lv.getItemAtPosition(position).toString();
int total_number = 3;
for(int x = 1; x < total_number+1; x = x+1) {
String SubjectName = "subject_" + String.valueOf(x);
int resID = getResources().getIdentifier(SubjectName, "string", getPackageName());

بعد

String subject = getResources().getString(resID);

بعد طبق کد شما با کمی تغییرات (خودتون:لبخند:)

Intent intent = new Intent(getApplicationContext(), Show_Subjects.class);
startActivity(intent);

اینم زکات ما باقیش دانش شما!:لبخند:

civilroid
شنبه 07 تیر 1393, 20:44 عصر
ممنون ولی اینم قبلا امتحان کردم.مشکل اصلا انجام سرچ نیست بعد از سرچ بدبختی شروع میشه:لبخند:پوزیشنا به هم میریزه بعد سرچ علی میره خونه ولی نقی میره خونه تقی حسن میره خونه احمد
از item کجا استفاده میشه توی کد بالا؟!

SASAN_AH
شنبه 07 تیر 1393, 21:59 عصر
گفتم قبلا این روش برای 3 موضوع که دارای 3 اکتیویتی هست انجام میشه یعنی بین این 3 موضوع جستجو میشه

بنظرم دنبال یه روش دیگه باشید.

civilroid
شنبه 07 تیر 1393, 22:24 عصر
ممنون خیلی باش کلنجار رفتم الان یه delete میزنم به کل پروژه:تشویق: