2013-08-23 2 views
4

У меня есть основная деятельность, которая создает ListView и Custom Adapter. Я могу заполнить ListView, если у меня есть Список, который уже был создан заранее, но как я могу заполнить его динамически извлеченными данными?Как динамически обновлять 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; 
    } 
} 

Item

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, но не смог заставить его работать.


Редактировать: Добавлен следующий AsyncTask в MainActivity после onCreate() просто чтобы проверить вещи. Он работает в том, что я вижу подсчет от 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!"); 
    } 
} 
+0

Вы используете класс AsyncTask ?? – Piyush

+0

Я добавил AsyncTask к исходному коду. Однако я не уверен, как обновить адаптер и список. – user1118764

ответ

2

После обновления адаптера вызова

myAdapter.notifyDataSetChanged(); 

Это будет динамически обновлять вид списка.

Смотреть это для получения дополнительной информации LINK

+0

Где я могу это сделать? В AsyncTask? Где именно? Я внес некоторые изменения в конце моего первоначального сообщения. Пожалуйста, посмотрите, спасибо! – user1118764

6

Всякий раз, когда вы добавляете новые данные, которые вы должны сделать это:

adapter.notifyDataSetChanged()

Например:

database.insert (данные);

myAdapter.notifyDataSetChanged();

ИЛИ:

myAdapter.mySetNewContentMethod(someNewContent); 
myAdapter.notifyDataSetChanged(); 
0

Я попытался простой метод для обновления списка при удалении элемента из него. Надеюсь, мой код поможет вам. Код

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

Обратите внимание, что все намерения, которые я создал, соответствуют моей логике в программе. Вы можете выполнить любую задачу в методе/функции onClick (View v) –

Смежные вопросы