web-dev-qa-db-ja.com

カスタムアダプタを使用してListViewを動的に更新するにはどうすればよいですか?

ListViewと_Custom Adapter_を作成するメインアクティビティがあります。事前にリストを作成している場合はListViewにデータを入力できますが、動的にフェッチされたデータをリストに入力するにはどうすればよいですか?

MainActivity

_public class MainActivity extends Activity {
  private ListView myListView;
  private Context ctx;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.MainActivity);
    ctx = this;
    List<Items> myList = new ArrayList<Items>();

    myList.add(new Item("Name 1", "Desc 1"));
    myList.add(new Item("Name 2", "Desc 2"));
    myList.add(new Item("Name 3", "Desc 3"));
    myList.add(new Item("Name 4", "Desc 4"));
    myList.add(new Item("Name 5", "Desc 5"));

    myListView = (ListView)findViewById(R.id.list);
    MyListAdapter myAdapter = new MyListAdapter(ctx,R.layout.listitem, myList);
    myListView.setAdapter(myAdapter);
  }
}
_

MyListAdapter

_public class MyListAdapter extends ArrayAdapter<Items> {

  private int resource;
  private LayoutInflater mLayoutInflater;

  public MyListAdapter ( Context ctx, int resourceId, List<Items> objects) {

    super( ctx, resourceId, objects );
    resource = resourceId;
    mLayoutInflater = LayoutInflater.from( ctx );
  }

  @Override
  public View getView ( int position, View convertView, ViewGroup parent ) {

    convertView = ( RelativeLayout ) mLayoutInflater.inflate( resource, null );

    Items item = (Items) getItem( position );

    TextView txtName = (TextView) convertView.findViewById(R.id.listName);
    txtName.setText(item.getName());

    TextView txtDesc = (TextView) convertView.findViewById(R.id.listDescription);
    txtDesc.setText(item.getDesc());

    return convertView;
  }
}
_

アイテム

_public class Item {

private String name;
  private String desc;

  public Item(String name, String desc) {
    super();
    this.name = name;
    this.desc = desc;
  }

  //getters and setters
}
_

バックグラウンドの関数がアイテムをカスタムアダプタに取得してListViewに入力するように、コードを変更するにはどうすればよいですか? AsyncTaskを使用してみましたが、うまく機能しませんでした。


編集:テストのために、onCreate()の後にAsyncTaskに次のMainActivityを追加しました。 1から5までのカウントを確認してから実行できるという点で機能しています。
アダプタとAsyncTaskを更新するためにListViewを取得するにはどうすればよいですか?
onCreate()AsyncTaskに何を渡し、AsyncTaskは何を返す必要がありますか?

_private class GetItems extends AsyncTask<Void, Integer, Void> {

  @Override
  protected void onPreExecute() {
    super.onPreExecute();
    TextView myMsg = (TextView)findViewById(R.id.topMsg);
    myMsg.setText("Loading...");
  }

  @Override
  protected Void doInBackground(Void... params) {
    TextView myMsg = (TextView)findViewById(R.id.topMsg);
    for (int i=1;i<=5;i++) {
      try {
        Thread.sleep(1000);
        publishProgress(i);
      } catch (InterruptedException e) {
      }
    }
    return null;
  }

  protected void onProgressUpdate(Integer... values) {
    TextView myMsg = (TextView)findViewById(R.id.topMsg);
    myMsg.setText(Integer.toString(values[0].intValue()));
  }

  @Override
  protected void onPostExecute(Void result) {
    TextView myMsg = (TextView)findViewById(R.id.topMsg);
    myMsg.setText("Done!");
  }
}
_
5
user1118764

新しいデータを追加するときはいつでも、これを行う必要があります。

adapter.notifyDataSetChanged()

例えば:

database.insert(data);

myAdapter.notifyDataSetChanged();

または:

myAdapter.mySetNewContentMethod(someNewContent);
myAdapter.notifyDataSetChanged();
6
oybek.t

アダプター呼び出しを更新した後

myAdapter.notifyDataSetChanged();

これにより、リストビューが動的に更新されます。

詳細についてはこちらをご覧ください [〜#〜] link [〜#〜]

3
Rajnish Mishra

リストからアイテムを削除するときにリストを更新する最も簡単な方法を試しました。私のコードがお役に立てば幸いです。コード

   //Custom Adatpter
   package com.example.smsptclapp;
   import Java.util.ArrayList;
   import Java.util.List;
   import Android.app.Activity;
   import Android.content.Context;
   import Android.content.Intent;
   import Android.view.LayoutInflater;
   import Android.view.View;
   import Android.view.View.OnClickListener;
   import Android.view.ViewGroup;
   import Android.widget.AdapterView;
   import Android.widget.BaseAdapter;
   import Android.widget.ImageView;
   import Android.widget.TextView;
   import Android.widget.Toast;
   import Android.widget.AdapterView.OnItemLongClickListener;

   public class CustomAdapter extends BaseAdapter
    {
 static List<String> result;
 //ArrayList<SingleRow> list;
 Activity context;
 static TextView tv;
 static int k,count;
     // int [] imageId; //for Image
     private static LayoutInflater inflater = null;
    public CustomAdapter(Activity activity, List<String> prgmNameList) 
     {
       // TODO Auto-generated constructor stub
        result = prgmNameList;
        context = activity;
       //imageId = prgmImages; //for Image 
       inflater = ( LayoutInflater )context.getSystemService (Context.LAYOUT_INFLATER_SERVICE);
     }

     public CustomAdapter(OnClickListener onClickListener, List<String>  listItems) 
     {
    // TODO Auto-generated constructor stub
     }

 @Override
     public int getCount() 
     {
      // TODO Auto-generated method stub
      return result.size();
     }

     @Override
     public Object getItem(int position) 
     {
       // TODO Auto-generated method stub
       return position;
     }

     @Override
     public long getItemId(int position) 
     {
       // TODO Auto-generated method stub
       return position;
     }

     public static int getCounter()
    {
      return count;
    }

    public static int getPosition()
   {
     return k;
   }

   @Override
   public View getView(final int position, View convertView, ViewGroup   parent) 
   {
     // TODO Auto-generated method stub
     //Object cd1=   getItem(position);
     View rowView;       
     rowView = inflater.inflate(R.layout.program_list, null);
     tv=(TextView) rowView.findViewById(R.id.textView1);
     tv.setLongClickable(true);
     tv.setText(result.get(position));
      rowView.setOnClickListener(new OnClickListener() 
      {
         @Override
         public void onClick(View v) {
            k = position;
            Intent i =  new Intent(context, Menu.class);
            context.startActivity(i);
         }
         });
     return rowView;
    }
 }

 // In Main Type these lines
       ss =listItems.get(i);  // where 'ss' is global string, 'i' is the location you want to delete, and 'listItems' is global variable of 'List<String>' type. 
       db.deleteUser(ss);  //'db' is global variable of database and deleteUser is method to delete entry from data base only 
   listItems.remove(i); //to remove the entry from list i.e to refresh it you must call this
   listgroups.setAdapter(new CustomAdapter(this,listItems)); //'listgroups' is 'ListView', which is also global.
0
Usama Mudassar