2017-06-14 19 views
0

notifyDataSetChanged()に問題があります。 ListViewを扱うクラスは次のとおりです。notifydataSetChanged()後ListViewが更新されません

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; 
    } 
} 

私はデータベースLoginに新しい行を追加して別のアクティビティを持って作られたカスタムアダプタです。私はMainActivityからSummonersActivityからLoginActivityに行きます。 LoginActivityデータベースに挿入してSummonersActivityに戻ります。私はonResumeSummonersActivitynotifiyDataSetChanged()を入れました。 LoginActivityを終了した後、リストは自動的に更新されませんが、もしMainActivityに戻ると、SummonersActivityに戻ると、リストが更新されます。私は別の場所にnotifiyDataSetChanged()を入れようとしましたが、うまくいかなかった。誰かが理由を指摘してもいいですか?LoginActivityを終了した後にListViewは更新されません。

+0

swap()の代わりにupdate()を呼び出すとどうなりますか?リストビューは更新されますか? –

+0

番号。そのもう一つの試み。 – user2907139

+0

明らかにこれが動作します 'protected void onResume(){ super.onResume(); adapter = new SummonerListAdapter(this、databaseHandler.getAllSummoners()); summonersList.setAdapter(adapter); } ' 汚れているようですが、仕事をしています。なぜ私の以前のソリューションが失敗したのかを知りたい。 – user2907139

答えて

1

実際には、super(context, R.layout.summoner_list_row, databaseHandler.getAllSummoners());を呼び出すことによって、アダプタをアダプタコンストラクタの配列にバインドします。内部アダプタリストにアクセスするgetCount()getItem(int position)をオーバーライドする必要があります

+0

ありがとうございます。私はメソッドをオーバーライドし、完璧に動作します – user2907139

関連する問題