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;
}
}
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. –
Es tut mir leid, ich bin irgendwie verwirrt. Eine Setter-Methode in welcher Klasse? Und wo soll ich notifyDataSetChanged() aufrufen? – zorrooo
Was genau ist das Problem, vor dem Sie stehen? Wenn die Liste nicht aktualisiert wird. Poste den Code von wordListAdapter –