ورود

View Full Version : کمک فوری در آرایاه آداپتر کمک



saeedf436
پنج شنبه 01 مرداد 1394, 20:21 عصر
من یه اکتیویتی جستجو دارم که توش لیست ویو رو وقتی فیلتر میکنم مقدار موقعیت اشتباهی به من میده میخام موقعیت درست رو به انتنت بفرستم که به اکتیویتی دوم بره اگه بدون جستجو آیتم رو انتخاب کنم درست کار میکنه اما وقتی جسجو میکنم و فیتلر میکنه نه مثله انتخاب در حالت غیر فیلتر کار میکنه
یا اصلا یه جایی هست که بشینم این آرایه آداپتر ها رو مثه آدم بخونم معرفی کنید.
ممنون بازم
این هم کد منه که استفاده کردم میدونم تو انجمن چند تا پست واسه فیلتر و اینا هست اما همشون خیلی پیشرفته هست من با این روش لیست علاقه مندی هم ساختم که درست کار میکنه حتی اگه بدون فیلتر هم همین طور فقط بعد فیلتره
چند روزه گیره اینم



import android.app.ListActivity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

public class Ravan1 extends ListActivity {
public int Subjects_total_number;
public String[] Subjects;
ListView lv;
public ArrayAdapter<String> adapter;
EditText ed;
SharedPreferences full;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
screnpref();
setContentView(R.layout.a_ravan1);
Subjects = new String[200];
for (int x = 1; x < 200 + 1; x = x + 1) {
String this_subject = "ravan1_" + String.valueOf(x);
int resID = getResources().getIdentifier(this_subject, "string",
getPackageName());
Subjects[x - 1] = getResources().getString(resID);
}
adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, Subjects);
setListAdapter(adapter);
ed = (EditText) findViewById(R.id.edtsearchr1);
lv = (ListView) findViewById(android.R.id.list);
lv.setTextFilterEnabled(true);

ed.addTextChangedListener(new TextWatcher() {

@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
setListAdapter(adapter);
}

@Override
public void beforeTextChanged(CharSequence arg0, int arg1,
int arg2, int arg3) {
setListAdapter(adapter);
}

@Override
public void afterTextChanged(Editable arg0) {
Ravan1.this.adapter.getFilter().filter(arg0);
setListAdapter(adapter);
}
});

lv.setOnItemClickListener(new OnItemClickListener() {

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

Intent i = new Intent(getApplicationContext(), Secendr1.class);
//این خط مشکل من هستش موقعیت رو میفرسته و تو اکتیویتی دوم دریافت میشه اما
String Subject_number = String.valueOf(position + 1);
i.putExtra("subject_number", Subject_number);
startActivity(i);

Toast.makeText(getApplicationContext(), position + 1,
Toast.LENGTH_SHORT).show();
}
});
}

private void screnpref() {
requestWindowFeature(Window.FEATURE_NO_TITLE);
full = PreferenceManager.getDefaultSharedPreferences(getB aseContext());
boolean lab = full.getBoolean("swich_full_pref", true);
if (lab == true) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FL AG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
if (lab == false) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCRE EN,
WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCRE EN);
}

}

}

diapason
پنج شنبه 01 مرداد 1394, 20:37 عصر
خوب متغیر پوزیشن به شما آدرس موقعیت یک سطر رو می‌ده. مثلاً چه فیلتر کرده باشید، چه نکرده باشید، لمس سطر اول به شما عدد 0 رو در position بر می‌گردونه. برای چیزی که شما می‌خواید باید یا از id استفاده کنید، که در آداپتور خودتون به هر سطر اختصاص داده می‌شه، به جای <String>، یک کلاس برای عناصر آداپتور تعریف کنید که برای هر آیتم یک فیلد منحصر به فرد داشته باشه: برای مثال یک فیلد String برای رشته‌تون و یک فیلد int برای شناسه‌ای که به هر سطر قراره بدین. می‌تونید این شناسه رو در آداپتور به id تخصیص بدین و از متغیر id که برای شما برگردونده شده استفاده کنید، یا از position استفاده کیند و شناسه‌ای که برای آیتم اون سطر تعریف کردید رو بازیابی کنید.

saeedf436
پنج شنبه 01 مرداد 1394, 21:19 عصر
گیر ن اونه چطوری اینکارو کنم.

diapason
پنج شنبه 01 مرداد 1394, 22:55 عصر
نمونه‌ای که در یکی از برنامه های خودم داشتم: برای مثال، برای یک فایل منیجر
این کلاسی که برای نگه داشتن اطلاعات هر فایل (هر سطر از لیست ویو) استفاده شده (کلیات و نحوۀ ساخته شدنش رو بررسی کنید. جزئیاتش مهم نیست):
public class FileManagerData implements Comparable<FileManagerData> {
public static final int TYPE_FOLDER = 0;
public static final int TYPE_FILE = 1;

private String name;
private String date;
private int type;

public FileManagerData(String name, String date, int type) {
super();
this.name = name;
this.date = date;
this.type = type;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getDate() {
return date;
}

public void setDate(String date) {
this.date = date;
}

public int getType() {
return type;
}

public void setType(int type) {
this.type = type;
}

@Override
public int compareTo(FileManagerData another) {
int ret = 0;
if (this.type == TYPE_FOLDER && another.type == TYPE_FILE) {
ret = -1;
} else if (this.type == TYPE_FILE && another.type == TYPE_FOLDER) {
ret = 1;
} else if (this.type == another.type){
ret = this.name.compareTo(another.name);
}
return ret;
}

}

این آداپتوری که برای این منظور ساخته شده:
public class FileManagerAdapter extends ArrayAdapter<FileManagerData> {
Context context;
int resource;
List<FileManagerData> data;

public FileManagerAdapter(Context context, List<FileManagerData> objects) {
this(context, R.layout.file_manager_layout, objects);
}

public FileManagerAdapter(Context context, int resource,
List<FileManagerData> objects) {
super(context, resource, objects);
this.context = context;
this.resource = resource;
this.data = objects;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE) ;
convertView = inflater.inflate(
R.layout.file_manager_layout_list_items, parent, false);
holder = new ViewHolder();
holder.name = (TextView) convertView
.findViewById(R.id.file_manager_lst_name);
holder.date = (TextView) convertView
.findViewById(R.id.file_manager_lst_date);
holder.icon = (ImageView) convertView
.findViewById(R.id.file_manager_lst_icon);
convertView.setTag(holder);

} else {
holder = (ViewHolder) convertView.getTag();
}
FileManagerData fmData = this.data.get(position);
if (fmData != null) {
holder.name.setText(fmData.getName());
holder.date.setText(fmData.getDate());
if (fmData.getType() == FileManagerData.TYPE_FOLDER) {
holder.icon.setImageResource(R.drawable.file_manag er_folder);
} else if (fmData.getType() == FileManagerData.TYPE_FILE) {
holder.icon.setImageResource(R.drawable.file_manag er_file);
}
}
return convertView;
}

private static class ViewHolder {
public TextView name;
public TextView date;
public ImageView icon;
}
}

این بخشی از تابعی که List<FileManagerData> fileManagerDataاز رو می سازه تا به آداپتور داده بشه:
File[] files = folder.listFiles();
if (!foldersHidden
&& !(limitedToRootFolder && rootFolder
.equals(currentFolder))) {
fileManagerData.add(new FileManagerData("..", "",
FileManagerData.TYPE_FOLDER));
}

در نهایت وقتی روی یک سطر لمس می‌شه:
currentAddress += "/"+ fileManagerData.get(position).getName();

ببنید: در این مثال نام فایل یک فیلد منحصر به فرده. به طوری که زمان پر شدن، هر آیتم لیست، یک نام منحصر به فرد داره. حالا در هر پوزیشنی باشن، شما با get(position).getName میتونید نام ذخیره شده در اون سطر رو برگردونید. مهم نیست position چه مقداری داره. سطر شما در هر پوزیشنی قرار بگیره مقدار name یکیه.

برای سادگی کلاس زیر رو تصور کنید (مشابه چیزی که شما احتمالا نیاز خواهید داشت):
public class TextData{
private int id;
private String text;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public TextData(int id, String text) {
super();
this.id = id;
this.text = text;
}
}

حالا لیست از نوع TextData لازم دارید که به آداپتوری که از نوع TextData ساختید بفرستید و به صورت زیر فرضا پرش کنید:
List<TextData> data = new ArrayList<TextData>();
for(int i=0 ;i<100;i++){
data.add(new TextData(i,"Item" + i));
}


و data رو به ArrayAdapter که از ArrayAdapter<TextData> اکستند شده بدید.
حالا زمانی که روی یکی از سطرها لمس شد، شما با data.get(position).getId آی دی مورد نظر رو به دست میارید و ازش استفاده می کنید. مهم نیست اون آیتم که لمس شده در چه موقعیتی قرار گرفته باشه. هر جا باشه بک آی دی داره.

saeedf436
جمعه 02 مرداد 1394, 23:02 عصر
سلام دوباره من تو این پروژه کمی دست بردم و یک مشکل کوچیک دارم که تو انتخاب آیتمه ممکنه نگاه کنید و بگید؟

https://drive.google.com/open?id=0B79SNhNU4fQ_bllfTjVtV2t0dEk

اینم کد اون اکتیویتی


package com.example.ffasd;

import java.util.ArrayList;
import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;

public class Main extends Activity {
EditText edittext;
ListView listview;

String[] text;

int textlength = 0;
ArrayList<String> text_sort = new ArrayList<String>();

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.main);

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

edittext = (EditText) findViewById(R.id.EditText01);
listview = (ListView) findViewById(R.id.ListView01);
listview.setAdapter(new MyCustomAdapter(text, null));
edittext.addTextChangedListener(new TextWatcher() {

public void afterTextChanged(Editable s) {

}

public void beforeTextChanged(CharSequence s, int start, int count,
int after) {

}

public void onTextChanged(CharSequence s, int start, int before,
int count) {

textlength = edittext.getText().length();
text_sort.clear();

for (int i = 0; i < text.length; i++) {
if (textlength <= text[i].length()) {
if (edittext
.getText()
.toString()
.equalsIgnoreCase(
(String) text[i].subSequence(0,
textlength))) {
text_sort.add(text[i]);

}
}
}

listview.setAdapter(new MyCustomAdapter(text_sort, null));

}
});
listview.setOnItemClickListener(new OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// Here I have to send the location of each item to an intent

//this code send it without search action

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

}
});
}

class MyCustomAdapter extends BaseAdapter {

String[] data_text;

MyCustomAdapter() {

}

MyCustomAdapter(String[] text, int[] image) {
data_text = text;

}

MyCustomAdapter(ArrayList<String> text, ArrayList<Integer> image) {
data_text = new String[text.size()];

for (int i = 0; i < text.size(); i++) {
data_text[i] = text.get(i);

}

}

public int getCount() {
return data_text.length;
}

public String getItem(int position) {
return null;
}

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

public View getView(int position, View convertView, ViewGroup parent) {

LayoutInflater inflater = getLayoutInflater();
View row;

row = inflater.inflate(R.layout.listview, parent, false);

TextView textview = (TextView) row.findViewById(R.id.TextView01);

textview.setText(data_text[position]);
Animation animation = AnimationUtils.loadAnimation(
getApplicationContext(), R.anim.slide_in_right);
row.startAnimation(animation);
return (row);

}
}

}