6

Android アプリの状況があります。シナリオは、実際にはフラグメントである 3 つのページがあるビューページ アダプターを使用しています。問題は、ダイアログ アクティビティからこれらを更新することです。フラグメントを更新したいonclickイベント。

まず第一に、可能であれば、参加して私を助けてください。

乾杯ガウラフ

これは私のビューページアダプターです

/*
 * Copyright (C) 2012 Gaurav Rawat
 * 
 */
package com.punksrant.ifinddryday.adapter;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

import com.punksrant.ifinddryday.fragment.AllFragment;
import com.punksrant.ifinddryday.fragment.HomeFragment;
import com.punksrant.ifinddryday.fragment.SynchFragment;
import com.punksrant.ifinddryday.utils.IFindDryDaysConstants;
import com.viewpagerindicator.TitleProvider;

public class ViewPagerAdapter extends FragmentPagerAdapter implements
        TitleProvider {

    private static String[] titles = IFindDryDaysConstants.titles;

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

    @Override
    public String getTitle(int position) {
        return titles[position % titles.length].toUpperCase();
    }

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

    @Override
    public Fragment getItem(int position) {
        Fragment fragment;
        switch (position) {
        case 0:
            fragment = HomeFragment.newInstance();
            break;
        case 1:
            fragment = AllFragment.newInstance();
            break;

        case 2:
            fragment = SynchFragment.newInstance(titles[position
                    % titles.length]);
            break;

        default:
            fragment = HomeFragment.newInstance();
        }
        return fragment;
    }

}
' and in this I want to refresh the home fragment from my dialog class 
'/*
 * Copyright (C) 2012 Gaurav Rawat
 * 
 */
package com.punksrant.ifinddryday.activity;

import roboguice.inject.ContentView;
import roboguice.inject.InjectView;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

import com.github.rtyley.android.sherlock.roboguice.activity.RoboSherlockFragmentActivity;
import com.google.inject.Inject;
import com.punksrant.ifinddryday.model.Coordinates;
import com.punksrant.ifinddryday.utils.DryDayJSONResParser;
import com.punksrant.ifinddryday.utils.IFindDryDayViewUtils;

@ContentView(R.layout.statedialog)
public class Dialog extends RoboSherlockFragmentActivity {
    @InjectView(R.id.dialogList)
    ListView listView;
    @Inject
    SharedPreferences preferences;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        String[] states = DryDayJSONResParser.getSupportedStates();
        listView.setAdapter(new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, android.R.id.text1, states));
        listView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                String state = ((TextView) view).getText().toString();
                Coordinates coordinates = IFindDryDayViewUtils
                        .getCoordinatesFromPreferences(preferences);
                coordinates.setState(state);
                IFindDryDayViewUtils.updateCityFromLocation(coordinates,
                        preferences);

                finish();
            }

        });
    }
},
4

1 に答える 1

1

(blahdiblah rui.araujo の功績) これを達成するにはいくつかの方法があります。

最初のオプションは簡単ですが、少し非効率的です。

次のようにオーバーライドgetItemPositionします。PagerAdapter

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

このように、 を呼び出すnotifyDataSetChanged()と、ビュー ページャーはすべてのビューを削除し、すべてを再読み込みします。このようにリロード効果が得られます。

alvarolb によって提案された2 番目のオプションは、新しいビューをインスタンス化するときにsetTag()メソッドを使用することです。instantiateItem()次に、 を使用する代わりに、 を使用して、更新するビューを見つけることnotifyDataSetChanged()ができます。findViewWithTag()

2 番目のアプローチは、非常に柔軟で高性能です。元の研究のためのalvarolbへの称賛。

于 2013-05-10T17:17:01.773 に答える