2016-08-12 2 views
0

ich versuche die folgende Aufgabe ausführen:Aktualisierung Listview innerhalb Fragment nach String wurde auf SQLite-Datenbank von einem anderen SearchActivity hinzugefügt

Grundsätzlich hat ein Teil meines Codes eine Suche, die eine Abfrage vom Benutzer akzeptiert, die dann sah in einer Dictionary-Klasse instanziiert in meiner SearchActivity. Diese Wörter werden dann in einem Array gespeichert, das wiederum in einer Datenbank gespeichert und dann in einer ListView für eine Fragment-Klasse angezeigt wird. Alles scheint gut zu funktionieren, abgesehen von der Tatsache, dass das ListView in der Fragment-Klasse nicht aktualisiert wird, wenn ich zur ursprünglichen Aktivität zurückkehre (mit der integrierten Zurück-Schaltfläche des Emulators).

Wenn ich jedoch meine Aktivität erneut initialisiere, ist das ListView in der Fragment-Klasse tatsächlich auf dem neuesten Stand.

Ich habe versucht, die beliebten Lösungen in diesem Thread vorgeschlagen (ViewPager PagerAdapter not updating the View), aber keiner von ihnen funktioniert. Eine zweifelhafte Teillösung, die ich versuchte, war, einen neuen Adapter in jedem einzelnen der setOnTabSelectedListener-Listener zu setzen, aber das verbrauchte nur zu viele Ressourcen und die ListView wurde nur aktualisiert, wenn ich auf TabLayout klickte.

Hier ist mein Code, als Referenz:

BookSwipe.java (dies ist die Aktivität, die die Fragmente und die TabLayout verwaltet)

public class BookSwipe extends AppCompatActivity { 
TextView tvTitle; 
TextView tvAuthor; 
WebView wbDescription; 
ImageView ivCover; 

CustomAdapter adapter; 

String bookTitle; 

public void startActivity(Intent intent) { 
    // check if search intent 
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
     intent.putExtra("KEY", bookTitle); 
    } 

    super.startActivity(intent); 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    TabLayout tabLayout; 
    final ViewPager viewPager; 


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


    Bundle bundle = getIntent().getExtras(); 

    bookTitle = bundle.getString("data"); 

    System.out.println(bookTitle); 

    viewPager = (ViewPager) findViewById(R.id.viewPager); 

    adapter = new CustomAdapter(getSupportFragmentManager(), getActionBar()); 
    viewPager.setAdapter(adapter); 

    tabLayout = (TabLayout) findViewById(R.id.tabLayout); 
    tabLayout.setupWithViewPager(viewPager); 


    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
     @Override 
     public void onTabSelected(TabLayout.Tab tab) { 

      viewPager.setCurrentItem(tab.getPosition()); 
      -- viewPager.setAdapter(adapter); 

     } 

     @Override 
     public void onTabUnselected(TabLayout.Tab tab) { 
      viewPager.setCurrentItem(tab.getPosition()); 
      -- viewPager.setAdapter(adapter); 
     } 

     @Override 
     public void onTabReselected(TabLayout.Tab tab) { 
      viewPager.setCurrentItem(tab.getPosition()); 
      -- viewPager.setAdapter(adapter); 
     } 
    }); 
} 

public boolean onCreateOptionsMenu(Menu menu) { 

    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.options_menu, menu); 

    SearchManager searchManager = 
      (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
    SearchView searchView = 
      (SearchView) menu.findItem(R.id.search2).getActionView(); 
    searchView.setSearchableInfo(
      searchManager.getSearchableInfo(getComponentName())); 

    return true; 

} 

public String getBookTitle() { 
    return bookTitle; 
} 

public void setBookTitle(String bookTitle) { 
    this.bookTitle = bookTitle; 
} 


private class CustomAdapter extends FragmentStatePagerAdapter { 

    private String[] fragments = {"Information", "Words", "Quotes"}; 

    public CustomAdapter(FragmentManager supportFragmentManager, ActionBar actionBar) { 
     super(supportFragmentManager); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     switch (position) { 
      case 0: 
       return new BookProfileFragment(bookTitle); 
      case 1: 
       return new BookWordsFragment(bookTitle); 
      case 2: 
       return new BookQuotesFragment(bookTitle); 
      default: 
       return null; 
     } 
    } 

    @Override 
    public int getCount() { 
     return fragments.length; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return fragments[position]; 
    } 

    @Override 
    public int getItemPosition(Object object) { 
     return POSITION_NONE; 
    } 
} 

}

SearchActivity.java (zeigt die Definition des Wortes an)

public class SearchActivity erweitert AppCompatActivity implementiert Konstanten {

TextView dfnDisplay; 
private static String LIST_SEPARATOR = "__,__"; 
public String query; 
public String mValue; 

MyDBHandler dbHandler; 
SQLiteDatabase newDB; 

ArrayList stringArray = new ArrayList<>(); 

Cursor cursor; 

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

    dfnDisplay = (TextView) findViewById(R.id.displayDfn); 


    handleIntent(getIntent()); 


} 

public void saveBtnAction(View view) { 


    stringArray.add(query); 
    BookWordsFragment.refreshList(stringArray); 
    String sendString = convertListToString(stringArray); 
    dbHandler.addWords(mValue, sendString); 

} 


protected void onNewIntent(Intent intent) { 

    handleIntent(intent); 
} 

private void handleIntent(Intent intent) { 

    mValue = intent.getStringExtra("KEY"); 
    System.out.println(mValue); 

    dbHandler = new MyDBHandler(this.getApplicationContext(), null, null, 1); 
    newDB = dbHandler.getWritableDatabase(); 

    String query2 = "SELECT " + COLUMN_WORDS + " FROM " + TABLE_BOOKS + " WHERE " + COLUMN_BOOK_TITLE + "=\"" + mValue + "\""; 
    cursor = newDB.rawQuery(query2, null); 

    if (cursor.moveToFirst()) { 
     while (cursor.isAfterLast() != true) { 

      String itemname = cursor.getString(cursor.getColumnIndex("words")); 
      System.out.println(itemname); 
      if(itemname != null){ 
       stringArray = (ArrayList) convertStringToList(itemname); 
      } 

      break; 
     } 
    } 

    if (Intent.ACTION_SEARCH.equals(intent.getAction())) { 
     query = intent.getStringExtra(SearchManager.QUERY); 
     dfnDisplay.setText(English.processDefinition(query)); 
     dfnDisplay.setMovementMethod(new ScrollingMovementMethod()); 
    } 
} 


public static String convertListToString(List<String> stringList) { 
    StringBuffer stringBuffer = new StringBuffer(); 
    for (String str : stringList) { 
     stringBuffer.append(str).append(LIST_SEPARATOR); 
    } 

    int lastIndex = stringBuffer.lastIndexOf(LIST_SEPARATOR); 
    stringBuffer.delete(lastIndex, lastIndex + LIST_SEPARATOR.length() + 1); 

    return stringBuffer.toString(); 
} 

public static List<String> convertStringToList(String str) { 

    List<String> list = new ArrayList(Arrays.asList(str.split(LIST_SEPARATOR))); 

    return list; 
} } 

BookWordsFragment.java (dies ist das Fragment, wo die Listview gespeichert ist)

public class BookWordsFragment extends Fragment implements Constants { 

MyDBHandler dbHandler; 
SQLiteDatabase newDB; 
Cursor cursor; 

public static ArrayAdapter wordListAdapter; 
public ListView wordList; 

public String bookTitle; 

static List<String> stringArray = new ArrayList<>(); 



public BookWordsFragment() { 

} 

public BookWordsFragment(String bookTitle){ 
    this.bookTitle = bookTitle; 
} 


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

    View rootView = inflater.inflate(R.layout.fragment_book_words, container, false); 


    wordList = (ListView) rootView.findViewById(R.id.savedWordsList); 



    stringArray = populateArray(); 

    wordListAdapter = new CustomListAdapter(getActivity(), R.layout.custom_list, stringArray); 
    wordList.setAdapter(wordListAdapter); 


    if(!stringArray.isEmpty()){ 

    } 

    wordListAdapter.notifyDataSetChanged(); 

    return rootView; 
} 


public List<String> populateArray(){ 

    List<String> list = new ArrayList(); 

    dbHandler = new MyDBHandler(this.getActivity(), null, null, 1); 
    newDB = dbHandler.getWritableDatabase(); 

    String query2 = "SELECT " + COLUMN_WORDS + " FROM " + TABLE_BOOKS + " WHERE " + COLUMN_BOOK_TITLE + "=\"" + bookTitle + "\""; 
    cursor = newDB.rawQuery(query2, null); 

    if (cursor.moveToFirst()) { 
     while (cursor.isAfterLast() != true) { 

      String itemname = cursor.getString(cursor.getColumnIndex("words")); 
      System.out.println("THIS IS : " + itemname); 

      if(itemname != null){ 
       list = SearchActivity.convertStringToList(itemname); 
       System.out.println(stringArray); 
      } 

      break; 
     } 
    } 

    return list; 
} 

public static void refreshList(ArrayList stringArrayCopy){ 
    stringArray = stringArrayCopy; 
    wordListAdapter.notifyDataSetChanged(); 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    wordListAdapter.notifyDataSetChanged(); 
} 

}

Hier sind einige Bilder als Referenz : Displaying the Fragment Displaying the definition in SearchActivity

Vielen Dank im Voraus.

EDIT:

Hier ist der Code für meine CustomListAdapter, wie in den Kommentaren angefordert

class CustomListAdapter extends ArrayAdapter { 

    private Context mContext; 
    private int id; 
    private List<String> items ; 

    public CustomListAdapter(Context context, int textViewResourceId , List<String> list) 
    { 
     super(context, textViewResourceId, list); 
     mContext = context; 
     id = textViewResourceId; 
     items = list ; 
    } 

    @Override 
    public View getView(int position, View v, ViewGroup parent) 
    { 
     View mView = v ; 
     if(mView == null){ 
      LayoutInflater vi = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      mView = vi.inflate(id, null); 
     } 

     TextView text = (TextView) mView.findViewById(R.id.textView); 

     if(items.get(position) != null) 
     { 
      text.setTextColor(Color.BLACK); 
      text.setText(items.get(position)); 
      text.setTextSize(30); 

     } 

     return mView; 
    } 


} 
+0

eine Setter-Methode in Ihrem 'wordListAdapter' erstellen, die die Liste akzeptiert, dann in Adapter assign die Liste, die Sie in Setter-Methode in die Liste erhalten Sie in' wordListAdapter' halten. Rufen Sie dann 'notifyDataSetChanged()' auf. –

+0

Es tut mir leid, ich bin irgendwie verwirrt. Eine Setter-Methode in welcher Klasse? Und wo soll ich notifyDataSetChanged() aufrufen? – zorrooo

+0

Was genau ist das Problem, vor dem Sie stehen? Wenn die Liste nicht aktualisiert wird. Poste den Code von wordListAdapter –

Antwort

1

Erstellen Sie eine Methode in Ihrer CustomListAdapter Klasse wie:

public void setList(ArrayList<String> wordsList) { 
    items = wordsList; //items is the list you have as a field in adapter. 
    notifyDatasetChanged(); 
} 

In Ihrem Fragmente onResume(),

@Override 
public void onResume() { 
    super.onResume(); 
    stringArray = populateArray(); 
    wordListAdapter.setList(stringArray); 
} 

EDIT:

Sie haben eine kleine Änderung in dem Adapter zu machen.Fügen Sie diese unten Methoden:

@Override  
public int getCount() { 
    return items.size(); 
} 

@Override 
public String getItem(int position) { 
    return items.get(position); 
} 
+0

Das macht nicht viel Sinn. Warum würdest du das in 'onResume()' machen? Auf diese Weise wird die DB abgefragt und die Liste wird jedes Mal neu initialisiert, wenn onResume() 'aufgerufen wird, selbst wenn überhaupt keine Änderungen vorgenommen wurden. – earthw0rmjim

+0

Wie würde er dann erfahren, dass die Datenbank aktualisiert wird? Wenn er weiß, wann die Datenbank aktualisiert wird, kann er den fortlaufenden Code in eine Methode verschieben und diese Methode aufrufen, wenn die Datenbank aktualisiert wird. Sollte den Code basierend auf Szenario ändern. Dies ist die Lösung für sein aktuelles Problem, nicht für die Optimierung. –

+0

Vielen Dank für die Spezifikation, aber ich bekomme diesen Fehler jetzt https://gyazo.com/35e79aec2c29ce5998769b1ecfefe88d – zorrooo

Verwandte Themen