ListView 在 notifydataSetChanged() 之后没有更新
ListView is not updating after notifydataSetChanged()
我对 notifyDataSetChanged()
有疑问。
这是处理 ListView 的 class。
public class SummonersActivity extends Activity {
private ListView summonersList;
private SummonerListAdapter adapter;
private DatabaseHandler databaseHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_summoners);
databaseHandler = new DatabaseHandler(getBaseContext());
summonersList = (ListView) findViewById(R.id.summonersList);
adapter = new SummonerListAdapter(this, databaseHandler);
summonersList.setAdapter(adapter);
}
public void addSummoner(View view) {
Intent myIntent = new Intent(this, Login.class);
startActivity(myIntent);
}
@Override
protected void onResume(){
super.onResume();
adapter.swapItems(databaseHandler.getAllSummoners());
adapter.notifyDataSetChanged();
}
}
这是我定制的适配器
public class SummonerListAdapter extends ArrayAdapter<Summoner> {
private final Context context;
private List<Summoner> itemsArrayList;
private final DatabaseHandler databaseHandler;
public SummonerListAdapter(Context context, DatabaseHandler databaseHandler) {
super(context, R.layout.summoner_list_row, databaseHandler.getAllSummoners());
this.context = context;
this.itemsArrayList = databaseHandler.getAllSummoners();
this.databaseHandler=databaseHandler;
}
public void update(){
this.itemsArrayList.clear();
this.itemsArrayList=databaseHandler.getAllSummoners();
this.notifyDataSetChanged();
}
public void swapItems(List<Summoner> items) {
this.itemsArrayList = items;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.summoner_list_row, parent, false);
final ImageView iconView = (ImageView) rowView.findViewById(R.id.summonerIcon);
TextView summonerName = (TextView) rowView.findViewById(R.id.summonerName);
TextView region = (TextView) rowView.findViewById(R.id.region);
ImageButton checkBtn = (ImageButton) rowView.findViewById(R.id.checkBtn);
Icon icon = databaseHandler.getIcon(itemsArrayList.get(position).getProfileIconId());
if (icon==null){
RequestParams requestParams = new RequestParams();
requestParams.put("region",itemsArrayList.get(position).getRegion());
requestParams.put("id",itemsArrayList.get(position).getProfileIconId());
LeagueAssistantAPI.get("leagueAssistant/icon", requestParams, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
Icon saveIcon=new Icon(itemsArrayList.get(position).getProfileIconId(),responseBody);
databaseHandler.addIcon(saveIcon);
Bitmap bitmap = BitmapFactory.decodeByteArray(responseBody, 0, responseBody.length);
Drawable iconDrawable = new BitmapDrawable(bitmap);
iconView.setImageDrawable(iconDrawable);
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
error.printStackTrace();
}
});
}
else{
Bitmap bitmap = BitmapFactory.decodeByteArray(icon.getIcon(), 0, icon.getIcon().length);
Drawable iconDrawable = new BitmapDrawable(bitmap);
iconView.setImageDrawable(iconDrawable);
}
summonerName.setText(itemsArrayList.get(position).getName());
region.setText(itemsArrayList.get(position).getRegion());
if (itemsArrayList.get(position).isSelected())
checkBtn.setBackgroundResource(R.drawable.checked);
else checkBtn.setBackgroundResource(R.drawable.check);
return rowView;
}
}
我有另一个 activity 在数据库 Login
中添加新行。我从 MainActivity
到 SummonersActivity
再到 LoginActivity
。 LoginActivity
插入数据库然后 returns 到 SummonersActivity
。我把 notifiyDataSetChanged()
放在 onResume
SummonersActivity
中。在我退出 LoginActivity
后列表不会自动更新,但如果我返回 MainActivity
然后返回 SummonersActivity
列表会更新。我试图将 notifiyDataSetChanged()
放在不同的地方,但没有用。有人能指出为什么 ListView
在我退出 LoginActivity
后没有更新吗?
实际上,您通过调用 super(context, R.layout.summoner_list_row, databaseHandler.getAllSummoners());
将适配器绑定到适配器构造函数中的数组。您需要覆盖 getCount()
和 getItem(int position)
来访问您的内部适配器列表
我对 notifyDataSetChanged()
有疑问。
这是处理 ListView 的 class。
public class SummonersActivity extends Activity {
private ListView summonersList;
private SummonerListAdapter adapter;
private DatabaseHandler databaseHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_summoners);
databaseHandler = new DatabaseHandler(getBaseContext());
summonersList = (ListView) findViewById(R.id.summonersList);
adapter = new SummonerListAdapter(this, databaseHandler);
summonersList.setAdapter(adapter);
}
public void addSummoner(View view) {
Intent myIntent = new Intent(this, Login.class);
startActivity(myIntent);
}
@Override
protected void onResume(){
super.onResume();
adapter.swapItems(databaseHandler.getAllSummoners());
adapter.notifyDataSetChanged();
}
}
这是我定制的适配器
public class SummonerListAdapter extends ArrayAdapter<Summoner> {
private final Context context;
private List<Summoner> itemsArrayList;
private final DatabaseHandler databaseHandler;
public SummonerListAdapter(Context context, DatabaseHandler databaseHandler) {
super(context, R.layout.summoner_list_row, databaseHandler.getAllSummoners());
this.context = context;
this.itemsArrayList = databaseHandler.getAllSummoners();
this.databaseHandler=databaseHandler;
}
public void update(){
this.itemsArrayList.clear();
this.itemsArrayList=databaseHandler.getAllSummoners();
this.notifyDataSetChanged();
}
public void swapItems(List<Summoner> items) {
this.itemsArrayList = items;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.summoner_list_row, parent, false);
final ImageView iconView = (ImageView) rowView.findViewById(R.id.summonerIcon);
TextView summonerName = (TextView) rowView.findViewById(R.id.summonerName);
TextView region = (TextView) rowView.findViewById(R.id.region);
ImageButton checkBtn = (ImageButton) rowView.findViewById(R.id.checkBtn);
Icon icon = databaseHandler.getIcon(itemsArrayList.get(position).getProfileIconId());
if (icon==null){
RequestParams requestParams = new RequestParams();
requestParams.put("region",itemsArrayList.get(position).getRegion());
requestParams.put("id",itemsArrayList.get(position).getProfileIconId());
LeagueAssistantAPI.get("leagueAssistant/icon", requestParams, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
Icon saveIcon=new Icon(itemsArrayList.get(position).getProfileIconId(),responseBody);
databaseHandler.addIcon(saveIcon);
Bitmap bitmap = BitmapFactory.decodeByteArray(responseBody, 0, responseBody.length);
Drawable iconDrawable = new BitmapDrawable(bitmap);
iconView.setImageDrawable(iconDrawable);
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
error.printStackTrace();
}
});
}
else{
Bitmap bitmap = BitmapFactory.decodeByteArray(icon.getIcon(), 0, icon.getIcon().length);
Drawable iconDrawable = new BitmapDrawable(bitmap);
iconView.setImageDrawable(iconDrawable);
}
summonerName.setText(itemsArrayList.get(position).getName());
region.setText(itemsArrayList.get(position).getRegion());
if (itemsArrayList.get(position).isSelected())
checkBtn.setBackgroundResource(R.drawable.checked);
else checkBtn.setBackgroundResource(R.drawable.check);
return rowView;
}
}
我有另一个 activity 在数据库 Login
中添加新行。我从 MainActivity
到 SummonersActivity
再到 LoginActivity
。 LoginActivity
插入数据库然后 returns 到 SummonersActivity
。我把 notifiyDataSetChanged()
放在 onResume
SummonersActivity
中。在我退出 LoginActivity
后列表不会自动更新,但如果我返回 MainActivity
然后返回 SummonersActivity
列表会更新。我试图将 notifiyDataSetChanged()
放在不同的地方,但没有用。有人能指出为什么 ListView
在我退出 LoginActivity
后没有更新吗?
实际上,您通过调用 super(context, R.layout.summoner_list_row, databaseHandler.getAllSummoners());
将适配器绑定到适配器构造函数中的数组。您需要覆盖 getCount()
和 getItem(int position)
来访问您的内部适配器列表