タイルのグリッドビューを表示する Android アプリ ウィジェットがあります。各タイルには、株価情報が含まれています。Web サーバーから株価情報を照会し、それを RemoteViewsFactory のメンバー変数である ArrayList (stock_info_list) に格納します。
問題は、しばらく非アクティブになった後です。グリッドビューをスクロールしようとすると、空になります-空のビューが表示されます-つまり、ArrayListがクリアされます。RemoteViewFactory の ArrayList が自動的に消去されるのはなぜですか? onDataChanged() が呼び出される原因となる更新ボタンを押して、ArrayList を再設定すると、ウィジェットは再び株価で満たされます。
ウィジェットをスクロールしてもデータが消えないようにするにはどうすればよいですか?
package com.screenulator.stocktile;
import java.text.DecimalFormat;
import android.annotation.SuppressLint;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.GradientDrawable;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RemoteViews;
import android.widget.RemoteViewsService;
import android.widget.TextView;
@SuppressLint("NewApi")
public class MyWidgetService extends RemoteViewsService {
@Override
public RemoteViewsFactory onGetViewFactory(Intent arg0)
{
return new MyRemoteViewsFactory(this.getApplicationContext(), arg0);
}
}
class MyRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory
{
final public DecimalFormat DF2 = new DecimalFormat("#.##");
public ArrayList<StockInfo> stock_info_list = new ArrayList<StockInfo>();
private Context mContext;
private int mAppWidgetId;
public MyRemoteViewsFactory(Context context, Intent intent)
{
mContext = context;
mAppWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
}
public void onCreate()
{
}
@Override
public int getCount()
{
return stock_info_list.size();
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
}
@Override
public RemoteViews getLoadingView() {
// TODO Auto-generated method stub
return null;
}
@Override
public RemoteViews getViewAt(int position)
{
Singleton s = Singleton.getInstance();
RemoteViews rv = new RemoteViews(mContext.getPackageName(),
R.layout.my_grid_layout);
// rv.setTextViewText(R.id.symbol, "Hello");
StockInfo symbol_info = stock_info_list.get(position);
if (symbol_info != null)
{
// details of initialize each grid omitted
}
return rv;
}
@Override
public int getViewTypeCount() {
// TODO Auto-generated method stub
return 1;
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public void onDataSetChanged() {
// TODO Auto-generated method stub
Log.i("remoteviews_factory", "onDataSetChanged");
DataServerInstance d = DataServerInstance.getInstance();
if (d.stock_info_list.size() > 0)
{
stock_info_list.clear();
stock_info_list = d.duplicate_stock_info_list();
}
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
}
}