android - ViewPager 不显示 API 级别 >18 的内容

标签 android android-fragments android-viewpager

我是 Android 的新手,特别是 Fragments,我正面临这个我无法解决的问题,我在这里搜索并发现了一些类似的问题,但没有一个能帮助解决我的问题:

我有一个 Activity 包含一个 TabLayout 和一个 ViewPager 以及一个 fragment 适配器。 PageAdapter 从数据库中获取一些数据并将其发送到三个 fragment 。用户可以更改 Activity 中的日期,它应该重新加载新数据。

Activity 首次加载后,API 16/17 一切正常,但从 18 开始,它不会显示任何数据。此外,当用户更改日期时,第一个和最后一个选项卡会正确更新数据,但第二个和中间选项卡会继续显示过去的内容。

CardapioActivity 的代码

import android.app.DatePickerDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;

import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.DatePicker;
import android.widget.ImageButton;
import android.widget.Spinner;
import android.widget.TextView;


import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.toolbox.Volley;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.Locale;

public class CardapioActivity extends AppCompatActivity {

public TextView msg, data;
private DatePickerDialog toDatePickerDialog;
private SimpleDateFormat dateFormatter;
private Calendar myCalendar;
private TabLayout tabLayout;
private ViewPager viewPager;
private String restaurante;
private ArrayList<String> lista = new ArrayList<>();

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

    msg = (TextView) findViewById(R.id.tv1);
    data = (TextView) findViewById(R.id.data);

    Intent intent = getIntent();
    restaurante = intent.getStringExtra("restaurante");
    lista = intent.getStringArrayListExtra("lista");

    msg.setText(restaurante);
    msg.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            alertaRestaurante();
            carregaFragment();
        }
    });


    //formata data e possibilita seleção a partir do calendário
    myCalendar = Calendar.getInstance();
    dateFormatter = new SimpleDateFormat("dd/MM/yyyy", Locale.getDefault());
    data.setText(dateFormatter.format(myCalendar.getTime()).toString());
    data.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            alertaCalendario();
            carregaFragment();
        }
    });


    //fecha página caso clicado em close
    final ImageButton close = (ImageButton) findViewById(R.id.close);
    close.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            //volta pra activity do mapa
            Intent intent = new Intent(CardapioActivity.this, MainActivity.class);
            CardapioActivity.this.startActivity(intent);
            CardapioActivity.this.finish();
        }
    });

    carregaFragment();
}

carregaFrament() 方法负责创建 TabLayot 并使用 ViewPager 对其进行设置

private void carregaFragment(){
    //viewPager
    viewPager = (ViewPager) findViewById(R.id.vp);
    viewPager.setAdapter(new CustomSlidePageAdapter(getSupportFragmentManager(), CardapioActivity.this));

    //tabLayout
    tabLayout = (TabLayout) findViewById(R.id.tab);
    tabLayout.setupWithViewPager(viewPager);
}

这是 PagerAdapter

private class CustomSlidePageAdapter extends FragmentStatePagerAdapter {

    Bundle bundle = new Bundle();
    private String pages [] = {"DESJEJUM", "ALMOÇO", "JANTA"};
    private Context context;

    public CustomSlidePageAdapter(FragmentManager fm, Context context) {
        super(fm);
        this.context = context;
    }

    @Override
    public Fragment getItem(int position) {
        switch (position){
            case 0:
                ArrayList<Cardapio> lista_desjejum = carregaCardapio("desjejum", msg.getText().toString(), data.getText().toString());
                bundle.putParcelableArrayList("lista_desjejum", lista_desjejum);

                // set Fragmentclass Arguments
                DesjejumFragment desjejum = new DesjejumFragment();
                desjejum.setArguments(bundle);

                return desjejum;
            case 1:
                ArrayList<Cardapio> lista_almoco = carregaCardapio("almoco", msg.getText().toString(), data.getText().toString());
                bundle.putParcelableArrayList("lista_almoco", lista_almoco);

                // set Fragmentclass Arguments
                AlmocoFragment almoco = new AlmocoFragment();
                almoco.setArguments(bundle);

                return almoco;
            case 2:
                ArrayList<Cardapio> lista_janta = carregaCardapio("janta", msg.getText().toString(), data.getText().toString());
                bundle.putParcelableArrayList("lista_janta", lista_janta);

                // set Fragmentclass Arguments
                JantaFragment janta = new JantaFragment();
                janta.setArguments(bundle);

                return janta;
            default:
                return null;
        }
    }

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

    @Override
    public CharSequence getPageTitle(int position){
        return pages[position];
    }

}

这里是三个 fragment 中的一个例子,它们的编码都相似

import android.support.v4.app.ListFragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;


import java.util.ArrayList;


public class DesjejumFragment extends ListFragment {
private ArrayList<Cardapio> c = new ArrayList<>();

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    c = getArguments().getParcelableArrayList("lista_desjejum");
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_desjejum, container, false);
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    ListaCardAdapter adapter = new ListaCardAdapter(getActivity(), c);
    setListAdapter(adapter);
}

这里有一些图片来说明这个问题:

first time on the left, changed date on the right

in the middle tag it doesn't change

这是我尝试在 API 级别 >18 上切换选项卡时的一些 logcat

04-12 23:13:16.831 31009-31009/br.ufrrj.lothar.rural D/ViewRootImpl: ViewPostImeInputStage ACTION_DOWN
04-12 23:13:16.941 31009-7797/br.ufrrj.lothar.rural I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
04-12 23:13:16.941 31009-7797/br.ufrrj.lothar.rural I/qtaguid: Tagging socket 48 with tag ad7277400000000{181872500,0} for uid -1, pid: 31009, getuid(): 10169
04-12 23:13:16.981 31009-7797/br.ufrrj.lothar.rural I/qtaguid: Untagging socket 48
04-12 23:13:17.551 31009-31009/br.ufrrj.lothar.rural D/ViewRootImpl: ViewPostImeInputStage ACTION_DOWN
04-12 23:13:19.661 31009-31009/br.ufrrj.lothar.rural D/ViewRootImpl: ViewPostImeInputStage ACTION_DOWN
04-12 23:13:19.791 31009-7859/br.ufrrj.lothar.rural I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
04-12 23:13:19.791 31009-7859/br.ufrrj.lothar.rural I/qtaguid: Tagging socket 48 with tag ad7277400000000{181872500,0} for uid -1, pid: 31009, getuid(): 10169
04-12 23:13:19.841 31009-7859/br.ufrrj.lothar.rural I/qtaguid: Untagging socket 48
04-12 23:13:20.741 31009-31009/br.ufrrj.lothar.rural D/ViewRootImpl: ViewPostImeInputStage ACTION_DOWN
04-12 23:13:22.611 31009-31009/br.ufrrj.lothar.rural D/ViewRootImpl: ViewPostImeInputStage ACTION_DOWN
04-12 23:13:22.741 31009-7910/br.ufrrj.lothar.rural I/System.out: (HTTPLog)-Static: isSBSettingEnabled false
04-12 23:13:22.741 31009-7910/br.ufrrj.lothar.rural I/qtaguid: Tagging socket 48 with tag ad7277400000000{181872500,0} for uid -1, pid: 31009, getuid(): 10169
04-12 23:13:22.781 31009-7910/br.ufrrj.lothar.rural I/qtaguid: Untagging socket 48

有人能帮帮我吗? P.S.:对于葡萄牙语中的一些变量和方法,可能会造成混淆,提前抱歉。

更新:在 API 级别 21 上,它仅在中间选项卡中显示内容,23 级则什么都不显示。

最佳答案

对于第一个问题,请从 Logcat 和导入中上传一些日志,以帮助社区了解您遇到此问题的原因。

对于第二个问题,您需要更改 fragment 的限制。这个非常重要。使用 viewPager.setOffscreenPageLimit(int);

关于android - ViewPager 不显示 API 级别 >18 的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43376377/

相关文章:

android - 使用 TabLayout 和 Navigation Drawer 设置 Fragments

android - 如何在 XML 中定义一个特定 fragment 实例的样式/主题?

java - 从 Activity 访问 ViewPager Fragment 方法

Android 服务 > Activity > 带有 ViewPager 的 fragment

android - 如何在android中为 map 填充设置动画

java - 如何注意到客户端与服务器断开连接 - JAVA

android - 将 fragment 从一个 Activity 加载到另一个已经在后台的 Activity

安卓。内存泄漏导致内存不足错误。使用查看寻呼机。

java - 最新版本的 Android Studio 中 TextView 的文本对齐选项在哪里?

安卓锁设备通知不响