ArrayAdapter不在片段

时间:2016-03-08 00:05:46

标签: java android listview android-fragments

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

我在ViewLager处理的TabLayout中有三个片段,我在第三个片段中有一个ListView,在我更改屏幕方向后没有显示任何项目我试图设置ArrayAdapter中convertView的背景颜色,看它是否显示,确实在我更改方向后没有显示。但它很奇怪,因为在我的First Fragment中,我使用相同的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;
}

}

提前致谢!

1 个答案:

答案 0 :(得分:2)

来自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
}
}