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

مشکل اساسی رفرش محتویات لیست ویو

محمدجواد  11 سال پیش  11 سال پیش
0 0

سلام دوستان.
من یه مشکلی تو لیست ویو دارم تو stackoverflow هم پرسیدم جوابی که بهم نتیجه بده نگرفتم. اینجا هم چند نفر پرسیدن ولی انگار کسی به نتیجه قطعی نرسیده. خواهشا یه هم افزایی بکنیم جوابش کامل مشخص شه.
من یه لیست ویو دارم که به ازای هر آیتم یه دکمه حذف واسش تعریف کردم. وقتی کاربر روی دیلیت کلیک میکنه قراره اون آیتم از تو دیتابیس و همچنین لیست نمایش برنامه حذف شه. در عمل آیتم با موفقیت از روی دیتابیس پاک میشه اما توی لیست ویو دچار مشکل میشه.

مشکلش به این صورته که اگه مثلا سه تا آیتم با titleهای text1,tex2,text3 تو لیست داشته باشیم و روی دکمه حذف کنار text2 کلیک کنیم اون آیتم از لیست و همچنین دیتابیس حذف میشه اما لیست طوری رفرش میشه که ما سه آیتم text1,text3,text3 خواهیم داشت! یعنی انگار text3 میاد بالا جای text2 رو میگیره اما تو جای قبلی خودش هم میمونه! جالب اینه که وقتی از برنامه خارج میشم و دوباره برمیگردم مشکل برطرف میشه. فک میکنم مشکل باید تو قسمت viewholder باشه. خواهشا یه بررسی کنید جواب رو بزارید مطمئنا خیلی ها استفاده خواهند کرد. اینم از کدهام:

 

public class AdapterNote extends ArrayAdapter {

    public AdapterNote(ArrayList notes) {
        super(G.context, R.layout.adapter_note, notes);
    }
    
private class ViewHolder {

        TextView     txtTitle;
        ImageView    imgDelete;
        public ViewHolder(View view) {
            txtTitle = (TextView) view.findViewById(R.id.txtTitle);
            imgDelete = (ImageView) view.findViewById(R.id.imgDelete);
        }
        public void fill(final ArrayAdapter adapter, final StructNote item, final int position) {
            txtTitle.setText(item.title + "");
            
            imgDelete.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View arg0) {
                    G.notes.remove(item);
                    adapter.remove(item);
                    Commands.deleteDataFromDatabase(item.id);
                    G.adapter.notifyDataSetChanged();
                }
            });
        }
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        StructNote item = getItem(position);
        if (convertView == null) {
            convertView = G.inflater.inflate(R.layout.adapter_note, parent, false);
            holder = new ViewHolder(convertView);
            convertView.setTag(holder);
        }
        else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.fill(this, item, position);
        return convertView;
    }

 

}

0 0
شما مگه اطلاعاتت داخل sqlite ذخیره نمیکنی؟ (11 سال پیش)
0 0
من فکر میکنم که مشکل میتونه از ارایه شما در G.nodeباشه و نه از ViewHolder < دلیلش هم اینه که ارایه شما وقتی از روی دیتابیس پر میشه همچی بخوبی کار میکنه < اما وقتی اون رو از روی اطلاعات خود برنامه بعد از اینکه یک ایتم رو پاک میکنید تغییر می دید < اون ایتم رو از روی ارایه پاک نمیکنید < و یا اگر پاک میکنید < به درستی adapter رو رفرش نمیکنید (11 سال پیش)
+1 0
Crisis به متن سوالم دقت نکردی. روال حذف درسته. مشکل در رفرش شدن لیسته. (11 سال پیش)
0 0
sajad19 اون متد deleteFrmDatabase همین کار رو انجام میده دیگه. (11 سال پیش)
0 0
sajad19 اون متد deleteFrmDatabase همین کار رو انجام میده دیگه. (11 سال پیش)
0 0
sajad19 اون متد deleteFrmDatabase همین کار رو انجام میده دیگه. (11 سال پیش)
0 0
sajad19 اون متد deleteFrmDatabase همین کار رو انجام میده دیگه. (11 سال پیش)
+1 0
اها متوجه نشدم!چرا داره G.adapter رو بروزرساني ميکنه؟در صورتي که adapter رو حذف کرده!بنظر من وقتي متد remove رو فراخواني ميکني ديگه نياز به notifyDataSetChanged نيست!چون خودش refresh ميشه!درسته دوستان؟ (11 سال پیش)
 برای این سوال 1 پاسخ وجود دارد.
پاسخ به سوال 
Criss  11 سال پیش
0 0

نمونه

           imgdelete.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View view) {
//ایتم مورد نظر از اداپتر حذف می شود در نیجه از جی.نات هم حذف میشود و اداپتر خودش "ناتی فای دیتا ست چینج" می شود
ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("id", "" + item.id));
Commands.removeData(params);
adapter.remove(item);

}
});

Class Commands

   public static void removeData(ArrayList<NameValuePair> params) {
WebServiceForPost.readUrls("http://" + G.ip + "/note-server/service.php?action=remove", params);
}
0 0
اینم جواب نداد (11 سال پیش)

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