2

タイルのグリッドビューを表示する 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

    }
}
4

1 に答える 1

0

リモート ビューでリストビューを直接制御しないでください。リモートビューから取得したデータからメインビューにリストビューを更新させます。

于 2013-10-22T19:10:29.233 に答える