2015-04-23 65 views
1

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

Mainactivity.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> 

回答

1

我想你插入数据到数据库,但忘记调用方法之前拨打notifyDataSetChanged

+0

什么是最好的方式来获取适配器的列表视图?我认为我没有正确的做法。 –

+0

谷歌关于'自定义适配器',这个链接应该很好地为您服务:http://www.vogella.com/tutorials/AndroidListView/article.html –