2016-03-25 17 views
0

私は現在、学校向けのAndroidアプリケーションを開発中です。私はすでにフォーラムを見て、問題を自分で修正しようとしましたが、保存ボタンを押したときにListViewが自動的に更新されない理由を理解できないようです。私は実際にはドロップダウンメニューを押して、項目を選択して更新する必要があります。誰かがそれを見て、私が間違っていることを教えてもらえますか?Android ListViewはsaveButtonの後に更新されませんが、onItemSelectedの後に

ありがとうございます!

activity_main.xml

<GridLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/GridLayout1" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:columnCount="1" 
android:orientation="horizontal" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context="com.example.physicalactivitytracker.MainActivity" > 

<Spinner 
    android:id="@+id/activityDropDown" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_gravity="start" 
    android:background="@android:drawable/btn_dropdown" 
    android:entries="@array/activity_array" 
    android:spinnerMode="dropdown" > 

    <requestFocus/> 
</Spinner> 

<LinearLayout android:layout_gravity="fill_horizontal" 
    android:focusable="true" 
    android:focusableInTouchMode="true"> 

    <EditText 
     android:id="@+id/infoText" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:layout_gravity="bottom|fill_horizontal" 
     android:ems="10" 
     android:hint="@string/infoHint" 
     android:imeOptions="actionDone" 
     android:singleLine="true" 
     android:lines="1" 
     android:inputType="number" /> 

    <ImageButton 
     android:id="@+id/saveButton" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:contentDescription="@string/saveDescription" 
     android:src="@android:drawable/ic_menu_save" /> 

</LinearLayout> 

<LinearLayout android:gravity="fill_horizontal" > 

    <Button 
     android:id="@+id/soFarButton" 
     style="android:buttonBarStyle" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/psf" /> 

    <Button 
     android:id="@+id/startOverButton" 
     style="android:buttonBarStyle" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/so" /> 

</LinearLayout> 

<LinearLayout 
    android:layout_height="0dp" 
    android:layout_gravity="fill" 
    android:layout_marginTop="@dimen/activity_vertical_margin" 
    android:background="@android:color/holo_blue_bright" 
    android:orientation="vertical" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" > 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="fill_horizontal" 
     android:gravity="center_horizontal" 
     android:text="@string/taggedSearches" 
     android:textAppearance="?android:attr/textAppearanceMedium" /> 

    <ListView 
     android:id="@android:id/list" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_gravity="fill" 
     android:layout_weight="1" /> 

</LinearLayout> 

activity_list.xml

<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/textView" 
android:layout_width="match_parent" 
android:layout_height="?android:attr/listPreferredItemHeight" 
android:gravity="center_vertical" 
android:textAppearance="?android:attr/textAppearanceMedium" > 

MainActivity.java

package com.example.physicalactivitytracker; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 

import android.app.AlertDialog; 
import android.app.ListActivity; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.net.Uri; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.inputmethod.InputMethodManager; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.AdapterView.OnItemLongClickListener; 
import android.widget.AdapterView.OnItemSelectedListener; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ImageButton; 
import android.widget.Spinner; 
import android.widget.TextView; 
import android.widget.Toast; 

public class MainActivity extends ListActivity { 

private static final String SEARCHES = "searches"; 

private Spinner activityDropDown; 
private ImageButton saveButton; 
private EditText infoText; 
private SharedPreferences savedSearches; 
private ArrayList<String> tags; 
private ArrayAdapter<String> adapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    addItemsOnSpinner(); 

    // get references 
    activityDropDown = (Spinner) findViewById(R.id.activityDropDown); 
    infoText = (EditText) findViewById(R.id.infoText); 

    activityDropDown.setOnItemSelectedListener(acList); 

    //Get Users Saved Searches 
    savedSearches = getSharedPreferences(SEARCHES, MODE_PRIVATE); 

    // Store Saved Info to List 
    tags = new ArrayList<String>(savedSearches.getAll().keySet()); 

    // Create Array Adapter 
    adapter = new ArrayAdapter<String>(this, R.layout.activity_list_item, tags); 
    setListAdapter(adapter); 

    // Register Listener to Save Searches 
    ImageButton saveButton = (ImageButton) findViewById(R.id.saveButton); 
    saveButton.setOnClickListener(saveButtonListener); 

    // Register listener to touches on list 
    getListView().setOnItemClickListener(itemClickListener); 

    // Set Listener on long click item to edit/delete/etc 
    getListView().setOnItemLongClickListener(itemLongClickListener); 

} //end on create 

//saveButtonListener for Saving Info to List 
public OnClickListener saveButtonListener = new OnClickListener() { 
    @Override 
    public void onClick(View v) 
    { 
     // create info tags that match drop down activity 
     if (infoText.getText().length() > 0 && infoText.getText().toString().matches(".*\\d+.*") 
       && activityDropDown.getSelectedItem().toString().matches("Walking")) 
     { 
      addTaggedSearch(activityDropDown.getSelectedItem().toString() + " " + infoText.getText().toString() 
        + " Miles"); 
      infoText.setText(""); // clear infoText 
     } 
     else if (infoText.getText().length() > 0 && infoText.getText().toString().matches(".*\\d+.*") 
       && activityDropDown.getSelectedItem().toString().matches("Running")) 
     { 
      addTaggedSearch(activityDropDown.getSelectedItem().toString() + " " + infoText.getText().toString() 
        + " Miles"); 
      infoText.setText(""); // clear infoText 
     } 
     else if (infoText.getText().length() > 0 && infoText.getText().toString().matches(".*\\d+.*") 
       && activityDropDown.getSelectedItem().toString().matches("Stairs")) 
     { 
      addTaggedSearch(activityDropDown.getSelectedItem().toString() + " " + infoText.getText().toString() 
        + " Number of Floors"); 
      infoText.setText(""); // clear infoText 
     } 
     else if (infoText.getText().length() > 0 && infoText.getText().toString().matches(".*\\d+.*") 
       && activityDropDown.getSelectedItem().toString().matches("Generic")) 
     { 
      addTaggedSearch(activityDropDown.getSelectedItem().toString() + " " + infoText.getText().toString() 
        + " Calories"); 
      infoText.setText(""); // clear infoText 
     } 
     else // display message asking user to enter info 
     { 
      // create new alert 
      AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); 

      // set alert message to display 
      builder.setMessage(R.string.missingMessage); 

      // provide an OK button to dismiss dialog 
      builder.setPositiveButton(R.string.OK, null); 

      // create the alert dialog from builder 
      AlertDialog errorDialog = builder.create(); 
      errorDialog.show(); // displays error dialog 
     } 
    } 
}; // end OnClickListener 

// add new search to save file and refresh buttons 
private void addTaggedSearch(String tag) 
{ 
    // get a SharedPrefrences.Editor to store info 
    SharedPreferences.Editor preferencesEditor = savedSearches.edit(); 
    preferencesEditor.putString(tag, tag); // store search 
    preferencesEditor.apply(); // store updated preference 

    // add info 
    if (!tags.add(tag)) 
    { 
     tags.add(tag); // add new tag 
     adapter.notifyDataSetChanged(); // rebind tags to ListView 
    } 
} // end add tag 

// itemClickListenerListener opens tag info 
OnItemClickListener itemClickListener = new OnItemClickListener() 
{ 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
    { 
     //show tag info 
    } 
}; // end itemClickListener 

//itemLongCLickListener displays a dialog allowing user to delete or edit saves list item 
OnItemLongClickListener itemLongClickListener = new OnItemLongClickListener() 
{ 
    @Override 
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) 
    { 
     // get tag that user clicked 
     final String tag = ((TextView) view).getText().toString(); 

     // create new alert dialog 
     AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); 

     // set the AlertDialog Title 
     builder.setTitle(getString(R.string.shareEditDeleteTitle, tag)); 

     // set list of items to display in alert 
     builder.setItems(R.array.dialog_items, new DialogInterface.OnClickListener() 
     { 
      // respond to touch by sharing, editing or deleting 
      @Override 
      public void onClick(DialogInterface dialog, int which) 
      { 
       switch (which) 
       { 
       case 0: //share 
        shareSearch(tag); 
        break; 
       case 1: //edit 
        // sets infoText to match tag 
        infoText.setText(tag); 
        infoText.setText(savedSearches.getString(tag, "")); 
        break; 
       case 2: // delete 
        deleteSearch(tag); 
        break; 
       } 
      } 
     } //end DialogInterface.OnClickListener 
    ); // end call to builder.setItems 

    // set AlertDialog negative Button 
    builder.setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() 
     { 
      // called when cancel button is clicked 
      public void onClick(DialogInterface dialog, int id) 
      { 
       dialog.cancel(); //dismiss AlertDialog 
      } 
     } 
    ); // end call to setNegativeButon 

    builder.create().show(); //display AlertDialog 
    return true; 
    } // end method onItemLongClick 
}; // end onItemLongClick declaration 

//allow user to choose an app for sharing saved items 
private void shareSearch(String tag) 
{ 
    // create Intent to share urlString 
    Intent shareIntent = new Intent(); 
    shareIntent.setAction(Intent.ACTION_SEND); 
    shareIntent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.shareSubject)); 
    shareIntent.putExtra(Intent.EXTRA_TEXT, getString(R.string.shareMessage)); 
    shareIntent.setType("text/plain"); 

    // display apps that can share text 
    startActivity(Intent.createChooser(shareIntent, getString(R.string.shareSearch))); 
} 

// deletes search after user confirms the delete operation 
private void deleteSearch(final String tag) 
{ 
    // create new AlertDialog 
    AlertDialog.Builder confirmBuilder = new AlertDialog.Builder(this); 

    // set the AlertDialog message 
    confirmBuilder.setMessage(getString(R.string.confirmMessage, tag)); 

    // set AlertDialog negative message 
    confirmBuilder.setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() 
     { 
      // called when Cancel is clicked 
      public void onClick(DialogInterface dialog, int id) 
      { 
       dialog.cancel(); // dismiss dialog 
      } 
     } 
    ); // end call to setNegativeButton 

    // set the AlertDialogs positive button 
    confirmBuilder.setPositiveButton(getString(R.string.delete), new DialogInterface.OnClickListener() 
     { 
      // called when Cancel button is clicked 
      public void onClick(DialogInterface dialog, int id) 
      { 
       tags.remove(tag); // remove tag from tags 

       // get SharePrefrences.Editor to remove saved info 
       SharedPreferences.Editor preferencesEditor = savedSearches.edit(); 
       preferencesEditor.remove(tag); // remove search 
       preferencesEditor.apply(); // save the changes 

       // rebind tags ArrayList to ListView to show updates list 
       adapter.notifyDataSetChanged(); 
      } 
     } // end OnClickListener 
    ); // end call to setPositiveButton 

    confirmBuilder.create().show(); // display AlertDialog 
} // end method Delete Search 

public void addItemsOnSpinner() { 
    activityDropDown = (Spinner) findViewById(R.id.activityDropDown); 
    List<String> list = new ArrayList<String>(); 
    list.add("Walking"); 
    list.add("Running"); 
    list.add("Stairs"); 
    list.add("Generic"); 
    ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list); 
    dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    activityDropDown.setAdapter(dataAdapter); 
} 

// on Item Select Update infoText Hint 
public OnItemSelectedListener acList = new OnItemSelectedListener() { 
    @Override 
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) 
    { 
     String selectedItem = parent.getItemAtPosition(position).toString(); 
     if(selectedItem.equals("Walking")) 
     { 
      infoText.setHint("# of Miles Walked"); 
      } 
     else if(selectedItem.equals("Running")) 
     { 
      infoText.setHint("# of Miles Ran"); 
      } 
     else if(selectedItem.equals("Stairs")) 
     { 
      infoText.setHint("# of Floors Walked"); 
      } 
     else if(selectedItem.equals("Generic")) 
     { 
      infoText.setHint("# of Calories Burned"); 
      } 
     } 
    @Override 
    public void onNothingSelected(AdapterView<?> arg0) { 
     // TODO Auto-generated method stub 
    } 
}; 

public void addListenerOnSpinnerItemSelection() { 
    activityDropDown = (Spinner) findViewById(R.id.activityDropDown); 
    activityDropDown.setOnItemSelectedListener(new CustomOnItemSelectedListener()); 
} 

public void addListenerOnButton() { 
    activityDropDown = (Spinner) findViewById(R.id.activityDropDown); 
    saveButton = (ImageButton) findViewById(R.id.saveButton); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 
    if (id == R.id.action_settings) { 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

}

答えて

0

私は実際にはハ...私の質問への答えを見つけました。

あなたは

public OnClickListener saveButtonListener = new OnClickListener() { 
@Override 
public void onClick(View v) 
{ 
    // create info tags that match drop down activity 
    if (infoText.getText().length() > 0 && infoText.getText().toString().matches(".*\\d+.*") 
      && activityDropDown.getSelectedItem().toString().matches("Walking")) 
    { 
     addTaggedSearch(activityDropDown.getSelectedItem().toString() + " " + infoText.getText().toString() 
       + " Miles"); 
     infoText.setText(""); // clear infoText 
    } 

を詳しく見てみた場合あなたは、私が正しく更新からアプリを防ぐ

adapter.notifyDataSetChanged(); 

を追加することを忘れていることがわかります。

これを解決しようとしている人のおかげで誰もが時間を無駄にしてしまいました。

関連する問題