notifydatasetchanged() 无法正常工作
notifydatasetchanged() not working properly
我有一个 listview 和一个 Baseadapter,但是 adapeter.notiydatasetchanged()
对我来说工作不正常.....我在我的 listview 中得到一个适配器项目超过两次 :(
我的适配器 class 扩展了基本适配器。
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;
}
}
这是列表视图和适配器数据的实现:
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()
函数中的后台线程发送广播,但是在列表视图中至少有一项被推送了两次以上!
任何帮助将不胜感激!谢谢!
您没有将数据提供给您的适配器。您可以向适配器添加一个方法来更新数据:
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();
}
}
请在您的适配器中添加方法 class 并添加通知方法。
public void addItem(String data) {
this.pokemonItemList.add(data);
notifyDataSetChanged();
}
并从您的广播中添加数据。
adapter.addItem(StringValue);
我有一个 listview 和一个 Baseadapter,但是 adapeter.notiydatasetchanged()
对我来说工作不正常.....我在我的 listview 中得到一个适配器项目超过两次 :(
我的适配器 class 扩展了基本适配器。
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;
}
}
这是列表视图和适配器数据的实现:
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()
函数中的后台线程发送广播,但是在列表视图中至少有一项被推送了两次以上!
任何帮助将不胜感激!谢谢!
您没有将数据提供给您的适配器。您可以向适配器添加一个方法来更新数据:
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();
}
}
请在您的适配器中添加方法 class 并添加通知方法。
public void addItem(String data) {
this.pokemonItemList.add(data);
notifyDataSetChanged();
}
并从您的广播中添加数据。
adapter.addItem(StringValue);