在saveButton之后,Android ListView没有更新,但是在onItemSelected之后

时间:2016-03-25 00:34:58

标签: java android xml eclipse

我目前正在为学校开发Android应用程序。我已经浏览了论坛,并试图自己解决这个问题,但我似乎无法弄清楚为什么当我按下保存按钮时我的ListView不会自动更新。我实际上必须按下拉下拉菜单并在更新之前选择和项目。任何人都可以看看它,让我知道我做错了什么?

谢谢!

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

}

1 个答案:

答案 0 :(得分: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();

这会阻止应用正确更新。

感谢任何试图解决这个问题的人,并为浪费任何人的时间而感到抱歉:)