مشکل در لیست ویو
سلام دوستان . من یک لیست ویو دارم که هر آیتمش دوتا قسمت داره . یک ادیت تکست و یک تکست ویو . اونا رو توی کلاس StructNote قرار دادم:
public class StructNote extends Activity {
public String title ;
public EditText edtNote ;
}
و بعد کلاس AdapterNote تعریف کردم و سعی داشتم که ی کاری کنم که وقتی کاربر اسکرول میکنه چیزهایی ک توی ادیت تکست اول نوشته شده نگه داشته بشه و نپره . برای همین از یک ArrayList استفاده کردم که اسمش هست allNotes!!
public class AdapterNote extends ArrayAdapter<StructNote> {
public ArrayList<StructNote> allNotes;
public AdapterNote (ArrayList<StructNote> array)
{
super(G.context ,R.layout.adapter_notes,array);
this.allNotes = array;
}
private class ViewHolder {
int ref;
public TextView titleNote ;
public EditText Note ;
public ViewHolder (View view) {
}
public void fill(ArrayAdapter<StructNote> adapter , final StructNote item , final int position )
{
titleNote.setText(item.title);
}
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
final StructNote item = getItem(position);
if (convertView == null) {
convertView = G.inflater.inflate(R.layout.adapter_notes, parent, false);
holder = new ViewHolder(convertView);
holder.Note = (EditText) convertView.findViewById(R.id.edtNote);
holder.titleNote = (TextView) convertView.findViewById(R.id.txtNote);
holder.ref = position;
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.Note.setText(allNotes.get(position).edtNote.getText().toString());
holder.titleNote.setText(allNotes.get(position).title);
holder.Note.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
allNotes.get(position).edtNote.setText(s.toString());
}
});
holder.fill(this, item, position);
return convertView;
}
}
یک دکمه ی Add هم دارم که وقتی کاربر اونو بزنه یک آیتم به لیست اضافه میشه که توی کلاس اصلیم اینو نوشتم :
public ArrayAdapter adapter ;
public boolean isLoading = false ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_view);
final ListView lstContent = (ListView)findViewById(R.id.lstContent);
final Button btnAdd = (Button)findViewById(R.id.btnAdd);
adapter = new AdapterNote(notes);
lstContent.setAdapter(adapter);
assert btnAdd != null;
btnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
StructNote note = new StructNote();
note.title = "Title";
notes.add(note);
adapter.notifyDataSetChanged();
}
});
مشکلم اینه که وقتی برنامه رو ران میکنم ، و دکمه ی Add رو فشار میدم برنامه کرش میکنه و میگه تو داری منو به یک آبجکتی ک وجود نداره ارجاع میدی یعنی به این دو خط ایراد میگیره :
holder.Note.setText(allNotes.get(position).edtNote.getText().toString());
holder.titleNote.setText(allNotes.get(position).title);
متن کرش هم اینه :
java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object referenceخو
خواهش میکنم اگر کسی راهنمایی داره بهم کمک کنه مشکلم حل بشه !!! ممنونم از وقتی که میذارید
http://s8.picofile.com/file/8279511968/listView.rar.html
این هم لینک پروژه. ممنونم از راهنماییتون
سلام
من سورس شما رو نگاه کردم چندتا مشکل بزرگ داشتید توش
شما باید دکمه ها ، ادیت تکست ها و.. رو داخل متد viewHolder تعریف کنید نه داخل getView !
پیشنهاد میکنم یکبار از اول آموزش بخش لیست ویو استاد رو ببینید البته اینم بگم که من خودم آموزش لیست ویو اکلیس استاد رو دیدم و آموزش ها جدید رو ندیدم ولی تا اونجای که میدونم فک کنم نحوه ی نوشتن لیست ویوتون غلطه.
ببینید مشکل شما اول اینه :
1 - توی آداپترتون توی این خط کد :
شما هنوز آرایه ای نساختین که بیاین متناسب با position مقدارش رو ست کنید.
holder.Note.setText(allNotes.get(position).edtNote.getText().toString());
2- توی این خط کد هم :
شما وقتی روی دکمه ادد همون اول کار میزنی و روی ادیت تکست می خوای بنویسی میاد positionرو میگیره ولی position در کار نیست چون شما روی دکمه ادد کلیک کردی نه روی یکی از ایتم های لیست اگه این دو خط رو حذف کنید درست میشه ولی دیگه نمی تونید ویرایششون کنید
@Override
public void afterTextChanged(Editable s) {
allNotes.get(position).edtNote.setText(s.toString());
}
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .