gpt4 book ai didi

android - 从 Activity 解析到 fragment 的数据不会出现在第一次加载时

转载 作者:行者123 更新时间:2023-11-29 18:27:59 25 4
gpt4 key购买 nike

我有一个 fragment ,我在其中加载回收器 View ,并从一个从 JSON 加载数据的 Activity 中为其加载数据。但是,当 fragment 第一次打开时,它不会加载数据,只有在再次单击 fragment 时才会加载。下面列出了我的 Activity 和 fragment 的代码。

Activity

public class MainActivity extends AppCompatActivity {
ActionBar actionbar;
TextView textview;
ActionBar.LayoutParams layoutparams;
public static final int NUMBER_OF_ADS = 2;

private RequestQueue mRequestQueue;
private AdLoader adLoader;
private List<Object> mTrollList = new ArrayList<>();
private List<UnifiedNativeAd> mNativeAds = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MobileAds.initialize(this, getString(R.string.admob_app_id));
BottomNavigationView bottomnav = findViewById(R.id.bottom_navigation);
BottomNavigationViewHelper.removeShiftMode(bottomnav);
bottomnav.setOnNavigationItemSelectedListener(navListener);

mRequestQueue = Volley.newRequestQueue(this);


getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container ,new VideoFragment()).commit();
bottomnav.setSelectedItemId(R.id.navigation_videos);
getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
getSupportActionBar().setCustomView(R.layout.actionbar_new);
bottomnav.setItemIconTintList(null);
if (savedInstanceState == null) {
// Update the RecyclerView item's list with menu items.
addMenuItemsFromJson();
// Update the RecyclerView item's list with native ads.
loadNativeAds();

}
}

private void insertAdsInMenuItems() {
if (mNativeAds.size() <= 0) {
return;
}
if(mTrollList.size()<1){
return;
}
int offset = (mTrollList.size() / mNativeAds.size()) + 1;
int index = 2;
for (UnifiedNativeAd ad : mNativeAds) {
mTrollList.add(index, ad);
index = index + offset;
}

}

private void loadNativeAds() {

AdLoader.Builder builder = new AdLoader.Builder(Objects.requireNonNull(this), getString(R.string.ad_unit_id));
adLoader = builder.forUnifiedNativeAd(
new UnifiedNativeAd.OnUnifiedNativeAdLoadedListener() {
@Override
public void onUnifiedNativeAdLoaded(UnifiedNativeAd unifiedNativeAd) {
// A native ad loaded successfully, check if the ad loader has finished loading
// and if so, insert the ads into the list.
mNativeAds.add(unifiedNativeAd);
if (!adLoader.isLoading()) {
insertAdsInMenuItems();
}
}
}).withAdListener(
new AdListener() {
@Override
public void onAdFailedToLoad(int errorCode) {
// A native ad failed to load, check if the ad loader has finished loading
// and if so, insert the ads into the list.
Log.e("MainActivity", "The previous native ad failed to load. Attempting to"
+ " load another.");
if (!adLoader.isLoading()) {
insertAdsInMenuItems();
}
}
}).build();

//Do something after 100ms
adLoader.loadAds(new AdRequest.Builder().build(), NUMBER_OF_ADS);
}


public List<Object> getRecyclerViewItems() {
return mTrollList;
}

private void addMenuItemsFromJson(){
String url =getString(R.string.server_link);
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray jsonArray = response.getJSONArray("server_response");
for(int i = 0; i < jsonArray.length(); i++){
JSONObject ser =jsonArray.getJSONObject(i);

String troll_image = ser.getString("troll_image");
String troll_caption = ser.getString("troll_caption");
TrollItem trollItem = new TrollItem(troll_image,troll_caption);
mTrollList.add(trollItem);

}

} catch (JSONException e) {
e.printStackTrace();

}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}

});

mRequestQueue.add(request);
}



public void setActionBarTitle(String title) {
actionbar = getSupportActionBar();

textview = new TextView(getApplicationContext());

layoutparams = new ActionBar.LayoutParams(ActionBar.LayoutParams.MATCH_PARENT, ActionBar.LayoutParams.WRAP_CONTENT);

textview.setLayoutParams(layoutparams);

textview.setText(title);

textview.setTextColor(Color.BLACK);

textview.setGravity(Gravity.CENTER);
textview.setTypeface(null, Typeface.BOLD);

textview.setTextSize(20);

actionbar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);

actionbar.setCustomView(textview);
}

private BottomNavigationView.OnNavigationItemSelectedListener navListener
= new BottomNavigationView.OnNavigationItemSelectedListener() {

@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {

switch (item.getItemId()) {
case R.id.navigation_videos:
Fragment videoFragment = new VideoFragment();
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
videoFragment).commit();
break;
case R.id.navigation_photos:
Fragment photoFragment = new PhotoFragment();
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
photoFragment).commit();
break;
case R.id.navigation_dvd:
Fragment dvdFragment = new DvdFragment();
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
dvdFragment).commit();
break;
case R.id.navigation_news:
Fragment newsFargment = new NewsFragment();
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
newsFargment).commit();
break;
case R.id.navigation_troll:
Log.e("datafirst", String.valueOf(mTrollList.size()+"activity"));
Fragment trollFragment = new TrollFragment();
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container,
trollFragment).commit();
break;
}return true;}};}

fragment

public class TrollFragment extends Fragment {
private RecyclerView mRecyclerView;
private TrollAdapter mTrollAdapter;
private List<Object> mTrollList;



public TrollFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// retain this fragment
setRetainInstance(true);
MainActivity activity = (MainActivity) getActivity();
mTrollList = activity.getRecyclerViewItems();

Log.e("datafirst", String.valueOf(mTrollList.size()));
getContext();

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment

((MainActivity) Objects.requireNonNull(getActivity())).setActionBarTitle("Trolls");
View rootView = inflater.inflate(R.layout.fragment_troll, container, false);
mRecyclerView = rootView.findViewById(R.id.recycler_view_troll);
mRecyclerView.setHasFixedSize(true);


SnapHelper snapHelper = new PagerSnapHelper();
snapHelper.attachToRecyclerView(mRecyclerView);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false));
mTrollAdapter = new TrollAdapter(getActivity(), mTrollList);
mRecyclerView.setAdapter(mTrollAdapter);

return rootView;
}}

最佳答案

而不是从 fragment 中调用 getRecyclerViewItems。使用

将数据传递给您的 fragment
fragmentObject.setArguments(bundle);

然后在你的 fragment 中使用

getArguments(); 

获取数据。

这样您也可以在第一次运行时获取数据,并且您的 fragment 对 MainActivity 的依赖性将被删除( fragment 的使用方式)

关于android - 从 Activity 解析到 fragment 的数据不会出现在第一次加载时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57847615/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com