2016-08-12 64 views
0

我试图执行以下任务:更新ListView控件添加到SQLite数据库从另一个SearchActivity

基本上,我的代码的一部分具有不同于然后看用户接受的查询的搜索查看在我的SearchActivity中实例化的Dictionary类中。然后将这些单词存储到一个数组中,该数组又存储在数据库中,然后显示在Fragment类的ListView中。除了这个事实,一切似乎都很顺利,当我回到原始活动时(使用模拟器的集成后退按钮),Fragment类中的ListView不会更新。

但是,当我再次初始化我的活动时,Fragment类中的ListView确实是最新的。

我已经尝试了这个线程中建议的流行解决方案(ViewPager PagerAdapter not updating the View),但他们都没有工作。我尝试的一个狡猾的部分解决方案是在setOnTabSelectedListener侦听器的每一个侦听器中设置一个新的适配器,但这只是消耗了太多资源,并且仅在单击TabLayout时才更新ListView。

这里是我的代码,以供参考:

BookSwipe.java(这是管理的碎片和TabLayout活动)

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(显示单词的定义)

公共类SearchActivity延伸AppCompatActivity实现常数{

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(这是其中的ListView存储在片段)

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

}

下面是一些图片仅供参考:Displaying the Fragment Displaying the definition in SearchActivity

非常感谢您提前。

编辑:

这里是我的CustomListAdapter的代码,请在评论

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

在创建setter方法你'wordListAdapter'它接受的列表,然后在列表中,您在setter方法收到你'wordListAdapter'维护列表该适配器分配。然后调用'notifyDataSetChanged()'。 –

+0

对不起,我有点困惑。 一个setter方法,其中class?我应该在哪里调用notifyDataSetChanged()? – zorrooo

+0

你面临的问题到底是什么?列表未更新时。发布wordListAdapter的代码 –

回答

1

CustomListAdapter类创建的方法,如:

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

在你片段onResume()

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

编辑:

你必须要在一个适配器变化不大。这些添加方法如下:

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

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

这没有多大意义。你为什么要在'onResume()'中做这个?这样,即使没有任何变化,每次调用onResume()时,都会查询数据库并重新初始化列表。 – earthw0rmjim

+0

那么他怎么会知道数据库更新?如果他知道数据库何时更新,他可以将继续执行的代码移动到方法中,并在更新数据库时调用该方法。应根据场景更改代码。这是解决他目前的问题,而不是优化。 –

+0

谢谢你的规范,但我现在得到这个错误https://gyazo.com/35e79aec2c29ce5998769b1ecfefe88d – zorrooo

相关问题