notifydatasetchanged()无法正常工作
问题描述:
我有一个列表视图和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中一个项目被推送两次以上!
任何帮助将不胜感激!谢谢!
答
您没有将数据提供给适配器。您可以将方法添加到适配器更新数据:
public void add(String data) {
this.pokemonList.add(data);
}
您添加的项目在适配器内部列表之后,你可以调用notifyDataSetChanged
的名单将更新。
答
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
答
请在您的适配器类添加方法和添加其他通知方式。
public void addItem(String data) {
this.pokemonItemList.add(data);
notifyDataSetChanged();
}
并从您的广播中添加数据。
adapter.addItem(StringValue);
为什么不使用'ArrayAdapter'来代替?它有方便的'add()'方法 – pskink
好吧等一等lemme尝试@pskink –