2016-06-30 7 views
1

私は以下の問題があります。ダイアログウィンドウからアイテムを選択した後にListViewを更新する

私はさまざまなカテゴリーの記事を表示するListViewを持っています。 ダイアログウィンドウからカテゴリを選択し、 "OK"ポジティブボタンを押すと、ListViewを更新して、ダイアログウィンドウで選択したカテゴリの記事のみを表示するようにします。

DialogFragmentにインターフェイスを作成しました。このインターフェイスは、Dialogから値を取得するためのコールバックです。

これはクラスである:私のSearchFragmentクラスで

public class SelectFilterDialog extends DialogFragment implements DialogInterface.OnClickListener{ 
private static int mSelectedIndex; 
private static String mSelectedCategory; 
private String[] categories = {"All", "Announcements","Commerce","Development", "Distributions", "Front","Kernel","Legal", "Letters", "Press", "Security"}; 
static OnDialogSelectListener mDialogSelectorCallback; 


//callback method to get values from a Dialog 
public interface OnDialogSelectListener{ 
    public void onSelectedOption(); 
} 

public static SelectFilterDialog newInstance(int selected) { 
    final SelectFilterDialog dialog = new SelectFilterDialog(); 
    mSelectedIndex = selected; 
    return dialog; 
} 

public Dialog onCreateDialog(Bundle savedInstanceState) { 

    final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    builder.setTitle("Select Filter"); 
    builder.setPositiveButton("OK", this); 
    builder.setNegativeButton("Cancel", this); 
    builder.setSingleChoiceItems(categories, mSelectedIndex, this); 

    return builder.create(); 
} 

@Override 
public void onClick(DialogInterface dialog, int which) { 
    switch (which){ 
     case Dialog.BUTTON_POSITIVE:{ 
      dialog.dismiss(); 
      mDialogSelectorCallback.onSelectedOption(); 
     }break; 
     case Dialog.BUTTON_NEGATIVE:{ 
      dialog.cancel(); 
     }break; 
     default: 
      mSelectedIndex = which; 
      setSelectedCategory(categories[which]); 
      break; 
    } 
} 

public void setDialogSelectListener(OnDialogSelectListener listener){ 
    this.mDialogSelectorCallback = listener; 
} 

public void setSelectedCategory(String category){ 
    this.mSelectedCategory = category; 
} 

public static String getSelectedCategory(){ 
    return mSelectedCategory; 
} 

public static int getSelectedIndex(){ 
    return mSelectedIndex; 
} 

}

、私はリストを表示し、SelectFilterDialogフラグメントからインターフェイスを実装します。方法では 、私はOKボタンを押した後、selectedCategoryを更新し、notifyDataSetChanged(とアダプタを更新)

SearchFragment:私のアダプタで

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.menu_bar_filter: { 
      showDialog(); 
     } 
    } 
    return super.onOptionsItemSelected(item); 
} 

void showDialog() { 
    SelectFilterDialog dialog = SelectFilterDialog.newInstance(preSelectedValue); 
    dialog.setDialogSelectListener(this); 
    dialog.show(getActivity().getFragmentManager(), "dialog"); 
} 

@Override 
public void onSelectedOption() { 
    selectedCategory = dialog.getSelectedCategory(); 
    preSelectedValue = dialog.getSelectedIndex(); 

    Log.i(TAG, "selectedCategory : " +selectedCategory); 
    article_list_adapter.updateCategory(selectedCategory); 
} 

、私は私のupdateCategoryでカテゴリーを受け取り、現在の記事リストに適切なカテゴリーの記事を記入してください。 これは正常に動作します。 その後、ビューを更新するためにNotifyDataSetChangedを呼び出します。

public void updateCategory(String category) { 
    this.currentArticles.clear(); 
    this.selectedCategory = category; 
    for (Article article : entireArticles) { 
     if (category.equals(article.getCategory())) { 
      currentArticles.add(article); 
     } 
    } 
    notifyDataSetChanged(); 
} 
    notifyDataSetChanged(); 
} 

しかし、getViewでは、IndexOutOfBounce例外がスローされます。 「カーネル」などのダイアログからカテゴリを選択した後は、3つのカーネルカテゴリのみをcurrentArticleリストに追加します。これは問題ありません。リスト内の唯一の3つの要素がありますが、インデックス3のそれはポイント

Article currentArticle = currentArticles.get(_position);  

: は、しかし、getViewメソッド文をint型。

java.lang.IndexOutOfBoundsException: Invalid index 3, size is 3 
                       at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) 
                       at java.util.ArrayList.get(ArrayList.java:308) 
                       at klinar.kronlachner.binder.app.Article_List_Adapter.getView(Article_List_Adapter.java:99)  

私を助けることができますか? :)

public Article_List_Adapter(Context _c, int textViewResourceId, List<Article> articles) { 
    super(_c, textViewResourceId, articles); 
    this.entireArticles = new ArrayList<Article>(); 
    this.currentArticles = new ArrayList<Article>(); 
    entireArticles.addAll(articles); 
    currentArticles.addAll(articles); 
    this.storedArticles = new ArrayList<Article>(articles); 
} 

public View getView(int _position, View _convertView, ViewGroup _parent) { 
    View view = _convertView; 
    ViewHolder viewHolder; 

    if (view == null) { 
     LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     view = inflater.inflate(R.layout.article_list_row, null); 
     viewHolder = new ViewHolder(); 
     viewHolder.article_icon = (ImageView) view.findViewById(R.id.article_category_icon); 
     viewHolder.articleTitle = (TextView) view.findViewById(R.id.article_title); 
     viewHolder.articleCategory = (TextView) view.findViewById(R.id.article_category); 
     viewHolder.articleDate = (TextView) view.findViewById(R.id.article_date); 
     viewHolder.articleAuthor = (TextView) view.findViewById(R.id.article_author); 
     view.setTag(viewHolder); 
    } else { 
     viewHolder = (ViewHolder) _convertView.getTag(); 
    } 


    //Find the article to work with 
    Article currentArticle = currentArticles.get(_position); 


    //fill the Article_View 
    switch (currentArticle.getCategory()) { 
     case "Kernel": { 
      viewHolder.article_icon.setImageResource(R.drawable.ic_list_letter_k); 
     } 
     break; 
     case "Security": { 
      viewHolder.article_icon.setImageResource(R.drawable.ic_list_letter_s); 
     } 
     break; 
     default: { 
      viewHolder.article_icon.setImageResource(R.drawable.ic_list_letter_s); 
     } 
    } 
    viewHolder.articleTitle.setText(currentArticle.getTitle()); 
    viewHolder.articleCategory.setText(currentArticle.getCategory()); 
    viewHolder.articleDate.setText(currentArticle.getDate()); 
    viewHolder.articleAuthor.setText(currentArticle.getAuthor()); 


    return view; 
+0

使用 'String.equals'代わりに'の== '文字列を比較するために調整 –

+0

値が、それは私の問題を解決していません:(私は' mSelectedIndex =どのコールする必要があると思う –

+0

; setSelectedCategory(カテゴリの[います]); '場合Dialog.BUTTON_POSITIVE'で ''場合Dialog.BUTTON_POSITIVE等 –

答えて

0

あなたのアダプタクラス でこれを行いAllCategoryArticleとcurrentCategoryArticleのための別のための2つのリストを作成します。

class ArticleAdapter{ 
ArrayList<Model> currentArticle; 
ArrayList<Model> entireArticle; 
String selectedCategory="all";  //setting default category as "all" 
public ArticleAdapter(ArrayList<Model> categoryList){ 
    this.entireList=categoryList; 
    this.currentList=this.entireList; 
} 
//create updateCategory in adapter 
/*call this method(updateCategory()) in you frgament/activity to update the adapter 
    according to you category that is selected in dialog 
*/ 
public void updateCategory(String category){ 
    this.currentArticle.clear(); 
    this.selectedCategory=category; 
    for(Model item: entireArticle){ 
     if(category.equals(item.getCategory())) 
     { 
      currentArticle.add(item); 
     } 
    } 
    notifyDataSetChanged(); 
} 
........ 
........ 
@Override 
public View getView(int _position, View _convertView, ViewGroup _parent) { 
View view = _convertView; 
ViewHolder viewHolder; 

if (view == null) { 
    LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    view = inflater.inflate(R.layout.article_list_row, null); 
    viewHolder = new ViewHolder(); 
    viewHolder.article_icon = (ImageView) view.findViewById(R.id.article_category_icon); 
    viewHolder.articleTitle = (TextView) view.findViewById(R.id.article_title); 
    viewHolder.articleCategory = (TextView) view.findViewById(R.id.article_category); 
    viewHolder.articleDate = (TextView) view.findViewById(R.id.article_date); 
    viewHolder.articleAuthor = (TextView) view.findViewById(R.id.article_author); 
    view.setTag(viewHolder); 
} else { 
    viewHolder = (ViewHolder) _convertView.getTag(); 
} 

//Find the article to work with 
Article currentArticle = articles.get(_position); 
//just remove if condition because already you have filtered article by category in currentArticle 
//fill the Article_View 
switch (currentArticle.getCategory()) { 
    case "Kernel": 
     viewHolder.article_icon.setImageResource(R.drawable.ic_list_letter_k); 
     break; 
    case "Security": 
     viewHolder.article_icon.setImageResource(R.drawable.ic_list_letter_s); 
     break; 
     default: 
      viewHolder.article_icon.setImageResource(R.drawable.ic_list_letter_s); 

    } 
    viewHolder.articleTitle.setText(currentArticle.getTitle()); 
    viewHolder.articleCategory.setText(currentArticle.getCategory()); 
    viewHolder.articleDate.setText(currentArticle.getDate()); 
    viewHolder.articleAuthor.setText(currentArticle.getAuthor()); 
    return view; 
} 
} 

あなたの活動の股関節ArticleAdapter onSelectedOptionで修正()メソッドを持っているあなたのアクティビティ/フラグメント/フラグメントでこれを行います

@Override 
public void onSelectedOption() { 
selectedCategory = dialog.getSelectedCategory(); 
preSelectedValue = dialog.getSelectedIndex(); 

Log.i(TAG, "selectedCategory : " +selectedCategory); 
article_list_adapter.updateSelectedCategory(selectedCategory); 
Log.i(TAG, "adapter Category : " +article_list_adapter.getSelectedCategory()); 

/* 
    call updateCategory() instead of notifyDataSetChanged() 
    updateCategory() will update your adapter 
*/ 
//article_list_adapter.notifyDataSetChanged(); 
article_list_adapter.updateCategory(selectedCategory); 

}あなたのコード内の

問題は ですあなたのリストを更新せずにnotifyDataSetChangedを使ってアダプタを更新しようとしています。

アダプターの変数がアダプタのモデルにない場合、notifyDataSetChanged()は動作します。アダプタクラスの変化

class Adapter{ 
    ArrayList entireArticle; 
    ArrayList currentArticle; 

    public Adapter(Context context,ArrayList list){ 
     this.entireArticle=new ArrayList(); 
     this.currentArticle=new ArrayList(); 

     entireArticle.addAll(list);  
     currentArticle.addAll(list); 
    } 

    public void updateCategory(String category){ 
    this.currentArticle.clear(); 
    this.selectedCategory=category; 
    if(category.equals("All")){ // add all article from entrieArticle if category=="all" 
     this.currentArticle.addAll(entireArticle); 
    }else{ //otherwise filter the article 
     for(Model item: entireArticle){ 
      if(category.equals(item.getCategory())) 
      { 
      currentArticle.add(item); 
      } 
    } 
    } 
    notifyDataSetChanged(); 
} 
............... 
................. 
} 

があなたのアダプタクラスでこの変更を行うと、それは私がこれをチェックしました動作します。このhow notifyDataSetChanged works in listView

EDITを参照してください。

私はこれがあなたに役立つことを願っています。

+0

私には意味がありますが、リストには何も表示されません: –

+0

彼はあなたが書いたupdateCategoryをif文に変更しました: if(category.toUpperCase()。equals(article.getCategory()。toUpperCase())|| category.equals( "All")) Allを選択した場合は、すべてが表示されていることを確認してください。しかし、それは –

+0

あなたの間違った条件を使用していません。常に "1"に等しくない "1"。自動的にif文が別の条件、つまりcategory.equals(all)を選択します。そのため、あなたは選択されたカテゴリの記事を取得していません。また、なぜあなたの検査カテゴリ= "すべて"のif文で疑問に思っています。ただ1つのカテゴリがアダプタに送信され、それは冗長です。 – Madhan

関連する問題