【发布时间】: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