【问题标题】:ArrayAdapter not displaying data in FragmentArrayAdapter 不在 Fragment 中显示数据
【发布时间】:2016-06-21 18:16:57
【问题描述】:

我已经看到很多关于这个问题的类似问题,但我找不到任何解决方案:

我在由 ViewPager 处理的 TabLayout 中有三个片段,并且在第三个片段中有一个 ListView,在我更改屏幕方向后没有显示任何项目。我尝试设置ArrayAdapter 中 convertView 的背景颜色,以查看它是否已显示,并且在我更改方向后确实未显示它。但这很奇怪,因为在我的第一个片段中,我将相同的 ArrayAdapter 用于另一个 ListView,一切正常,我不明白为什么它不在第三个片段上。 有一件事是肯定的:我几乎在所有地方都检查过 ArrayList.size() 永远不会为零的日志。

这是第三个片段的相关代码:

public class SavedScanFragment extends Fragment{

private ListView lv;
private Database db;
private ArrayList<Scan> scans;
private ScanAdapter adapter;

public static SavedScanFragment newInstance() {
    return new SavedScanFragment();
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    db = new Database(getContext());
    getScans();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View result = inflater.inflate(R.layout.fragment_saved_scan, container, false);
    lv = (ListView) result.findViewById(R.id.saved_scan_list);
    return result;
}

@Override
public void onResume() {
    super.onResume();
    db = new Database(getContext());
    getScans();
}

public void getScans() {
    AsyncTask<Void, Void, Boolean> task = new AsyncTask<Void, Void, Boolean>() {
        @Override
        protected Boolean doInBackground(Void... params) {
            scans = db.getScans();
            if(scans!=null)
                return true;
            else {
                scans = new ArrayList<>();
                return false;
            }
        }

        @Override
        protected void onPostExecute(Boolean result) {
            if(result)
                populateList();
        }
    };
    task.execute();
}

public void populateList() {
    if(getContext()!=null) {
        if (lv.getAdapter() == null) {
            adapter = new ScanAdapter(getContext(), R.layout.scan_list_item, scans);
            lv.setAdapter(adapter);
        } else {
            ((ScanAdapter) lv.getAdapter()).update(scans);
        }
    }
}

还有 ArrayAdapter 的代码:

public class ScanAdapter extends ArrayAdapter<Scan> implements ListAdapter {

private Context context;
private int layoutResourceID;
private ArrayList<Scan> results;

public ScanAdapter(Context context, int layoutResourceID, ArrayList<Scan> results) {
    super(context, layoutResourceID, results);
    this.context = context;
    this.layoutResourceID = layoutResourceID;
    this.results = results;
}

public void update(ArrayList<Scan> scans) {
    results.clear();
    results.addAll(scans);
    notifyDataSetChanged();
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = convertView; //view = row
    ViewHolder holder = null;
    if(view == null) {
        LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(layoutResourceID, parent, false);
        view.setBackgroundColor(Color.GREEN);
        holder = new ViewHolder();

            holder.name = (TextView)view.findViewById(R.id.scan_name_and_date_text);
            holder.ssid = (TextView)view.findViewById(R.id.scan_SSID_text);
            holder.frequency = (TextView)view.findViewById(R.id.scan_frequency_text);
            holder.level = (TextView)view.findViewById(R.id.scan_level_text);

        view.setTag(holder);
    } else
        holder = (ViewHolder) view.getTag();

    Scan sr = results.get(position);
    holder.name.setText(sr.getName()+" ( "+sr.getDate()+" )");
    holder.ssid.setText(sr.getSsid() + " ( " + sr.getBssid() + " )");
    holder.frequency.setText(sr.getFrequency()+" MHz");
    holder.level.setText(Integer.toString(sr.getLevel())+ " dBm");
    return view;
}

static class ViewHolder {
    TextView name,ssid, frequency, level;
}

}

提前致谢!

【问题讨论】:

  • 所以你的问题是在改变方向时发生的,对吧?
  • 是的,横向和纵向都可以。如果我以纵向模式启动我的应用程序并旋转到横向,我的片段列表视图什么也没有显示,即使我返回纵向,它也没有显示任何内容。所以我认为这是我改变屏幕方向后的问题
  • 在你的 onResume() 中用新数据填充适配器并调用 notifyDataSetChanged()
  • @XxGoliathusxX 它有帮助。我添加了以下代码: if(adapter!=null) adapter.update(scans);现在它在我旋转屏幕后显示项目,但重新加载需要一点时间。有没有办法让我刷新得更快?
  • 旋转手机会导致新的生命周期。所以这一切都从 onStart() 再次开始,然后转到 onCreate() 和 onResume()。就像开始一项新活动一样,这需要一段时间。我建议您首先存储大数据集,例如适配器列表以及 onSaveInstanceState() 和 onCreate 中的所有其他内容,如果您发现它们只是做最必要的事情。不要从头开始建立一切。此外,我确信 www 中有教程可以更快地重新启动。

标签: java android listview android-fragments


【解决方案1】:

来自这个post。您可以尝试使用onActivityCreated 而不是onCreate。试试这个:

public class SavedScanFragment extends Fragment{

//....to restore the saved state
@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    //Restore the fragment state here
    db = new Database(getContext());
    getScans();

}
//add this to save instant state
  @Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    //save your important variable here to outstate
}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多