آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

مشکل در لیست ویو

Atieh  9 سال پیش  9 سال پیش
0 0

سلام دوستان . من یک لیست ویو دارم که هر آیتمش دوتا قسمت داره . یک ادیت تکست و یک تکست ویو . اونا رو توی کلاس 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خو
 

خواهش میکنم اگر کسی راهنمایی داره بهم کمک کنه مشکلم حل بشه !!! ممنونم از وقتی که میذارید



 
0 0
سلام برای راحتی کار میتونید پروژه رو آپلود کنید و لینک بذارید اینجا تا راحتر بشه کمکتون کرد. (9 سال پیش)
0 0
خوب دوست عزیز این Note که نوشتی و مقدار براش ست کردی چی هست چرا مثل عنوان عمل نکردی و تبدیلش کردی به استرینگ (9 سال پیش)
0 0
این Note از جنس EditText هست و توی کلاس ViewHolder تعریف کردم . مثل آموزش استاد که وقتی میخواستند از checkBox و TextView استفاده کنند ، اونا رو توی کلاس ViewHolder تعریف کردند و بعد یه شیء مثل holder از کلاس ViewHolder ساختند . اعضای این کلاسو به StructNote پیوند زدند . متغیر ref هم برای نگهداری position هست . titleNote هم که ماله عنوان هر آیتمه . چون همونطور ک گفتم هر آیتمی دوتا قسمت داره یه ادیت تکست و تکست ویو . حالا گفتم این Note ای ک توی ViewHolder هست ست بشه با اون ادیت تکسی که من توی لایه ام دارم . لینک پروژه رو قرار دادم . اگ بشه که ببینید و یکم راهنماییم کنید تا کارم حل بشه ممنون میشم (9 سال پیش)
 برای این سوال 3 پاسخ وجود دارد.
پاسخ به سوال 
Atieh  9 سال پیش
0 0

http://s8.picofile.com/file/8279511968/listView.rar.html

این هم لینک پروژه. ممنونم از راهنماییتون

پاسخ به سوال 
FSR  9 سال پیش
0 0

سلام

من سورس شما رو نگاه کردم چندتا مشکل بزرگ داشتید توش

 شما باید دکمه ها ، ادیت تکست ها و.. رو داخل متد viewHolder تعریف کنید نه داخل getView !

پیشنهاد میکنم یکبار از اول آموزش بخش لیست ویو استاد رو ببینید البته اینم بگم که من خودم آموزش لیست ویو اکلیس استاد رو دیدم و آموزش ها جدید رو ندیدم ولی تا اونجای که میدونم فک کنم نحوه ی نوشتن لیست ویوتون غلطه.

0 0
خب منم ادیت تکست و اینا رو توی کلاس viewHolder تعریف کردم. تعریفش اونجا بوده اما توی متد getView ست شده (9 سال پیش)
0 0
منظورم همون ست کردن هستش شما باید تویه متد viewHolder ستش کنید و تویه کلاس viewHolder تعریفش کنید (9 سال پیش)
0 0
نه مشکل اون نیست !!!بازم ممنون ک وقت گذاشتید (9 سال پیش)
0 0
آها من دقت نکردم من کد رو براتون توی پاسخ می نویسم؟! (9 سال پیش)
0 0
واقعا ممنونم ازتون . من خیلی درگیرش بودم . چون مشکلاتش زیاده . چون باید مقادیر وارد شده توی ادیت تکست نگه داری بشن تا وقتی کاربر اسکرول میکنه سرجاشون باقی بمونن . مثل همون چک باکسی ک استاد توی پروژه و آموزششون گفتند . که وقتی تیکشو میزدی و اسکرول میکردی ، تیکش برداشته میشد . اینجا هم وقتی توی ادیت تکست ی چیزی بنویسی و اسکرول کنی میره . اگ ممکنه کمکم کنید حل بشه مشکلم . (9 سال پیش)
پاسخ به سوال 
Shadow  9 سال پیش
+1 0

ببینید مشکل شما اول اینه :

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());
                                         }

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