如何在自定义适配器的数据依赖于另一个类时自动刷新内容?

时间:2014-05-22 13:41:00

标签: android listadapter android-adapterview

我试图在自定义适配器上使用notifyDataSetChanged()在另一个类中更改数据时从一个类更改视图。

Class FragmentOne启动添加listItems的帖子。

然后我使用class FragmentTwo并获取listItems并更新我的观点。

我的代码---

Class FragmentOne

static ArrayList<String> listItems = null;

private class MonitorLogThread extends Thread
{
    BufferedReader br;

    @Override
    public void run() {

while(((line=br.readLine()) != null) && !this.isInterrupted()){
   listItems.add(line);
}
 }

Class FragmentTwo

private BBLogListAdapter mBBLogListAdapter;
ArrayList<String> receiptlist;

@Override
    protected void onResume() {
    super.onResume();  

     if(receiptlist == null)
        receiptlist = new ArrayList<String>();
    else
        receiptlist.clear();

    // Initializes list view adapter.
    mBBLogListAdapter = new BBLogListAdapter();
    setListAdapter(mBBLogListAdapter);

    mBBLogListAdapter.updateReceiptsList(FragmentOne.listItems);

    mBBLogListAdapter.notifyDataSetChanged();
 }

        // Custom Adapter
        private class BBLogListAdapter extends BaseAdapter {
             //Code to set view dynamically according to data in adapter
             public void updateReceiptsList(ArrayList<String> newlist) {
             receiptlist.clear();
             receiptlist.addAll(newlist);
        }

        //Some more code..
      }
} 

所以,目前我在onResume()方法中使用方法updateReceiptsList来更新 内容。这仅在我们恢复活动时更新。

但我希望在此活动中根据来自其他活动的数据更改自动刷新内容。

2 个答案:

答案 0 :(得分:1)

正确处理此类问题的方法是使用ContentProviderCursorAdapter s。更改数据后,将通知适配器,并且框架本身将处理所有同步。减轻痛苦,增加收益。

答案 1 :(得分:-1)

抓住你的适配器对象并在“FragmentTwo”中创建一个静态方法,

public static void notifyDataChanged(){
  if(mBBLogListAdapter != null){
       mBBLogListAdapter.updateReceiptsList(FragmentOne.listItems);
       mBBLogListAdapter.notifyDataSetChanged();
  }
}

每当线程中的数据发生变化时,请调用此静态方法。

static ArrayList<String> listItems = null;

private class MonitorLogThread extends Thread
{
  BufferedReader br;

 @Override
 public void run() {

while(((line=br.readLine()) != null) && !this.isInterrupted()){
 listItems.add(line);

 FragmentTwo.notifyDataChanged();
 }
}

请注意,您需要在FragmentTwo的onResume中使用与setAdapter相同的适配器对象

setListAdapter(mBBLogListAdapter);

PS:更清晰的替代方案是在“FragmentTwo”上使用侦听器来侦听“FragmentOne”上的任何数据更改。请参阅此处了解实施详情 - http://docs.oracle.com/javase/tutorial/uiswing/events/actionlistener.html

希望这有帮助。