首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RecycleView不会更新

RecycleView不会更新
EN

Stack Overflow用户
提问于 2016-03-30 12:17:55
回答 3查看 128关注 0票数 0

我仍然是Java和android的新手

我的问题是,如果关闭应用程序并再次运行,recycleview只会得到更新并添加新添加的标记。如何让应用程序立即更新循环视图,以显示新的标签。

java代码

代码语言:javascript
复制
package com.deitel.favoritesites;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Bundle;
import android.preference.DialogPreference;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.TextInputLayout;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.Adapter;
import android.widget.EditText;
import android.widget.TextView;

import android.view.Menu;
import android.view.MenuItem;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class MainActivity extends AppCompatActivity {
private static final String SITES="Sites";

private EditText urlEditText; //where user enters the URL
private EditText tagEditText;
private FloatingActionButton saveFloatingActionButton;
private SharedPreferences savedSites;
private List<String> tags;
private SitesAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    urlEditText = ((TextInputLayout) findViewById(
            R.id.URLTextInputLayout)).getEditText();

    urlEditText.addTextChangedListener(textWatcher);
    tagEditText=((TextInputLayout)findViewById(R.id.tagTextInputLayout)).getEditText();
    tagEditText.addTextChangedListener(textWatcher);


    //get the shared prefrences containing the user saved URLs
    savedSites = getSharedPreferences(SITES, MODE_PRIVATE);

    //get the shared tags in an ArrayList then sort them
    tags = new ArrayList<>(savedSites.getAll().keySet());
    Collections.sort(tags, String.CASE_INSENSITIVE_ORDER);

    //get reference to the recycle to configure it
    RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);

    //use a linerlayout to display items in  a vertical list
    recyclerView.setLayoutManager(new LinearLayoutManager(this));

    //create recyclerView.Adopter to bind tags to the RecyclerView
    adapter = new SitesAdapter(tags, itemClickListener, itemLongClickListener);
    recyclerView.setAdapter(adapter);

    recyclerView.addItemDecoration(new ItemDivider(this));

    //register listner to save a new or edit search
    saveFloatingActionButton = (FloatingActionButton) findViewById(R.id.fab);
    saveFloatingActionButton.setOnClickListener(saveButtonListener);
    updateSaveFAB();
}
private final TextWatcher textWatcher= new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        updateSaveFAB();
    }

    @Override
    public void afterTextChanged(Editable s) {
    }
};
//show or hide the saveFloatingActionButton
private void updateSaveFAB() {
    //check if there is input in both EditButton
    if (urlEditText.getText().toString().isEmpty() || tagEditText.getText().toString().isEmpty())
        saveFloatingActionButton.hide();
    else
        saveFloatingActionButton.show();
}
//saveButtonListener save a tag query pair into sharedPrefrece
private final OnClickListener saveButtonListener=new OnClickListener() {
    @Override
    public void onClick(View view) {
        String query = urlEditText.getText().toString();
        String tag = tagEditText.getText().toString();
        if (!query.isEmpty() && !tag.isEmpty()) {
            //hide the virtual keyboard
            ((InputMethodManager) getSystemService(
                    Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(view.getWindowToken(),0);
            addTaggedSites(tag, query);//add/update the search
            urlEditText.setText("");//Clear queryEditText
            tagEditText.setText("");//clear tagEditText
            urlEditText.requestFocus();
        }
    }
};
//add new search to file then refresh all button
private void addTaggedSites(String tag, String query) {
    //get a sharedprefrence editor to store new tag/query pair
    SharedPreferences.Editor preferencesEditor = savedSites.edit();
    preferencesEditor.putString(tag, query);
    preferencesEditor.apply();

    //if tag is new> add and sort tags then display update
    if (!tag.contains(tag)) {
        tags.add(tag);
        Collections.sort(tags, String.CASE_INSENSITIVE_ORDER);
        adapter.notifyDataSetChanged();
    }
}
//itemClickListener launches web broswer to display search results
private final OnClickListener itemClickListener=new OnClickListener() {
    @Override
    public void onClick(View view) {
        //get query string and create a URL represeting the search
        String tag= ((TextView) view).getText().toString();
        String urlString=getString(R.string.search_URL)+Uri.encode(savedSites.getString(tag,""),"UTF-8");

        //create an intent to lanuch a web broswer

        Intent webIntent= new Intent(Intent.ACTION_VIEW,Uri.parse(urlString));
        startActivity(webIntent);
    }
};
//itemLongClickListener displays a dialog allowing the user to share edit or delete a saved search
private final OnLongClickListener itemLongClickListener= new OnLongClickListener() {
    @Override
    public boolean onLongClick(View view) {
        //get the tag that the user long touched
        final String tag = ((TextView) view).getText().toString();

        //creatw a new AlertDialog
        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);

        //set the alertDialog title
        builder.setTitle(getString(R.string.share_edit_delete_title, tag));

        //set list of items to display and create event handler
        builder.setItems(R.array.dialog_items, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        switch (which) {
                            case 0://share
                                shareSites(tag);
                                break;
                            case 1://edit
                                tagEditText.setText(tag);
                                urlEditText.setText(savedSites.getString(tag, ""));
                                break;
                            case 2: //delete
                                deleteSites(tag);
                                break;
                        }
                    }
                }
        );
        //set the alertDialog negetive button
        builder.setNegativeButton(getString(R.string.cancel), null);
        builder.create().show();//display the alert dialog
        return true;
    }
};
//allow user to choose app for sharing URL of a saved search
private void shareSites(String tag){
    //create the URL representing the search
    String urlString= getString(R.string.search_URL)+Uri.encode(savedSites.getString(tag, ""), "UTF-8");

    //create an intent to share urlString
    Intent shareIntent= new Intent();
    shareIntent.setAction(Intent.ACTION_SEND);
    shareIntent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.share_subject));
    shareIntent.putExtra(Intent.EXTRA_TEXT,getString(R.string.share_message,urlString));
    shareIntent.setType("text/plain");

    //display app that can share plain text
    startActivity(Intent.createChooser(shareIntent,getString(R.string.share_search)));
}

//delete search after user confirms
private void deleteSites(final String tag){
    //create a new AlertDialog and set its message
    AlertDialog.Builder confirmBuilder= new AlertDialog.Builder(this);
    confirmBuilder.setMessage(getString(R.string.confirm_message, tag));
    //cancel button configration
    confirmBuilder.setNegativeButton(getString(R.string.cancel), null);
    //positive DELETE button
    confirmBuilder.setPositiveButton(getString(R.string.delete),new DialogInterface.OnClickListener(){
                public void onClick(DialogInterface dialog , int id){
                    tags.remove(tag);

                    //remove sharedPerefrences.Editor from Sharedprefrences
                    SharedPreferences.Editor preferenceEditor= savedSites.edit();
                    preferenceEditor.remove(tag);
                    preferenceEditor.apply();

                    adapter.notifyDataSetChanged();
                }
            }
    );
    confirmBuilder.create().show();
    }
  }

这是我的采用者代码

代码语言:javascript
复制
 package com.deitel.favoritesites;

import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.List;


public class SitesAdapter extends RecyclerView.Adapter<SitesAdapter.ViewHolder> {
private final View.OnClickListener clickListener;
private final View.OnLongClickListener longClickListener;

private final List<String> tags;


public SitesAdapter(List<String> tags, View.OnClickListener clickListener, View.OnLongClickListener longClickListener) {
    this.tags = tags;
    this.clickListener = clickListener;
    this.longClickListener = longClickListener;
}

public static class ViewHolder extends RecyclerView.ViewHolder {
    public final TextView textView;

    public ViewHolder(View itemView, View.OnClickListener clickListener, View.OnLongClickListener longClickListener) {
        super(itemView);
        textView = (TextView) itemView.findViewById(R.id.textView);

        itemView.setOnClickListener(clickListener);
        itemView.setOnLongClickListener(longClickListener);
    }
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
    return (new ViewHolder(view, clickListener, longClickListener));

}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    holder.textView.setText(tags.get(position));
}

@Override
public int getItemCount() {
    return tags.size();
}
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-30 12:35:40

将您的代码更改为

代码语言:javascript
复制
if (!tags.contains(tag)) {
        tags.add(tag);
        Collections.sort(tags, String.CASE_INSENSITIVE_ORDER);
        adapter.notifyDataSetChanged();
    }

因为,下面的条件总是假的。

代码语言:javascript
复制
if(!tag.contains(tag))

这是因为您正在检查该值本身中是否包含一个值。所以这将永远是真的。

如果您正在检查tag存在于List<String> tags中,您应该这样做。

代码语言:javascript
复制
if(!tags.contains(tag))
票数 0
EN

Stack Overflow用户

发布于 2016-03-30 12:22:09

将您的代码更改为..。

代码语言:javascript
复制
//add new search to file then refresh all button
private void addTaggedSites(String tag, String query) {
    //get a sharedprefrence editor to store new tag/query pair
    SharedPreferences.Editor preferencesEditor = savedSites.edit();
    preferencesEditor.putString(tag, query);
    preferencesEditor.apply();

    //if tag is new> add and sort tags then display update
    if (!this.tag.contains(tag)) {
        this.tags.add(tag);
        Collections.sort(tags, String.CASE_INSENSITIVE_ORDER);
        adapter.notifyDataSetChanged();
    }
}
票数 0
EN

Stack Overflow用户

发布于 2016-03-30 12:41:51

这可能有助于:

  1. 在适配器中创建一个setter方法,允许您设置/更新适配器ArrayList。
  2. 每当您更改列表(即删除标记)时,请通过新的setter方法将更新后的列表传递给适配器。
  3. 调用notifyDataSetChanged()。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36308651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档