2016-03-30 20 views
0

が、私はまだJavaとの両方を持つ新たなんだアンドロイドRecycleView文句を言わない更新

私の問題はrecycleviewのみ更新さという点であると私はアプリを閉じて、もう一度それを実行した場合、新たな付加されたタグを追加します。新しいタグを表示するために、アプリケーションにリサイクルビューを直ちに更新させるにはどうすればよいですか?

Javaコード

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(); 
    } 
    } 

これは私の採用コード

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(); 
} 
} 
+0

ここでアダプタコードを共有します。 –

答えて

0

この

if (!tags.contains(tag)) { 
     tags.add(tag); 
     Collections.sort(tags, String.CASE_INSENSITIVE_ORDER); 
     adapter.notifyDataSetChanged(); 
    } 
にあなたのコードを変更しています

値がその値自体に含まれている場合、あなたがチェックしているので、この下の条件は常に

if(!tag.contains(tag)) 

その偽である、ので。それはいつも真実です。

tagList<String> tagsに存在することを確認している場合は、次のようにしてください。

​​
0

変更あなたのコードに....

//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

これが役立つことがあります。

  1. あなたは、アダプタのArrayListを更新/設定することができ、あなたのアダプタ内のセッターメソッドを作成します。

  2. タグを削除すると、タグを削除するたびに、この新しいリストを新しい設定メソッドでアダプタに渡します。

  3. を呼び出します。notifyDataSetChanged()。

関連する問題