簡體   English   中英

將數據從廣播接收器更新到后台的片段列表視圖

[英]Update Data from Broadcast receiver to fragment list view in the background

我是android開發的新手,我正在做這個程序來接收消息onReceive 我想更新fragment ListView中的那些數據,並且更新應該在后台進行。 廣播接收器已在全球注冊

@Override
    public void onReceive(Context context, Intent intent) {
        Hover.initialize(context);
       /* IncomingSMSReceiver incomingSMSReceiver = new IncomingSMSReceiver();
        incomingSMSReceiver.onReceive(context,intent);*/
        String uuid = intent.getStringExtra("response_message");
        Log.d(TAG, " " + uuid);

        if (intent.hasExtra("transaction_extras")) {
            HashMap t_extras = (HashMap) intent.getSerializableExtra("transaction_extras");
            /*if (t_extras.containsKey("confirmCode")) {
                String confirmationCode = t_extras.get("confirmCode").toString();
                Log.d(TAG, " "+confirmationCode);
            }*/
            if (t_extras.containsKey("Tsh")) {
                String balance = t_extras.get("Tsh").toString();
                Log.d(TAG," "+balance);

                Bundle bundle = new Bundle();
                bundle.putString("id", uuid);
                bundle.putString("message", balance);
                FragmentHistory fragmentHistory = new FragmentHistory();
                fragmentHistory.setArguments(bundle);

            }
        }

    }

分段

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       // return inflater.inflate(R.layout.fragment_history, container,false);
        View view = inflater.inflate(R.layout.fragment_history, container, false);
       /* mRecyclerView =(RecyclerView) view.findViewById(R.id.recyclerView_history);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        mRecyclerView.setHasFixedSize(true);
        configAdapter();*/

    dataSaver.initializeDataSaver(getActivity());

   // listScore = view.findViewById(R.id.list);
    return view;

}

@Override
public void onActivityCreated( Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    //dataSaver.setViewList("Hello", "Hola");
    dataSaver.getDataList(this.getActivity());

    /*try {
        Bundle bundle = getActivity().getIntent().getExtras();
        dataSaver.setViewList(bundle.getString("id"), bundle.getString("message"));
    } catch (Exception e) {
        e.printStackTrace();
    }*/

}

@Override
public void onResume() {
    super.onResume();
    dataSaver.getDataList(this.getActivity());
}

@Override
public void onPause() {
    super.onPause();
    Bundle arguments = getArguments();
    if (arguments != null) {
        handleArguments(arguments);
    }
    Bundle extras = getActivity().getIntent().getExtras();
    if (extras != null) {
        handleExtras(extras);
    }
}

@Override
public void onStop() {
    super.onStop();
    Bundle arguments = getArguments();
    if (arguments != null) {
        handleArguments(arguments);
    }
    Bundle extras = getActivity().getIntent().getExtras();
    if (extras != null) {
        handleExtras(extras);
    }
}



@Override
public void onDestroyView() {
    super.onDestroyView();
    Bundle arguments = getArguments();
    if (arguments != null) {
        handleArguments(arguments);
    }
    Bundle extras = getActivity().getIntent().getExtras();
    if (extras != null) {
        handleExtras(extras);
    }
    Toast.makeText(getActivity(), "Destroyed", Toast.LENGTH_LONG).show();
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    Bundle arguments = getArguments();



}

private void handleArguments(Bundle arguments) {
    // TODO
    try {
        String id =arguments.getString("id");
        String message = arguments.getString("message");
        dataSaver.setViewList(id, message);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

ListView適配器

private ArrayList<TransDetails> scores;
    TransDetails transDetails;
    private MySharedPreference sharedPreference;
    private ListView listScore;
    private HashSet<String> scoreset;
    private Gson gson;

public void initializeDataSaver(Activity activity){

    transDetails = new TransDetails();
    scores = new ArrayList<>();
    gson = new Gson();
    sharedPreference = new MySharedPreference(activity);
    getHighScoreListFromSharedPreference();
}

/*public void setGson(Gson gson) {
    this.gson = gson;
}*/

public Gson getGson() {
    return gson;
}

/*public void setActivity(Activity activityf){
    activityf = getActivity();
}

public Activity getActivity(){
    return getActivity();
}*/




public void getHighScoreListFromSharedPreference() {
    //retrieve data from shared preference
    String jsonScore = sharedPreference.getHighScoreList();
    Type type = new TypeToken<List<TransDetails>>(){}.getType();
    scores = gson.fromJson(jsonScore, type);

    if (scores == null) {
        scores = new ArrayList<>();
    }
}

public void saveScoreListToSharedpreference(ArrayList<TransDetails> scoresList) {
    //convert ArrayList object to String by Gson
    String jsonScore = gson.toJson(scoresList);

    //save to shared preference
    sharedPreference.saveHighScoreList(jsonScore);
}

public void upDateList(final String id, final String message){
    transDetails.setId(id);
    transDetails.setId(message);
    scores.add(0, transDetails);
}

public void setViewList(String trans_id, String trans_amount){
    if (trans_id != null) {


        transDetails.setId(trans_id);
        transDetails.setMessage(trans_amount);
        scores.add(0,transDetails); //add to scores list
        saveScoreListToSharedpreference(scores);
    }

}

public void getDataList(Activity activity){

    listScore = activity.findViewById(R.id.list);
    if (scores.size() == 0) {
        Toast.makeText(activity, "No data in sharedPreferences", Toast.LENGTH_SHORT).show();
    } else {
        getHighScoreListFromSharedPreference();
        //get data
        //set adapter for listview and visible it
        ListViewAdapter adapter = new ListViewAdapter(activity,  scores);
        listScore.setAdapter(adapter);

    }

}

片段不能獨立工作,而必須處於活動中。

所以第一步是創建一個Activity並將片段放入其中。 那么您必須以進入廣播接收器的意圖開始該活動。 像這樣的東西:

context.startActivity(new Intent(this,ListActivity.class));

另一個問題是,當收到新消息時,您的startActivity將再次啟動並重復創建。 為避免出現此問題,您必須通過以下方式向您的Intent添加標志:

context.startActivity(new Intent(this,ListActivity.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));

此標志是為了避免重新創建活動並將現有的活動置於前面。 這樣,您傳遞給的意圖和數據將在onNewIntent()活動方法中接收,您可以在那里處理數據。

因此,您必須使用bundle開始意圖,而不是片段中的setArguments:

context.startActivity(new Intent(this,ListActivity.class).putExtras(bundle).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));

暫無
暫無

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

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