Android görünüşlər siyahısını necə yeniləyə bilər?

Dinamik verileri əlavə etdikdən / sildikdən sonra Android ListView yenilənməsi necədir?

402
12 февр. UMAR 12 fevral təyin etdi 2010-02-12 12:31 '10 at 12:31 2010-02-12 12:31
@ 25 cavab

Bu adapterdəki məlumatları dəyişdikdən sonra Adapter obyektinizə notifyDataSetChanged() çağırın.

notifyDataSetChanged() necə və necə çağırdığınızın bəzi əlavə xüsusiyyətləri bu Google Video I / O-da görünə bilər.

507
12 февр. Christopher Orr tərəfindən verilmiş cavab 12 fevral 2010-02-12 12:45 '10 at 12:45 'da 2010-02-12 12:45

Bunu da istifadə edə bilərsiniz:

border=0
 myListView.invalidateViews(); 
194
29 нояб. Cavab Bobs tərəfindən 29 noyabrda verilir. 2011-11-29 14:07 '11 at 14:07 2011-11-29 14:07

Xahiş edirik, bütün suallara invalidate() , invalidateViews() , invalidateViews() , requestLayout() , ... bu suala cavab requestLayout() .

notifyDataSetChanged() doğru şey (və, notifyDataSetChanged() cavab olaraq onu da qeyd etmək notifyDataSetChanged() adapterinizdə notifyDataSetChanged() çağırmaqdır .

Problem axtarış

notifyDataSetChanged() zəng notifyDataSetChanged() , bütün layout üsulları da kömək etmir. İnanın, ListView düzgün şəkildə güncəlləşdi. Fərqini tapa bilmirsəniz, məlumatların adapterinizdə olduğu yerləri yoxlamaq lazımdır.

Bu yalnız yaddaşda saxladığınız bir kolleksiyasa, notifyDataSetChanged() əvvəl həqiqətən notifyDataSetChanged() və ya bir elementə kolleksiyaya əlavə olunmasına əmin olun.

Bir verilənlər bazası və ya xidmət backend ilə notifyDataSetChanged() əvvəl məlumatları yenidən əldə etmək üçün (və ya məlumatları yaddaşda idarə etmək üçün) bir üsul notifyDataSetChanged() .

Əslində, bu notifyDataSetChanged məlumat dəsti notifyDataSetChanged işləyir. Beləliklə, bu baş verə biləcək dəyişiklikləri görməməyinizə diqqət yetirməli bir yerdir. Gerekirse hata düzeltme.

ArrayAdapter vs BaseAdapter

Bir BaseAdapter kimi bir kolleksiyanı idarə etməyə imkan verən bir adapterlə işləyib daha yaxşı işlədiyini gördüm. ArrayAdapter kimi bəzi adapterlər artıq öz kolleksiyasını idarə edir və yeniləmələr üçün müvafiq kolleksiyaya daxil olmaq çətinləşir. Bu, həqiqətən, əksər hallarda lazımsız bir əlavə mürəkkəblik səviyyəsidir.

Ui mövzu

Doğrudur ki, bu UI mövzularından çağırılmalıdır. Digər cavablarda bunun necə olacağına dair nümunələr var. Lakin, bu istifadəçi interfeysi mövzu xaricində bu məlumatlarla işlədiyiniz halda tələb olunur. Bu bir istifadəçi interfeysi olmayan xidmət və ya mövzu deyil. Sadə hallarda, bir düyməni və ya başqa bir hərəkət / parçaya basaraq məlumatları yeniləyəcəksiniz. Yəni hələ də UI işarəsində. Həmişə bu runOnUiTrhead embed ehtiyac yoxdur.

Tez nümunə layihəsi

Bunu https://github.com/hanscappelle/so-2250770.git ünvanından tapa bilərsiniz. Yalnız Android Studio-da klonlayın və layihəni açın (gradle). Bu layihə MainAcitivity-ə malikdir, bütün təsadüfi məlumatlarla ListView yaratmaq. Bu siyahı hərəkət menyusundan istifadə etməklə yenilənə bilər.

Bu nümunə ModelObject üçün yaratdığım adapter tətbiqləri məlumatların toplanmasını təmin edir.

 public class MyListAdapter extends BaseAdapter {  private List<ModelObject> mData;  public MyListAdapter(final Context context, final List<ModelObject> mData) { this.mData = mData; this.mContext = context; } public List<ModelObject> getData() { return mData; } // implement all abstract methods here } 

MainActivity-dən kod

 public class MainActivity extends Activity { private MyListAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView list = (ListView) findViewById(R.id.list); // create some dummy data here List<ModelObject> objects = getRandomData(); // and put it into an adapter for the list mAdapter = new MyListAdapter(this, objects); list.setAdapter(mAdapter); // mAdapter is available in the helper methods below and the // data will be updated based on action menu interactions // you could also keep the reference to the android ListView // object instead and use the {@link ListView#getAdapter()} // method instead. However you would have to cast that adapter // to your own instance every time }  private void reloadAllData(){ // get new modified random data List<ModelObject> objects = getRandomData(); // update data in our adapter mAdapter.getData().clear(); mAdapter.getData().addAll(objects); // fire the event mAdapter.notifyDataSetChanged(); }  private void scrambleChecked(){ Random random = new Random(); // update data in our adapter, iterate all objects and // resetting the checked option for( ModelObject mo : mAdapter.getData()) { mo.setChecked(random.nextBoolean()); } // fire the event mAdapter.notifyDataSetChanged(); } } 

Əlavə məlumat

Siyahıların gücü haqqında digər yaxşı bir yazı burada tapa bilərsiniz: http://www.vogella.com/articles/AndroidListView/article.html

145
23 мая '13 в 10:43 2013-05-23 10:43 cavab xcpl tərəfindən 23 May '13, 10:43 2013-05-23 10:43 'də verilir

İstədiyiniz zaman zənglər edilir:

 runOnUiThread(run); 

OnCreate() , sizin runnable mövzu seçin:

 run = new Runnable() { public void run() { //reload content arraylist.clear(); arraylist.addAll(db.readAll()); adapter.notifyDataSetChanged(); listview.invalidateViews(); listview.refreshDrawableState(); } }; 
40
18 февр. Cavab 18 fevralda Marckaraujo tərəfindən verilir . 2014-02-18 21:49 '14 at 9:49 PM 2014-02-18 21:49

Dinamik olaraq siyahımı yeniləmə ilə əlaqədar problemlər yaşanır.

Uyarıcı üçün notifyDataSetChanged () çağırın.

NotifyDataSetChanged () 'ı çağırırken bu Google I / O video reklamında nasıl ve nasıl ekleneceğinin bazı özellikleri.

notifyDataSetChanged () mənim vəziyyətimdə düzgün işləmir [başqa bir sinifdən notifyDataSetChanged deyirəm]. Yalnız ListView-i cari fəaliyyətdə (mövzu) düzəldəndə. Christopher sayəsində bu video son işarə verdi.

Mən ikinci sinifdə istifadə etdim

 Runnable run = new Runnable(){ public void run(){ contactsActivity.update(); } }; contactsActivity.runOnUiThread(run); 

aktivliyimdən yeniləməyə () daxil olmaq. Bu yeniləmə daxildir

 myAdapter.notifyDataSetChanged(); 

görünüşü yeniləmək üçün adapterə məlumat vermək. Mən deyə bilərik ki, yaxşı işləmişdir.

11
13 сент. Cavab Wille 13 Sentyabr verilir. 2011-09-13 14:28 '11 saat 14:28 'də 2011-09-13 14:28

Bir SimpleCursorAdapter istifadə edirsinizsə , bir cursor obyektində zəng tələb edin () .

9
25 июня '11 в 11:46 2011-06-25 11:46 cavab 25 iyun 'da 11:46' də verildi. 2011-06-25 11:46

ListView Refreshment ilə razı deyilsinizsə, bu snippet'i bilərsiniz, bu, siyahısıView verilənlər bazasından yükləmək üçündür. Həqiqətən, hər hansı bir CRUD əməliyyatını yerinə yetirdikdən sonra ListView-i yenidən yükləməlisiniz. Bu ən yaxşı kodlama metodu deyil, ancaq ListView-i yeniləyir.

Bu mənim üçün işləyir .... u ən yaxşı həll taparsa, paylaşın ...

 ....... ...... CRUD Əməliyyatlarını edin .. ...... ..... DBAdapter.open (); DBAdapter.insert_into_SingleList (); // DB_results gətirin və onun məzmunu kimi siyahısına əlavə edin .... ls2.setAdapter (yeni ArrayAdapter (DynTABSample.this, android.R.layout.simple_list_item_1, DBAdapter.DB_ListView)); DBAdapter.close ();
5
25 авг. cavab Nandagopal T 25 aug verilir. 2010-08-25 14:34 '10 at 14:34 2010-08-25 14:34

Bu post işində insanların təklif etdiyi həllər və ya əsasən Android cihazınızın versiyasına asılı olmayaraq. Məsələn, AddAll metodunu istifadə etmək üçün Android cihazını android qoymalısınız: minSdkVersion = "10".

Bütün qurğular üçün bu məsələləri həll etmək üçün mənim adapterimdə öz üsulum yaratdım və içəridən istifadə etdim və ArrayAdapter-dən çıxarmaq üçün metodlar əlavə etdim ki, bu da məlumatlarınızı heç bir problem olmadan yeniləyir.

Mənim kodum: öz RaceResult data sinifini istifadə edərək, öz məlumat modelinizi istifadə edirsiniz.

ResultGpRowAdapter.java

 public class ResultGpRowAdapter extends ArrayAdapter<RaceResult> { Context context; int resource; List<RaceResult> data=null; public ResultGpRowAdapter(Context context, int resource, List<RaceResult> objects) { super(context, resource, objects); this.context = context; this.resource = resource; this.data = objects; } @Override public View getView(int position, View convertView, ViewGroup parent) { ........ } //my own method to populate data public void myAddAll(List<RaceResult> items) { for (RaceResult item:items){ super.add(item); } } 

ResultsGp.java

 public class ResultsGp extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { ........... ........... ListView list = (ListView)findViewById(R.id.resultsGpList); ResultGpRowAdapter adapter = new ResultGpRowAdapter(this, R.layout.activity_result_gp_row, new ArrayList<RaceResult>()); //Empty data list.setAdapter(adapter); .... .... .... //LOAD a ArrayList<RaceResult> with data ArrayList<RaceResult> data = new ArrayList<RaceResult>(); data.add(new RaceResult(....)); data.add(new RaceResult(....)); ....... adapter.myAddAll(data); //Your list will be udpdated!!! 
2
19 июня '14 в 19:53 2014-06-19 19:53 AntuanSoft cavab 19 iyun '14, 19:53 2014-06-19 19:53 'də verilir

Yalnız myArrayList.remove(position); istifadə edin myArrayList.remove(position); dinləyici içərisində:

  myListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, android.view.View view, int position, long id) { myArrayList.remove(position); myArrayAdapter.notifyDataSetChanged(); } }); 
1
14 февр. Cavab Steffo Dimfelt tərəfindən verilir. 2018-02-14 01:33 '18, 1:33 201-02-14 01:33

Bu siyahıdan ListView -də ListView məlumatları ehtiva edən bir obyektdən istifadə ListView . Bağlantı dəyişirsə, notifyDataSetChanged() işləmir. Siyahı görünüşündən maddələr çıxardıqda, onları istifadə etdiyiniz siyahıdan, ArrayList <> və ya başqa bir şey olsun, sonra adapterinizin obyekti üçün notifyDataSetChanged() . təlim sinifi.

Beləliklə, mənim adapterimdə necə idarə etdiyinə baxın, aşağıya baxın.

 public class CountryCodeListAdapter extends BaseAdapter implements OnItemClickListener{ private Context context; private ArrayList<CountryDataObject> dObj; private ViewHolder holder; private Typeface itemFont; private int selectedPosition=-1; private ArrayList<CountryDataObject> completeList; public CountryCodeListAdapter(Context context, ArrayList<CountryDataObject> dObj) { this.context = context; this.dObj=dObj; completeList=new ArrayList<CountryDataObject>(); completeList.addAll(dObj); itemFont=Typeface.createFromAsset(context.getAssets(), "CaviarDreams.ttf"); } @Override public int getCount() { return dObj.size(); } @Override public Object getItem(int position) { return dObj.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View view, ViewGroup parent) { if(view==null){ holder = new ViewHolder(); LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = inflater.inflate(R.layout.states_inflator_layout, null); holder.textView = ((TextView)view.findViewById(R.id.stateNameInflator)); holder.checkImg=(ImageView)view.findViewById(R.id.checkBoxState); view.setTag(holder); }else{ holder = (ViewHolder) view.getTag(); } holder.textView.setText(dObj.get(position).getCountryName()); holder.textView.setTypeface(itemFont); if(position==selectedPosition) { holder.checkImg.setImageResource(R.drawable.check); } else { holder.checkImg.setImageResource(R.drawable.uncheck); } return view; } private class ViewHolder{ private TextView textView; private ImageView checkImg; } public void getFilter(String name) { dObj.clear(); if(!name.equals("")){ for (CountryDataObject item : completeList) { if(item.getCountryName().toLowerCase().startsWith(name.toLowerCase(),0)){ dObj.add(item); } } } else { dObj.addAll(completeList); } selectedPosition=-1; notifyDataSetChanged(); notifyDataSetInvalidated(); } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Registration reg=(Registration)context; selectedPosition=position; reg.setSelectedCountryCode("+"+dObj.get(position).getCountryCode()); notifyDataSetChanged(); } } 
1
25 авг. cavab ADM 25 avqustda verilir. 2015-08-25 17:09 '15 at 17:09 'də yollanacaq

Yeniləmə zamanı kaydırma mövqeyini qorumaq istəyirsinizsə və bunu edə bilərsiniz:

 if (mEventListView.getAdapter() == null) { EventLogAdapter eventLogAdapter = new EventLogAdapter(mContext, events); mEventListView.setAdapter(eventLogAdapter); } else { ((EventLogAdapter)mEventListView.getAdapter()).refill(events); } public void refill(List<EventLog> events) { mEvents.clear(); mEvents.addAll(events); notifyDataSetChanged(); } 

Ətraflı məlumat üçün Android ListView-ə baxın: yenilənmə zamanı kaydırma mövqeyini qoruyun .

1
01 авг. cavab Brandon Yang 01 avqustda verilir. 2014-08-01 07:57 '14 da 7:57 2014-08-01 07:57

Xidmətdən istifadəçi interfeyslərinin siyahısını yeniləmək istəyirsinizsə, əsas fəaliyyətinizdə adapter statik olun və aşağıdakıları yerinə yetir:

 @Override public void onDestroy() { if (MainActivity.isInFront == true) { if (MainActivity.adapter != null) { MainActivity.adapter.notifyDataSetChanged(); } MainActivity.listView.setAdapter(MainActivity.adapter); } } 
0
21 июня '13 в 16:52 2013-06-21 16:52 Cavab Mayank Saini tərəfindən 21 İyun, '13 'də saat 16:52' da 2013-06-21 16:52 'də verilir

DataSetChanged'i yalnız yeni adapter məlumatları əldə edərək, sonra qeydləri təqdim etmək üçün adapterin yenidən qurulmasını və sonra aşağıdakıları zəng etməklə idarə edə bildim:

  expandableAdapter = baseFragmentParent.setupEXLVAdapter(); baseFragmentParent.setAdapter(expandableAdapter); expandableAdapter.notifyDataSetChanged(); 
0
12 марта '16 в 0:11 2016-03-12 00:11 Cavab Kristy Welsh tərəfindən 12 Mart '06 ' da 0:11 2016-03-12 00:11' də verilir

Siyahı adapterinizə ötürdüyünüzü düşünün.
İstifadə edin:

list.getAdapter().notifyDataSetChanged()

siyahınızı yeniləyin.

0
29 июля '18 в 19:56 2018-07-29 19:56 Cavab Malv tərəfindən 29 iyul '18 saat 19:56 2018-07-29 19:56 'də verilir

Digər variant onWindowFocusChanged metodudur, lakin həssasdır və bunun üçün maraqlı olan əlavə kodlaşdırma tələb olunur.

  override fun onWindowFocusChanged(hasFocus: Boolean) { super.onWindowFocusChanged(hasFocus) // some controls needed programList = usersDBHelper.readProgram(model.title!!) notesAdapter = DailyAdapter(this, programList) notesAdapter.notifyDataSetChanged() listview_act_daily.adapter = notesAdapter } 
0
21 июля '18 в 21:54 2018-07-21 21:54 cavab Sam 21 iyul, 21 saat 21: 2018-07-21 21:54 tarixində verilir

Siz Android Explorer xəttlərini təqib etsəniz və ContentProviders dən Database məlumat almaq üçün istifadə CursorLoaderCursorAdapters CursorLoaderCursorAdapters istifadə edərək ListView -də CursorAdapters , hər şeyi müvafiq olaraq ListView-də göstərəcəkdir.

getContext().getContentResolver().notifyChange(uri, null); ContentProvider kursor dəyişiklikləri əks etdirmək üçün kifayətdir. Əlavə işə ehtiyac yoxdur.

Amma bütün bunları istifadə etmədiyiniz zaman, data seti dəyişdirildikdə adapterə məlumat verməlisiniz. Ayrıca data notifyDataSetChanged() məsələn, bir siyahı) yenidən doldurub / yenidən yükləyin və notifyDataSetChanged() .

notifyDataSetChanged() tarixdə heç bir dəyişiklik olmadıqda işləmir. Sənədlərdə yuxarıda göstərilən şərh -

  
0
31 окт. Sanjeet A 31 Oct 2015-10-31 19:32 '15 'da 19:32' da, 2015-10-31 19:32

Siyahıda göstərmək istədiyim bir ArrayList var idi. ArrayList mysql-dən elementləri ehtiva edir. Yeniləmə üsulunu ləğv etdim və bu üsulla tablelayout.removeAllViews () istifadə etdim; məlumat bazasının yenidən əldə edilməsi prosesini təkrarladı. Amma bundan əvvəl, ArrayList və ya hər hansı bir məlumat strukturunu təmizləmək üçün əmin olun, əks halda yeni məlumat köhnə versiyaya əlavə olunacaq.

0
03 марта '15 в 20:04 2015-03-03 20:04 Cavab Kshitij G tərəfindən 03.03 ' də saat 20:04' də verilir. 2015-03-03 20:04

Hesab edirəm ki, yenilənmə ilə nə deməkdir. GUI ekranının yenilənməsi lazımdır və ya uşaq görünüşlərinin yenilənməsi lazım olduğunu bildirirsiniz, bu səbəbdən getChildAt (int) proqramlı olaraq zəng edə və adapterdə olanlara uyğun görünüş əldə edə bilərsiniz.

GUI GUI'sini yeniləmək istəyirsinizsə, sonra adapterdə notifyDataSetChanged () çağırın. GUI yenidən tərtib edildikdən sonra yenilənəcək.

GetChildAt (int) zəng etmək və adapterdə olanları əks etdirən bir görünüş əldə etmək istəyirsinizsə, layoutChildren () çağırın. Bu, uşaq görünüşünü adapter məlumatlarından bərpa edəcəkdir.

0
19 янв. Cavab verildi 19 Yanvar . 2015-01-19 18:29 '15 saat 18:29 'də 2015-01-19 18:29

Fragmanda ListView (eyni TextView ilə) bir müddət taranan BLE cihazlarının MAC ünvanı ilə doldurmaq istədikdə eyni idi.

Bunu etdi:

 public class Fragment01 extends android.support.v4.app.Fragment implements ... { private ListView listView; private ArrayAdapter<String> arrayAdapter_string; ... @Override public void onActivityCreated(Bundle savedInstanceState) { ... this.listView= (ListView) super.getActivity().findViewById(R.id.fragment01_listView); ... this.arrayAdapter_string= new ArrayAdapter<String>(super.getActivity(), R.layout.dispositivo_ble_item, R.id.fragment01_item_textView_titulo); this.listView.setAdapter(this.arrayAdapter_string); } @Override public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) { ... super.getActivity().runOnUiThread(new RefreshListView(device)); } private class RefreshListView implements Runnable { private BluetoothDevice bluetoothDevice; public RefreshListView(BluetoothDevice bluetoothDevice) { this.bluetoothDevice= bluetoothDevice; } @Override public void run() { Fragment01.this.arrayAdapter_string.add(new String(bluetoothDevice.toString())); Fragment01.this.arrayAdapter_string.notifyDataSetChanged(); } } 

Sonra ListView tapılan cihazların MAC ünvanlarını dinamik olaraq doldurmağa başladı.

0
16 сент. Cavab 16 sentyabr jsanmarb verilir 2014-09-16 02:52 '14 da 2:52 2014-09-16 02:52

Mənim SimpleAdapter'ımı yeniləməyə çalışmaq üçün notifyDataSetChanged () ala bilmədim, bunun əvəzinə removeAllViews () istifadə edərək, üst düzeye əlavə edilmiş bütün görünüşləri aradan qaldırmaq üçün ilk cəhd etdilər, sonra da bir ListView əlavə etdim və bu, interfeys:

 LinearLayout results = (LinearLayout)findViewById(R.id.results); ListView lv = new ListView(this); ArrayList<HashMap<String,String>> list = new ArrayList<HashMap<String,String>>(); SimpleAdapter adapter = new SimpleAdapter( this, list, R.layout.directory_row, new String[] { "name", "dept" }, new int[] { R.id.name, R.id.dept } ); for (...) { HashMap<String, String> map = new HashMap<String, String>(); map.put("name", name); map.put("dept", dept); list.add(map); } lv.setAdapter(adapter); results.removeAllViews(); results.addView(lv); 
0
22 авг. Cavab Chasden 22 aug verilir . 2013-08-22 19:38 '13 at 19:38 2013-08-22 19:38

Siyahı görünüşündən məlumatları sildikdən sonra, refreshDrawableState() . Burada bir nümunə:

 final DatabaseHelper db = new DatabaseHelper (ActivityName.this); db.open(); db.deleteContact(arg3); mListView.refreshDrawableState(); db.close(); 

DatabaseHelper sınıfındaki deleteContact metodu bir qədər bənzər olacaq

 public boolean deleteContact(long rowId) { return db.delete(TABLE_NAME, BaseColumns._ID + "=" + rowId, null) > 0; } 
0
22 марта '12 в 18:04 2012-03-22 18:04 Cavab 22 mart 2012 -ci il saat 18 : 00 -da user1031852 tərəfindən verilmişdir 2012-03-22 18:04

SimpleCursorAdapter istifadə edərkən, adapterdə changeCursor (newCursor) deyə bilərsiniz.

0
06 февр. Vihaan Verma tərəfindən verilmiş cavab 06 fevral. 2014-02-06 21:17 '14 at 21:17 2014-02-06 21:17

Mənim üçün SQL verilənlər bazasında məlumat dəyişdirildikdən sonra, heç bir şey notifyDataSetChanged () kömək etmirsə, ilk növbədə siyahısı silin və bu zəngdən sonra notifyDataSetChanged () əlavə edə bilərsiniz, çünki siyahısı görünüşünü (müəyyən bir genişlənən siyahısı görünüşü) yenilə bilər. Məsələn,

 private List<List<SomeNewArray>> arrayList; List<SomeNewArray> array1= getArrayList(...); List<SomeNewArray> array2= getArrayList(...); arrayList.clear(); arrayList.add(array1); arrayList.add(array2); notifyDataSetChanged(); 

Ümid edirəm ki, bu sizin üçün əhəmiyyətlidir.

0
09 июля '13 в 15:37 2013-07-09 15:37 Cavab Aivus tərəfindən 09 iyul '13 'də 15:37 2013-07-09 15:37' də verilir

Burada mənim skriptlərim haqqında söhbət etsəm, yuxarıda göstərilən cavabların heç biri işləməyəcək, çünki silmək düyməsi ilə birlikdə verilənlər bazasında dəyərlər siyahısını nümayiş etdirən və silmək düyməsinə basıldığında siyahıdan bu elementi çıxarmaq istərdim .

Səmimi bir şey mənim bir rezululyator görünüşünü istifadə etmədi, amma sadə bir siyahı görünüşü idi və bu siyahı görünüşü adapter sinifində başlandı. Beləliklə, çağırış notifyDataSetChanged() adapter sinifində və hətta adapter obyektinin yerləşdirildiyi fəaliyyət sinifində heç bir şey etməyəcək, çünki silmək üsulu adapter sinifindədir.

Beləliklə, həll obyekti adapterin getView sinif metodunda getView çıxarmaq idi (yalnız bu xüsusi obyekti aradan qaldırmaq üçün, amma hər şeyi silmək üçün clear() ) çağırın.

Mənim kodumun nə olduğunu anladığınız üçün,

 public class WordAdapter extends ArrayAdapter<Word> { Context context; public WordAdapter(Activity context, ArrayList<Word> words) {} //....... @NonNull @Override public View getView(final int position, View convertView, ViewGroup group) { //....... ImageButton deleteBt = listItemView.findViewById(R.id.word_delete_bt); deleteBt.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (vocabDb.deleteWord(currentWord.id)) { //..... } else{ //..... } remove(getItem(position)); // <---- here is the trick ---< //clear() // if you want to clear everything } }); //.... 

Qeyd: Burada remove()getItem() üsulları Adapter sinifindən miras alınır.

  • remove() - tıklanan bir xüsusi maddə aradan qaldırılması üçün
  • getItem(position) maddəni əldə etməkdir (burada, bu siyahıya əlavə etdiyim Word getItem(position) onlar tıkladığı mövqe.

Fəaliyyət sinifində siyahıdan keçirmək üçün adapterin necə qurulduğunu budur,

  ArrayList<Word> wordList = new ArrayList(); WordAdapter adapter = new WordAdapter(this, wordList); ListView list_view = (ListView) findViewById(R.id.activity_view_words); list_view.setAdapter(adapter); 
0
08 окт. Cavab Blasanka 08-də verilir . 2018-10-08 20:33 '18 saat 20:33 'də 2018-10-08 20:33

Ən asan sadəcə yeni Adaper yaratmaq və köhnəni silməkdir:

 myListView.setAdapter(new MyListAdapter(...)); 
-1
28 нояб. Cavab 28 noyabr tarixində user1712200 tərəfindən verilir . 2017-11-28 18:45 '17 'də saat 18:45 ' də 2017-11-28 18:45