2016-08-23 61 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);