【问题标题】:Refreshing ListView or ViewPager from a non fragment activity从非片段活动刷新 ListView 或 ViewPager
【发布时间】:2015-09-17 12:36:29
【问题描述】:

有人熟悉这个吗?我有一个活动类,当我从选项卡单击列表视图时显示内容,它还有一个复选框(收藏夹/书签),可在不同选项卡上创建收藏列表。问题是当我单击复选框并返回选项卡时,列表视图不会更新。我需要关闭应用程序才能显示新内容。这是活动类

public class DisplayContent extends Activity {

private static final float BYTES_PER_PX = 4.0f;

HashMap<String, List<String>> Content_category;
List<String> Content_list;
ExpandableListView Exp_list;
ContentAdapter adapter;

/* Front Content*/
ImageView image;
TextView name, desc;
CheckBox cb;


Context context;
DbHerbs myDb;
TabTwo repopulate;

String getThis;
long conID;
int imgId;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.display_content);
    getActionBar().setDisplayHomeAsUpEnabled(true);
    testConnection();
    setViewId();
    getContent();  
     }


private void getContent()
{
    getThis = getIntent().getStringExtra(TabOne.GET_THIS);
    conID = Long.parseLong(getThis);

    String conFav = myDb.getFav(conID);
    imgId = myDb.getImage(conID);
    loadImage();

    String conName = myDb.getName(conID);


    /*Send to expandable list view*/
    String conDesc = myDb.getDescription(conID);
    String conUses = myDb.getUses(conID);
    String conPartsUsed = myDb.getPartsUsed(conID);
    String conApplications= myDb.getApplications(conID);
    String conSideEffects= myDb.getSideEffects(conID);
    String conAltName = myDb.getAltName(conID);

    Content_category = getInfo(conDesc, conUses, conPartsUsed, conApplications, conSideEffects, conAltName);
    Content_list = new ArrayList<String>(Content_category.keySet());
    adapter = new ContentAdapter(this, Content_category, Content_list);
    Exp_list.setAdapter(adapter);

    if(conFav.equals("1"))
    {
    cb.setChecked(true);
    }else if(conFav.equals("0"))
    {
    cb.setChecked(false);
    }
    closeDb();
    name.setText(conName);
}


public void favList(View v)
{
    myDb.open();
    String fav = myDb.getFav(conID);
    myDb.updateFavorite(conID, fav);
    Log.d(fav, "nagbago ulit");
//  Toast.makeText(this, "Database Updated" + fav, Toast.LENGTH_LONG).show();
    myDb.close();
//  repopulate.getFavoriteList();
}

这是我想在单击返回或选中复选框时刷新列表视图的选项卡。

public class TabTwo extends Fragment {

public final static String GET_THIS = "com.thesisdatabase._id";

DbHerbs myDb;
SimpleCursorAdapter myCursorAdapter;
View rootView;
ListView listview;

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

public void getFavoriteList()
{
    String x = "1";
    Cursor cursor = myDb.getAllFavorites(x);
    populateListView(cursor);
}

private void populateListView(Cursor cursor)
{
    //this.getActivity().startManagingCursor(cursor);
//  this.getActivity().startManagingCursor(cursor);
    String[] fromFieldNames = new String[] {DbHerbs.KEY_NAME, DbHerbs.KEY_DESCRIPTION};
    int[] toViewIDs = new int[] {R.id.tvName, R.id.tvDesc};
    myCursorAdapter = new SimpleCursorAdapter(this.getActivity(), R.layout.custom_listview, cursor, fromFieldNames, toViewIDs, 0);
    ListView listview = (ListView) rootView.findViewById(R.id.listView2);
    listview.setAdapter(myCursorAdapter);
}

private void clickListView()
{
    ListView listview = (ListView) rootView.findViewById(R.id.listView2);
    listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long dbID) {
            Cursor cursor = myDb.getRow(dbID);
            String sendThis = String.valueOf(dbID);

            if(cursor.moveToFirst()){   
                /* Transfers the row id of the clicked item into the next class and then displays */
                Intent intent = new Intent(getActivity(), DisplayContent.class);
                intent.putExtra(GET_THIS, sendThis);
                startActivity(intent);

            }
    cursor.close();     
        }
    });
}

这是我的主要活动类

public class MainActivity extends FragmentActivity implements
    ActionBar.TabListener {


TabTwo tabtwo;
private boolean doubleBackToExitPressedOnce;
private ViewPager viewPager;
private TabsPagerAdapter mAdapter;
private ActionBar actionBar;
// Tab titles
private String[] tabs = { "A-Z", "Favorites", "History" };

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

    // Initilization
    viewPager = (ViewPager) findViewById(R.id.pager);
    actionBar = getActionBar();
    mAdapter = new TabsPagerAdapter(getSupportFragmentManager());
    viewPager.setAdapter(mAdapter);

    actionBar.setHomeButtonEnabled(false);
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);        

    // Adding Tabs
    for (String tab_name : tabs) {
        actionBar.addTab(actionBar.newTab().setText(tab_name)
                .setTabListener(this));
    }

    /**
     * on swiping the viewpager make respective tab selected
     * */
    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

        @Override
        public void onPageSelected(int position) {
            // on changing the page
            // make respected tab selected

            actionBar.setSelectedNavigationItem(position);
        //  mAdapter.notifyDataSetChanged();
            //tabtwo.getFavoriteList();

        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
        }
    });
}

@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}

@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
    // on tab selected
    // show respected fragment view
    viewPager.setCurrentItem(tab.getPosition());

}

@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
}

最后一个适配器类

public class TabsPagerAdapter extends FragmentPagerAdapter {

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

@Override
public Fragment getItem(int index) {

    switch (index) {
    case 0:
        return new TabOne();
    case 1:
        return new TabTwo();
    case 2:
        return new TabThree();
    }

    return null;
}

@Override
public int getCount() {
    // get item count - equal to number of tabs
    return 3;
}

【问题讨论】:

    标签: android android-fragments android-listview


    【解决方案1】:

    您在 getfavoritelist 中创建光标并将其传递给 populateviewlist,但不要关闭它。

    public void getFavoriteList()
    {
        String x = "1";
        Cursor cursor = myDb.getAllFavorites(x);
        populateListView(cursor);
    }
    
    private void populateListView(Cursor cursor)
    {
        //this.getActivity().startManagingCursor(cursor);
        //  this.getActivity().startManagingCursor(cursor);
        String[] fromFieldNames = new String[] {DbHerbs.KEY_NAME, DbHerbs.KEY_DESCRIPTION};
        int[] toViewIDs = new int[] {R.id.tvName, R.id.tvDesc};
        myCursorAdapter = new SimpleCursorAdapter(this.getActivity(), R.layout.custom_listview, cursor, fromFieldNames, toViewIDs, 0);
        ListView listview = (ListView) rootView.findViewById(R.id.listView2);
        listview.setAdapter(myCursorAdapter);
    }
    

    同样,您并不总是关闭光标。这取决于 if 语句的评估。

     @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long dbID) {
            Cursor cursor = myDb.getRow(dbID);
            String sendThis = String.valueOf(dbID);
    
            if(cursor.moveToFirst()){   
                /* Transfers the row id of the clicked item into the next class and then displays */
                Intent intent = new Intent(getActivity(), DisplayContent.class);
                intent.putExtra(GET_THIS, sendThis);
                startActivity(intent);
    
            }
    cursor.close();     
    

    您需要浏览您的代码并清理它们。

    【讨论】:

    • 所以我需要关闭所有 onitemclick 事件?并且必须避免通过它?
    • 那么在 populatelistview() 我可以在哪里关闭光标?如果我不将光标作为参数传递会更好吗?这样我就可以在列表视图上的点击事件之后关闭它?
    • 慢慢来 :) 感谢您的帮助 :)
    • 我明白了,:) 谢谢。我会检查一下,我已经很困惑了。最好把一切都说清楚。
    • 改变了?哦,我只能选择一个? xD
    【解决方案2】:

    调用适配器类的notifyDatasetChanged() 方法以指示ListView 的数据已更改。当用户返回列表所在的选项卡时,您可以在onPageSelected() 中执行此操作。

    【讨论】:

    • 我很好奇,当您填充列表视图时,我无法关闭对吗?当我没有在 tabpager 适配器中声明它时,notifydatasetchanged() 不起作用 public int getItemPosition(Object object){ return POSITION_NONE; }
    • 那么我在哪里可以关闭我的光标呢?我应该在点击事件之后关闭吗?那我真的需要清理我的代码。 xD
    【解决方案3】:

    将您的设置逻辑移至 onResume

    @Override
    public void onResume(){
    super.onResume();
    testConnection();
        clickListView();
        getFavoriteList();
    }
    

    而且总是关闭光标

    【讨论】:

      【解决方案4】:

      在选项卡之间滑动时,活动会被终止。所以试试这个。

      yourViewPager.setOffscreenPageLimit(n-1);
      

      其中 n 是您的 TabLayout 中的选项卡数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多