2016-08-23 48 views
1

我有一個列表視圖和Baseadapter但adapeter.notiydatasetchanged()不是爲我正常工作.....我得到我的列表視圖:(notifydatasetchanged()無法正常工作

我的適配器類兩倍多一個適配器項目的更多擴展baseadapter

public class Event_update_adapter extends BaseAdapter { 
    private StartActivity activity = null; 
    private List<String> pokemonList = null; 

    public Event_update_adapter(StartActivity activity, List<String> p) { 
     super(); 
     this.activity = activity; 
     this.pokemonList = p; 
    } 
    public void add(String data) { 

     this.pokemonList.add(data); 

    } 
    @Override 
    public int getCount() { 
     return pokemonList.size(); 
    } 

    @Override 
    public String getItem(int i) { 
     return pokemonList.get(i); 
    } 

    @Override 
    public long getItemId(int i) { 
     return i; 
    } 

    @Override 
    public View getView(int position, View view, ViewGroup viewGroup) { 
     final ViewHolder holder; 
     final String pokemon = (String) getItem(position); 

     if (view == null) { 
      LayoutInflater layoutInflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      view = layoutInflater.inflate(R.layout.event_updater_lv_item, viewGroup, false); 
      holder = new ViewHolder(); 
      holder.name = (TextView) view.findViewById(R.id.event_update_in_list); 

      view.setTag(holder); 
     } else { 
      // get view holder back 
      holder = (ViewHolder) view.getTag(); 
     } 

     // bind text with view holder content view for efficient use 
     holder.name.setText(pokemon); 

     return view; 
    } 

    private class ViewHolder { 
     TextView name=null; 
    } 
} 

這裏是實現ListView和適配器的數據:

public class StartActivity extends AppCompatActivity 
{ 

    private Event_update_adapter adapter = null; 
    private List<String> adapter_data = new Vector<>(); 
    private ListView mListView = null; 

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_start); 
     this.mContext = this; 
initviews(); 

} 


private void initviews() { 
     // adapter_data = new Vector<String>(); 
     adapter = new Event_update_adapter((StartActivity) mContext, 
       adapter_data); 

     mListView = (ListView) findViewById(R.id.eventList); 
     mListView.setAdapter(adapter); 
} 

比使用接收器我更新適配器數據和呼叫notifydatasetchanged()

接收器代碼:

BroadcastReceiver mReceiver = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      // Grab the bundle from the intent. 
      //Bundle bundle = intent.getExtras(); 

      //Initializes the ViewPager. 
      if (intent.hasExtra(CommonForApp.UPDATE_LISTVIEW)) { 

       adapter.add(intent.getStringExtra(CommonForApp.UPDATE_LISTVIEW)); 
       adapter.notifyDataSetChanged(); 
      } 
} 

注:我的接收機被其他意圖工作正常,所以他們是在接收器沒有問題。

我使用應用程序上下文發送廣播並從服務postexceute()函數中的後臺線程發送廣播,但是至少在ListView中一個項目被推送兩次以上!

任何幫助將不勝感激!謝謝!

+2

爲什麼不使用'ArrayAdapter'來代替?它有方便的'add()'方法 – pskink

+0

好吧等一等lemme嘗試@pskink –

回答

2

您沒有將數據提供給適配器。您可以將方法添加到適配器更新數據:

public void add(String data) { 

    this.pokemonList.add(data); 
} 

您添加的項目在適配器內部列表之後,你可以調用notifyDataSetChanged的名單將更新。

0
public class Event_update_adapter extends BaseAdapter { 
private StartActivity activity = null; 
public List<String> pokemonList = null; 

public Event_update_adapter(StartActivity activity, List<String> p) { 
    this.activity = activity; 
    this.pokemonList = p; 
} 

@Override 
public int getCount() { 
    return pokemonList.size(); 
} 

@Override 
public Object getItem(int i) { 
    return pokemonList.get(i); 
} 

@Override 
public long getItemId(int i) { 
    return i; 
} 

@Override 
public View getView(int position, View view, ViewGroup viewGroup) { 
    final ViewHolder holder; 
    final String pokemon = (String) getItem(position); 

    if (view == null) { 
     LayoutInflater layoutInflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     view = layoutInflater.inflate(R.layout.event_updater_lv_item, viewGroup, false); 
     holder = new ViewHolder(); 
     holder.name = (TextView) view.findViewById(R.id.event_update_in_list); 

     view.setTag(holder); 
    } else { 
     // get view holder back 
     holder = (ViewHolder) view.getTag(); 
    } 

    // bind text with view holder content view for efficient use 
    holder.name.setText(pokemon); 

    return view; 
} 

private class ViewHolder { 
    TextView name; 
} 

}

public class StartActivity extends AppCompatActivity 
{ 

    private Event_update_adapter adapter = null; 
    private List<String> adapter_data = new Vector<>(); 
    private ListView mListView = null; 

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_start); 
     this.mContext = this; 
initviews(); 

} 


private void initviews() { 
     // adapter_data = new Vector<String>(); 
     adapter = new Event_update_adapter((StartActivity) mContext, 
       adapter_data); 

     mListView = (ListView) findViewById(R.id.eventList); 
     mListView.setAdapter(adapter); 
} 

然後

BroadcastReceiver mReceiver = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      // Grab the bundle from the intent. 
      //Bundle bundle = intent.getExtras(); 

      //Initializes the ViewPager. 
      if (intent.hasExtra(CommonForApp.UPDATE_LISTVIEW)) { 

       adapter.pokemonList.add(intent.getStringExtra(CommonForApp.UPDATE_LISTVIEW)); 
       adapter.notifyDataSetChanged(); 
      } 
} 
+1

雖然這將工作,但我總是會避免將適配器的內部運作暴露給使用它的類。例如,如果您希望將'List'更改爲'Map',您將不得不更新所有使用它的類,而不僅僅是「Adapter」本身 – Jahnold

1

請在您的適配器類添加方法和添加其他通知方式。

public void addItem(String data) { 
    this.pokemonItemList.add(data); 
notifyDataSetChanged(); 
} 

並從您的廣播中添加數據。

adapter.addItem(StringValue);