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!");
}
}
_
新しいデータを追加するときはいつでも、これを行う必要があります。
adapter.notifyDataSetChanged()
例えば:
database.insert(data);
myAdapter.notifyDataSetChanged();
または:
myAdapter.mySetNewContentMethod(someNewContent);
myAdapter.notifyDataSetChanged();
アダプター呼び出しを更新した後
myAdapter.notifyDataSetChanged();
これにより、リストビューが動的に更新されます。
詳細についてはこちらをご覧ください [〜#〜] link [〜#〜]
リストからアイテムを削除するときにリストを更新する最も簡単な方法を試しました。私のコードがお役に立てば幸いです。コード
//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.