簡體   English   中英

使用adapter.notifyDataSetChanged()更新RecyclerView

[英]Updating RecyclerView with adapter.notifyDataSetChanged()

我實現了一個RecyclerView,它具有一個倒計時計時器的用戶界面。 我創建了一個BroadcastService類,該類創建一個CountDownTimer並將onTick()方法中計時器的內容廣播到我的MainActivity,在這里我使用BroadCast接收器來更新UI。

我的BroadcastReceiver僅從BroadcastService接收初始值。 我發現這是因為我沒有通知回收者視圖的適配器數據已更改。 但是,由於范圍可變,所以無法從廣播接收器訪問適配器。

也許我根本不了解變量范圍,但是如何從以下位置訪問適配器

            adapter = new DataAdapter(getApplicationContext(), data);

在我的廣播接收器課程中? 因為現在它尚未被識別。

這是我的類定義+ onCreate()

public class Profile_Page extends  ActionBarActivity implements DataAdapter.ClickListener {

    private RecyclerView recyclerView;
    public DataAdapter adapter;
    private Context context;
    String currentUser;
    Data current = new Data();

    final List<Data> data = new ArrayList<>();
    public static String BROADCAST_ACTION =
            "packagename.countdown_br";

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        IntentFilter filter = new IntentFilter();
        filter.addAction(BROADCAST_ACTION);
        filter.addCategory(Intent.CATEGORY_DEFAULT);
        registerReceiver(br, filter);

        startService(new Intent(this, Broadcast_Service.class));
        setContentView(R.layout.activity_profile__page);

        ParseQuery<ParseObject> query = ParseQuery.getQuery("ParseClass");
        query.whereEqualTo("author", ParseUser.getCurrentUser());
        recyclerView = (RecyclerView) findViewById(R.id.recyclerView); 
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        query.findInBackground(new FindCallback<ParseObject>() {
            @Override

            public void done(List<ParseObject> list, ParseException e) { 
                if (e == null) {
                    for (ParseObject getData : list)
                    {
                        current.1= getData.getString("1");
                        current.2= getData.getString("2");
                        current.3= getData.getString("3");
                        current.4= getData.getString("4");
                        current.5= getData.getString("5");


                        data.add(current);

                    }
                }
                else {

                     }


                adapter = new DataAdapter(getApplicationContext(), data);

                recyclerView.setAdapter(adapter); //set recyclerView to this adapter


            }



        });


    }

這是我的廣播接收器代碼[也在MainActivity.java中]

public BroadcastReceiver br = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {

            updateGUI(intent);
            //HOW TO NOTIFY DATA SET CHANGE

        }
    };

public void updateGUI(Intent intent) {
        if (intent.getExtras() != null) {
            long millisUntilFinished = intent.getLongExtra("countdown", 0);
            current.goalTimer = String.valueOf(intent.getExtras().getLong("countdown") / 1000);

        }


    }

而且,如果有什么用,這里是我的廣播服務類:

public class Broadcast_Service extends Service {
    private final static String TAG = "BroadcastService";
    LocalBroadcastManager broadcastManager;
    public static final String COUNTDOWN_BR = "packagename.countdown_br";
    Intent bi = new Intent(COUNTDOWN_BR);

    CountDownTimer cdt = null;

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(TAG, "Starting timer...");

        cdt = new CountDownTimer(30000, 1000) {
            @Override
            public void onTick(long millisUntilFinished) {

                bi.putExtra("countdown", millisUntilFinished);
                sendBroadcast(bi);
            }

            @Override
            public void onFinish() {
                Log.i(TAG, "Timer finished");
            }
        };

        cdt.start();
    }

    @Override
    public void onDestroy() {
        cdt.cancel();
        Log.i(TAG, "Timer cancelled");
        super.onDestroy();
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
    }
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

首先,按以下方式擴展BroadcastReciever類:

public class MyReciever extends BroadcastReciever{
    private Profile_Page activity;

    public MyReciever(Profile_Page activity){
        this.activity = activity;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        activity.updateGUI(intent);
    }
}

創建活動的靜態實例,並將其傳遞給接收者。

public class Profile_Page extends  ActionBarActivity implements DataAdapter.ClickListener {
    private static Profile_Page instance;
    private MyReciever myReceiver;
    ...

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        instance = this;
        myReceiver = new MyReciever(instance);
        ...
    }

    public void updateGUI(Intent intent) {
        ...
    }
}

現在,您可以輕松訪問適配器。 希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM