弹出对话框更新数据库后的Android更新Mainactivity ListView

标签 android database listview

我的主 Activity 有一个 ListView ,显示数据库中的项目。我在操作栏中有一个添加按钮。单击添加按钮时,会弹出一个对话框,用户填写新项目的字段,然后单击“添加”,它将项目添加到数据库中。唯一的问题是 mainactivity 上的 ListView 不会更新以显示新项目。我可以关闭应用程序并重新打开它,然后我会看到新项目。它只是不会立即更新。 (与删除项目相同的问题,只是删除发生在长按上)

主 Activity .java

package blah.blah.blah

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;

public class InitActivity extends FragmentActivity {

    SectionsPagerAdapter mSectionsPagerAdapter;

    ViewPager mViewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // Gets the data repository in write mode
        PlayersDBHelper mDbHelper = new PlayersDBHelper(getBaseContext());
        SQLiteDatabase db = mDbHelper.getWritableDatabase();


        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_init);

        // Create the adapter that will return a fragment for each of the three
        // primary sections of the app.
        mSectionsPagerAdapter = new SectionsPagerAdapter(
                getSupportFragmentManager());

        // Set up the ViewPager with the sections adapter.
        mViewPager = (ViewPager) findViewById(R.id.pager);
        mViewPager.setAdapter(mSectionsPagerAdapter);

    }//End onCreate()

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

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle presses on the action bar items
        switch (item.getItemId()) {
            case R.id.action_add:
                showAddPlayerDialog();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    public void showAddPlayerDialog() {
        // Create an instance of the dialog fragment and show it
        DialogFragment dialog = new addPlayerDialog();
        dialog.show(this.getFragmentManager(), "addPlayerFragment");
    }

    public class SectionsPagerAdapter extends FragmentPagerAdapter {

        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {

            if(position == 0) {
                Fragment playersFragment = new PlayersFragment();
                return playersFragment;
            } else if(position == 1){
                Fragment otherFragment= new otherFragment();
                return otherFragment;
            } else {
                Fragment otherFragment2 = new otherFragment2();
                return otherFragment2;
            }

        }

        @Override
        public int getCount() {
            // Show 3 total pages.
            return 3;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            Locale l = Locale.getDefault();
            switch (position) {
            case 0:
                return getString(R.string.title_section1).toUpperCase(l);
            case 1:
                return getString(R.string.title_section2).toUpperCase(l);
            case 2:
                return getString(R.string.title_section3).toUpperCase(l);
            }
            return null;
        }
    }//End sectionsPagerAdapter()


    public static class PlayersFragment extends Fragment {

        public static final String ARG_SECTION_NUMBER = "section_number";
        public int myFragmentId = 1;
        private ListView mylistview;
        private String[] values;

        public ArrayAdapter<String> adapter;



        public PlayersFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {

            View rootView = inflater.inflate(R.layout.fragment_players,
                    container, false);
            mylistview = (ListView) rootView.findViewById(R.id.myListView);

            registerForContextMenu(mylistview);

            PlayersDBHelper mDbHelper = new PlayersDBHelper(rootView.getContext());
            SQLiteDatabase db = mDbHelper.getReadableDatabase();

            // Define a projection that specifies which columns from the database
            // you will actually use after this query.
            String[] projection = {
                PlayerEntry._ID,
                PlayerEntry.COLUMN_NAME_ID,
                PlayerEntry.COLUMN_NAME_NAME,
                PlayerEntry.COLUMN_NAME_POSITION
                };
            String selection = null;            //Null will return all rows for given table
            String[] selectionArgs = null;      //Null should return all data

            // How you want the results sorted in the resulting Cursor
            String sortOrder =
                    PlayerEntry.COLUMN_NAME_NAME + " DESC";


            Cursor c = db.query(
                PlayerEntry.TABLE_NAME,                   // The table to query
                projection,                               // The columns to return
                selection,                                // The columns for the WHERE clause
                selectionArgs,                            // The values for the WHERE clause
                null,                                     // don't group the rows
                null,                                     // don't filter by row groups
                sortOrder                                 // The sort order
                );

            values = new String[] {};

            String array[] = new String[c.getCount()];
            int i = 0;

            c.moveToFirst();
            while (c.isAfterLast() == false) {
                array[i] = c.getString(c.getColumnIndexOrThrow(PlayerEntry.COLUMN_NAME_NAME));
                i++;
                c.moveToNext();
            }

            for(int x = 0; x < array.length ; x++){
                Log.d("Logan", "Entry at:" + x + " is " + array[x]);
                values = push(values, array[x]);
            }

            adapter = new ArrayAdapter<String>(this.getActivity(),
                android.R.layout.simple_list_item_1, values);
            mylistview.setAdapter(adapter);

            return rootView;
        }

        private static String[] push(String[] array, String push) {
            String[] longer = new String[array.length + 1];
            for (int i = 0; i < array.length; i++)
                longer[i] = array[i];
            longer[array.length] = push;
            return longer;
        }

        @Override
        public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo) {
          if (v.getId()==R.id.myListView) {
            AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)menuInfo;
            menu.setHeaderTitle(values[info.position]);
            String[] menuItems = {"Edit", "Delete"};
            for (int i = 0; i<menuItems.length; i++) {
              menu.add(Menu.NONE, i, i, menuItems[i]);
            }
          }
        }

        @Override
        public boolean onContextItemSelected(MenuItem item) {

           PlayersDBHelper mDbHelper = new PlayersDBHelper(getActivity());
           final SQLiteDatabase db = mDbHelper.getWritableDatabase();


            AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)item.getMenuInfo();
            int menuItemIndex = item.getItemId();
            String[] menuItems = {"Edit", "Delete"};
            String menuItemName = menuItems[menuItemIndex];
            String listItemName = values[info.position];

            if(menuItemName.equalsIgnoreCase("Edit")) {

            } else {
                //menuItemName === Delete
                // Define 'where' part of query.
                String selection = PlayerEntry.COLUMN_NAME_NAME + " =? ";

                // Specify arguments in placeholder order.
                String[] selectionArgs = { listItemName };

                // Issue SQL statement.
                db.delete(PlayerEntry.TABLE_NAME, selection, selectionArgs);

                adapter.notifyDataSetChanged();
            }
            return true;
        }


    }

    public static class otherFragment extends Fragment {

        public static final String ARG_SECTION_NUMBER = "section_number";

        public otherFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_lineup,
                    container, false);
            return rootView;
        }
    }

    public static class otherFragment2 extends Fragment {

        public static final String ARG_SECTION_NUMBER = "section_number";

        public otherFragment2() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_position,
                    container, false);
            return rootView;
        }
    }

}

addPlayerDialog.java

package blah.blah.blah;

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.text.Editable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Spinner;

public class addPlayerDialog extends DialogFragment{

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        // Gets the data repository in write mode
       PlayersDBHelper mDbHelper = new PlayersDBHelper(getActivity().getBaseContext());
       final SQLiteDatabase db = mDbHelper.getWritableDatabase();

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        // Get the layout inflater
        final LayoutInflater inflater = getActivity().getLayoutInflater();

        // Inflate and set the layout for the dialog
        // Pass null as the parent view because its going in the dialog layout
        final View view = inflater.inflate(R.layout.addplayerdialog, null);

        final ListView list = (ListView)view.findViewById(R.id.myListView);

        builder.setView(view)
        // Add action buttons
               .setPositiveButton(R.string.add, new DialogInterface.OnClickListener() {
                   @Override
                   public void onClick(DialogInterface dialog, int id) {
                       // sign in the user ...
                       EditText fName = (EditText) view.findViewById(R.id.editFirstName);
                       Editable firstName = fName.getText();

                       EditText lName = (EditText) view.findViewById(R.id.editLastName);
                       Editable lastName = lName.getText();

                       EditText number = (EditText) view.findViewById(R.id.playerNumber);
                       int num = Integer.parseInt(number.getText().toString());

                       Spinner spinner = (Spinner) view.findViewById(R.id.positionSpinner);
                       String position = spinner.getSelectedItem().toString();

                       // Create a new map of values, where column names are the keys
                       ContentValues values = new ContentValues();
                       values.put(PlayerEntry.COLUMN_NAME_ID, num);
                       values.put(PlayerEntry.COLUMN_NAME_NAME, firstName + " " + lastName);
                       values.put(PlayerEntry.COLUMN_NAME_POSITION, position);

                       // Insert the new row, returning the primary key value of the new row
                       long newRowId;
                       newRowId = db.insert(
                               PlayerEntry.TABLE_NAME,
                               null,
                               values);
                       //**** HERE IS WHERE I THINK THE CHANGE NEEDS TO BE! ****
                        ((ArrayAdapter) list.getAdapter()).notifyDataSetChanged();

                   }
               })
               .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int id) {
                       dialog.cancel();
                   }
               });

        Spinner spinner = (Spinner) view.findViewById(R.id.positionSpinner);
        // Create an ArrayAdapter using the string array and a default spinner layout
        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(),
                R.array.positions, android.R.layout.simple_spinner_item);
        // Specify the layout to use when the list of choices appears
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        // Apply the adapter to the spinner
        spinner.setAdapter(adapter);

        return builder.create();
    }
}

addPlayerDialog.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <EditText
        android:id="@+id/editFirstName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="@string/fName" >

        <requestFocus />
    </EditText>

    <EditText
        android:id="@+id/editLastName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="@string/lName" />

    <EditText
        android:id="@+id/playerNumber"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="@string/playerNumberHint"
        android:inputType="number" />

    <Spinner
        android:id="@+id/positionSpinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

最佳答案

我认为您将数据插入了数据库,但忘记在调用 notifyDataSetChanged 之前调用 yourListViewAdapter.add 方法

关于弹出对话框更新数据库后的Android更新Mainactivity ListView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29812361/

相关文章:

python - 允许重复键的 python 中的 BTree 实现?

android - 应用启动后 Imageview 可见 3 秒

android - 如何为android形状绘制梯形?

java - 通过 Android Activity 类访问创建变量

Android Studio 永远无法下载 fastutil-7.2.0.jar

php - 如何提高 MySQL 数据库的性能

php - 如何在不丢失WordPress站点的情况下删除WordPress数据库中的主表?

java - 使用数组适配器将对象的多个值分配给 ListView 中的单个项目

listview - ContentResolver$CursorWrapperInner 无法转换

android - 新的可扩展 ListView 高度可定制