Androidリストビューを更新するには?


436

ListView動的データを追加/削除した後にAndroidを更新するにはどうすればよいですか?


3
他の解決策が機能しない場合は、refreshDrawableStateを試してください。stackoverflow.com/questions/5186359/…
エドウィンエヴァンス

ヘルプあなた、かもしれstackoverflow.com/a/17333384/596555
boiledwater

ここの例tutorialkart.com/kotlin-android/…が役立つかもしれません。
マリカルジュンM 2018

回答:


530

そのアダプターのデータを変更notifyDataSetChanged()したら、Adapterオブジェクトを呼び出します。

通話の方法/タイミングに関する詳細はnotifyDataSetChanged()このGoogle I / Oビデオで確認できます。


24
UIスレッドで実行する必要があります。UIスレッド内でハンドラーを作成し、それにRunableをポストします
Kirill Kulakov

11
繰り返しますが、notifyDataSetChanged()は、推奨されている使用方法(少なくとも非推奨ではありません)では機能しません。リストビュー、カーソルアダプター、およびコンテンツプロバイダーを使用する場合は、gettLoaderManager()。restartLoader()を試してみてください。参照:stackoverflow.com/a/19657500/1087411 notifyDataSetChanged()に関する少なくともいくつかのドキュメントを参照したいと思います。Androidの多くはブラックボックステストに任されています。
アンダーソン

notifyDataSetChangedが機能しない場合は、それが間違っているのはあなたです
zdarsky.peter '

4
notifyDataSetChangedは常に機能するとは限りません。これが競合している理由はわかりません。古いビューをクリアするには、listView.setAdapter(adapter)を呼び出す必要がある場合があります。関連項目:stackoverflow.com/a/16261588/153275

1
notifyDataSetChangedを機能させることができませんでした。アダプターにフィードするコレクションが変更された(要素が削除された)ことは明らかですが、notifyDataSetChangedは何も実行していません。このメソッドが壊れているだけなのかわかりませんか?
byemute

204

また、これを使用できます:

myListView.invalidateViews();

22
ビューを再描画するだけでよい場合は、これが正しい答えです。たとえば、listViewの各ビュー内でより多くの情報またはオプションを公開する必要があるユーザーログインが発生した後。それが私がする必要があったので、賛成票を投じました。基本となるデータが変更される場合は、おそらくnotifyDataSetChanged()を使用することをお勧めします。
SBerg413 2013

実際invalidateViews()にはソースコードセットにmDataChanged = true;含まれているので、これが次のものと比較してパフォーマンスが向上するかどうかはnotifyDataSetChanged()
わかり

あなたは私の日を救った、おい!
oskarko

「監視可能なリスト」であるリストのタイプを使用できます。データセットを変更する必要はありません
Priya

153

すべて無視してくださいinvalidate()invalidateViews()requestLayout()この質問への、...答えを。

正しいこと(そして幸いにも正しい答えとしてマークされていること)は、アダプタを呼び出すことですnotifyDataSetChanged()です。

トラブルシューティング

呼び出しnotifyDataSetChanged()が機能しない場合、すべてのレイアウトメソッドも役に立ちません。私を信じてListView適切に更新されました。違いを見つけることができない場合は、アダプターのデータの出所を確認する必要があります。

これが単なるメモリ内のコレクションである場合は、を呼び出す前に、コレクションからアイテムを実際に削除または追加したことを確認してくださいnotifyDataSetChanged()

データベースまたはサービスのバックエンドを使用している場合、を呼び出す前に、メソッドを呼び出して情報を再度取得する(またはメモリ内のデータを操作する)必要がありnotifyDataSetChanged()ます。

問題はnotifyDataSetChanged、データセットが変更された場合にのみ機能することです。ですから、そこに変化が見られない場合は、ここで確認してください。必要に応じてデバッグします。

ArrayAdapterとBaseAdapter

BaseAdapterのように、コレクションの管理を可能にするアダプターを使用するほうがうまくいくことがわかりました。ArrayAdapterのような一部のアダプタは、すでに独自のコレクションを管理しているため、更新のための適切なコレクションにアクセスすることが難しくなっています。ほとんどの場合、それは本当に必要のない余分な困難の層です。

UIスレッド

これは、UIスレッドから呼び出す必要があるのは事実です。他の回答には、これを達成する方法の例があります。ただし、これは、UIスレッドの外部からこの情報に取り組んでいる場合にのみ必要です。これは、サービスまたは非UIスレッドからのものです。単純なケースでは、ボタンクリックまたは別のアクティビティ/フラグメントからデータを更新します。したがって、まだUIスレッド内にあります。そのrunOnUiTrheadを常にポップする必要はありません。

簡単なサンプルプロジェクト

見つけることができhttps://github.com/hanscappelle/so-2250770.git。Android Studio(gradle)でプロジェクトを複製して開きます。このプロジェクトには、MainAcitivityを構築するListViewすべてのランダムデータを含むます。このリストは、アクションメニューを使用して更新できます。

このサンプルModelObject用に作成したアダプター実装は、データコレクションを公開します

public class MyListAdapter extends BaseAdapter {

    /**
     * this is our own collection of data, can be anything we 
     * want it to be as long as we get the abstract methods 
     * implemented using this data and work on this data 
     * (see getter) you should be fine
     */
    private List<ModelObject> mData;

    /**
     * our ctor for this adapter, we'll accept all the things 
     * we need here
     *
     * @param 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からのコード

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
    }

    /**
     * helper to show what happens when all data is new
     */
    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();
    }

    /**
     * helper to show how only changing properties of data 
     * elements also works
     */
    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();
    }
}

詳しくは

listViewsの機能に関するもう1つの素晴らしい投稿は、http://www.vogella.com/articles/AndroidListView/article.htmlにあります。


16
あなたが間違っている。notifyDataSetChanged()は機能しませんでしたが、invalidateViews()は正しく機能しました。
babay 2013

6
リスト内の実際の要素が変わらない、たとえば同じ量の要素があるという問題があります。しかし問題は、それらが提示される方法を変更する必要があることです。つまり、UIを構築するためのアダプターのコードを再度実行して、リスト行の一部の要素を正しく非表示にする必要があります。notifyDataSetChanged()が機能しません...
Sven Haiges

9
この答えは本当に私を助けました。特定の機能上の理由で、配列をメモリに保持していました。それを修正するために、私は今、呼び出しadapter.clear()、およびadapter.addAll(Array<T>)呼び出す前にnotifyDataSetChanged()
マイケルDePhillips

2
@ hcpl、CheckBoxのアダプターのOnClickListenerにいる場合、notifyDataSetChangedをどのように呼び出す必要がありますか?invalidateViewsは現在、ジョブを完了しています。invalidateViewsが間違ったメソッドを呼び出すのはなぜですか?
craned

1
notifyDataSetChangedを機能させることができませんでした。アダプターにフィードするコレクションが変更された(要素が削除された)ことは明らかですが、notifyDataSetChangedは何も実行していません。このメソッドが壊れているだけなのかわかりませんか?
byemute

42

いつでもrunnableを呼び出します。

runOnUiThread(run);

OnCreate()、あなたはあなたの実行可能なスレッドを設定します:

run = new Runnable() {
    public void run() {
        //reload content
        arraylist.clear();
        arraylist.addAll(db.readAll());
        adapter.notifyDataSetChanged();
        listview.invalidateViews();
        listview.refreshDrawableState();
    }
};

1
私の場合も機能しています。TCP接続からのデータ(「nonUI」スレッドから)に基づいてリストビューを更新する必要があります。リストを再描画する唯一の方法は、ArrayListのすべての要素をクリアして再度追加することでした。とにかく、既にUIスレッドを使用している場合は、runOnUiThread()関数を介してコードを呼び出す必要はありません。
Andre

ありがとう!わたしにはできる。フラグメントからこれを実行したいすべての人々のために、あなたはgetActivityを(使用する必要があります)runOnUiThread(新しいRunnableを...確認コードがUIスレッド上で実行されていることを確認します。
codingpuss

私は目的を理解しておらずrun = new Runnable()、自分のpublic void refreshUIThread()メソッドをモデル化するメソッドを機能に与えましたrun()(これも機能します)
T.Woody

11

リストビューの動的更新で問題が発生しました。

アダプタでnotifyDataSetChanged()を呼び出します。

notifyDataSetChanged()を呼び出す方法/タイミングの詳細は、このGoogle I / Oビデオで確認できます。

notifyDataSetChanged()が正しく動作しなかった[別のクラスからnotifyDataSetChangedを呼び出した]。念のため、実行中のアクティビティ(スレッド)でListViewを編集しました。クリストファーのおかげでそのビデオは最後のヒントを与えました。

私の2番目のクラスで使用しました

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

アクティビティからupdate()にアクセスします。このアップデートには

myAdapter.notifyDataSetChanged();

アダプタにビューを更新するように指示します。私の言う限りではうまくいきました。



5

それでもListViewのリフレッシュメントに満足できない場合は、このスニペットを見ることができます。これは、DBからlistViewをロードするためのものです。実際に行う必要があるのは、CRUD操作を実行した後、ListViewをリロードすることだけです。コードですが、必要に応じてListViewを更新します。

それは私のために働きます...あなたがより良い解決策を見つけたら、共有してください...

……
……
CRUD操作を実行します。
……
.....
DBAdapter.open();
DBAdapter.insert_into_SingleList();
//そのDB_resultsを持ってきて、コンテンツとしてリストに追加します...
                                            ls2.setAdapter(new ArrayAdapter(DynTABSample.this、
    android.R.layout.simple_list_item_1、DBAdapter.DB_ListView));
                                            DBAdapter.close();

2

この投稿で人々が提案した解決策は、お使いのデバイスのAndroidバージョンに応じて機能するか機能しないかを示しています。たとえば、AddAllメソッドを使用するには、android:minSdkVersion = "10"をAndroidデバイスに配置する必要があります。

すべてのデバイスについてこの質問を解決するには、アダプターで独自のメソッドを作成し、addおよびremoveメソッドの内部で使用します。ArrayAdapterから継承し、問題なくデータを更新します。

私のコード:独自のデータクラスRaceResultを使用して、独自のデータモデルを使用します。

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!!!

1

リフレッシュ時にスクロール位置を維持したい場合、これを行うことができます:

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

詳細については、Androidリストビュー:更新時にスクロール位置を維持するをご覧ください。


1

myArrayList.remove(position);リスナー内で使用するだけです:

  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

そのリストの単一のオブジェクトを使用して、データを膨らませる必要がありますListView。参照が変更された場合、notifyDataSetChanged()機能しません。リストビューから要素を削除する場合は 常に、使用しているリストから要素を削除します。それがArrayList <>か何かであるかは、notifyDataSetChanged()アダプタクラスのオブジェクトで呼び出し ます。

だからここで私が私のアダプターでそれをどのように管理したかを見てください

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
あなたの説明は過小評価されていますが、それは本当に配列リスト参照についての理解を与えてくれます。ありがとう
アブラハムプトラプラカーサ

0

リストビューからデータを削除した後、を呼び出す必要がありますrefreshDrawableState()。次に例を示します。

final DatabaseHelper db = new DatabaseHelper (ActivityName.this);

db.open();

db.deleteContact(arg3);

mListView.refreshDrawableState();

db.close();

そしてクラスのdeleteContactメソッドはDatabaseHelper多少のようになります

public boolean deleteContact(long rowId) {

   return db.delete(TABLE_NAME, BaseColumns._ID + "=" + rowId, null) > 0;

}

0

SimpleAdapterの更新でnotifyDataSetChanged()を機能させることができなかったので、代わりに、最初にremoveAllViews()を使用して親レイアウトにアタッチされているすべてのビューを削除し、次にListViewを追加しました。 UI:

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

私にとっては、SQLデータベースの情報を変更した後、リストビュー(特定の拡張可能なリストビューになる)を更新することができなかったため、notifyDataSetChanged()が役に立たない場合は、最初にリストをクリアして、notifyDataSetChanged()を呼び出した後にもう一度追加してみてください。例えば

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

それがあなたにとって理にかなっているといいのですが。



0

フラグメントで、しばらくスキャンしたBLEデバイスのMACアドレスを(単一のTextViewで)ListViewに入力したいときも同じでした。

私がしたことはこれでした:

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

次に、ListViewは、検出されたデバイスのMACアドレスを動的に入力し始めました。


0

リフレッシュとはどういう意味かによると思います。GUI表示を更新する必要があるのか​​、それともgetChildAt(int)をプログラムで呼び出して、アダプターの内容に対応するビューを取得できるように子ビューを更新する必要があるのか​​?

GUI表示をリフレッシュする場合は、アダプターでnotifyDataSetChanged()を呼び出します。GUIは、次に再描画されるときに更新されます。

getChildAt(int)を呼び出して、アダプターの内容を反映するビューを取得できるようにする場合は、layoutChildren()を呼び出します。これにより、アダプタデータから子ビューが再構築されます。


0

リストビューに表示したいArrayListがありました。ArrayListには、mysqlの要素が含まれていました。onRefreshメソッドをオーバーライドし、そのメソッドでtablelayout.removeAllViews();を使用しました。その後、データベースから再度データを取得するプロセスを繰り返しました。ただし、その前に、必ずArrayListをクリアしてください。そうでない場合、データ構造または新しいデータが古いデータに追加されます。


0

サービスからUIリストビューを更新する場合は、メインアクティビティでアダプターを静的にして、次のようにします。

@Override
public void onDestroy() {
    if (MainActivity.isInFront == true) {
        if (MainActivity.adapter != null) {
            MainActivity.adapter.notifyDataSetChanged();
        }

        MainActivity.listView.setAdapter(MainActivity.adapter);
    }
}    

0

Androidのガイドラインを使用しContentProvidersていて、を使用してデータを取得し、およびを使用してDatabaseそれを表示している場合、関連データへのすべての変更が自動的にListViewに反映されます。ListViewCursorLoaderCursorAdapters

getContext().getContentResolver().notifyChange(uri, null);カーソルをContentProvider置くだけで、変更を反映できます。追加の作業は必要ありません。

ただし、これらすべてを使用していない場合は、データセットが変更されたときにアダプタに通知する必要があります。また、データセット(リストなど)を再入力/再ロードしてからnotifyDataSetChanged()、アダプターを呼び出す必要があります。

notifyDataSetChanged()データセットに変更がない場合は機能しません。これはdocs-のメソッドの上のコメントです

/**
 * Notifies the attached observers that the underlying data has been changed
 * and any View reflecting the data set should refresh itself.
 */

0

新しいアダプターデータを取得し、リストビューのアダプターをリセットして、次のような呼び出しを行うことによってのみ、notifyDataSetChangedを取得できました。

    expandableAdapter = baseFragmentParent.setupEXLVAdapter();
    baseFragmentParent.setAdapter(expandableAdapter);
    expandableAdapter.notifyDataSetChanged(); 

0

他のオプションではonWindowFocusChangedメソッドですが、その機密性が高く、興味のある人のためにいくつかの追加のコーディングが必要です

 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

リストをアダプターに渡したとしましょう。
使用する:

list.getAdapter().notifyDataSetChanged()

リストを更新します。


0

ここで私のシナリオについて話した場合、削除ボタンと共にdb値のリストを表示するアクティビティがあり、削除ボタンが押されたときにそのアイテムをリストから削除したかったため、上記の回答以外は機能しません。

クールなのは、リサイクラービューではなく、単純なリストビューと、アダプタークラスで初期化されたそのリストビューを使用したことです。そのため、を呼び出してnotifyDataSetChanged()も、アダプタークラス内では何も実行されません。削除メソッドがアダプタークラス内にあったため、アダプターオブジェクトが初期化されているアクティビティクラスでも実行されません。

したがって、解決策は、アダプタークラスのgetViewメソッドでアダプターからオブジェクトを削除することでした(その特定のオブジェクトのみを削除するには、すべてを削除する場合は、を呼び出しますclear())。

アイデアを得るために、私のコードはどのようなものでしたか、

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
         }
    });
 //....

注:ここremove()getItem()メソッドはAdapterクラスから継承されます。

  • remove() -クリックされた特定のアイテムを削除する
  • getItem(position) -クリックした位置からアイテム(ここでは、リストに追加したWordオブジェクト)を取得します。

これは、アダプタをアクティビティクラスのリストビューに設定する方法です。

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

-1

最も簡単なのは、新しいAdaperを作成して古いものを削除することです。

myListView.setAdapter(new MyListAdapter(...));

これはより多くのメモリを消費します。
Player1

ごみは収集されます
user1712200
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.