2016-06-23 5 views
0

에 통해 SearchView를 검색 I에 유래에 안드로이드 비교적 새롭고도 새로운 오전 :) 내가 현재 ListView에 기사를 표시하는 응용 프로그램을 프로그래밍하고안드로이드 : ListView에

.

내 목표는 검색/필터 옵션을 내 ListView에 넣으려는 것입니다. Fragment을 만들었습니다. 입력에 대해서는 SearchView이고 기사가있는 경우에는 ListView이 표시됩니다.

내 문제는 SearchView에 문자를 입력하면 내 응용 프로그램이 IndexOutOfBounceException으로 인해 충돌합니다.

java.lang.IndexOutOfBoundsException: Invalid index 2, size is 2 
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:62) 
at android.widget.AbsListView.obtainView(AbsListView.java:2347) 
at android.widget.ListView.measureHeightOfChildren(ListView.java:1270) 
at android.widget.ListView.onMeasure(ListView.java:1182) 
at android.view.View.measure(View.java:17586) 

나는 기사 제목이 SearchView의 입력을 포함하는 경우와 비교 내 ArticleAdapter에서 사용자 정의 필터를 만들었습니다. 여기

class Article_List_Adapter extends ArrayAdapter<Article> implements Filterable { 
public static final String TAG = "List_Adapter Test"; 
public List<Article> articles; 
CustomFilter filter; 

public Article_List_Adapter(Context _c, int textViewResourceId, List<Article> articles) { 
    super(_c, textViewResourceId, articles); 
    this.articles = articles; 
} 

public class ViewHolder { 
    ImageView article_icon; 
    TextView articleTitle; 
    TextView articleCategory; 
    TextView articleDate; 
    TextView articleAuthor; 
} 

@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 = getItem(_position); 
    Article currentArticle = articles.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; 
} 

public Filter getFilter() { 
    if (filter == null) { 
     filter = new CustomFilter(); 
    } 
    return filter; 
} 

class CustomFilter extends Filter { 
    @Override 
    protected FilterResults performFiltering(CharSequence _constraint) { 
     FilterResults results = new FilterResults(); 
     ArrayList<Article> article_list = (ArrayList<Article>) articles; 
     Log.e(TAG, "articles size: "+article_list.size()); 
     ArrayList<Article> tempList = new ArrayList<>(); 
     if (_constraint != null && articles != null) { 
      for (final Article a : article_list) { 
       if (a.getTitle().toLowerCase().contains(_constraint.toString())) { 
        tempList.add(a); 
       } 
      } 
      Log.e(TAG, "tempList size: "+tempList.size()); 
      results.values = tempList; 
      results.count = tempList.size(); 
     } 
     return results; 

    } 

    @Override 
    protected void publishResults(CharSequence constraint, FilterResults results) { 
     articles = (ArrayList<Article>) results.values; 
     if (results.count > 0) { 
      notifyDataSetChanged(); 
     } else { 
      notifyDataSetInvalidated(); 
     } 
    } 
} 
} 

과 SearchView 및 ListView에 표시 내 조각입니다 : 내가 아무것도 잊지 않았다 희망

public class SearchFragment extends Fragment { 
private ListView articleListView; 
private List<Article> articles; 
private SearchView inputSearch; 
private ArrayAdapter<Article> article_list_adapter; 

public SearchFragment() { 
    // Required empty public constructor 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.fragment_search, container, false); 
    articles = MainActivity.getInstance().getArticleList(); 

    articleListView = (ListView) view.findViewById(R.id.search_list_view); 
    inputSearch = (SearchView) view.findViewById(R.id.inputSearch); 

    //Create and Set Adapter for ListView 
    article_list_adapter = new Article_List_Adapter(getActivity(), R.layout.article_list_row, articles); 
    articleListView.setAdapter(article_list_adapter); 

    //Set Property for SearchView 
    inputSearch.setQueryHint("Search"); 

    //SEARCH 
    inputSearch.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
     @Override 
     public boolean onQueryTextSubmit(String query) { 
      return false; 
     } 

     @Override 
     public boolean onQueryTextChange(String query) { 
      article_list_adapter.getFilter().filter(query); 
      return false; 
     } 
    }); 
    return view; 
} 
}  

여기

는 어댑터 클래스에 대한 코드입니다. 고마워!

P. 이것은 내 첫 게시물입니다

+0

checkthis http://androidquake.blogspot.in/2015/12/searching-in-list.html – Singhak

답변

0

여기 오류입니다.

@Override 
protected void publishResults(CharSequence constraint, FilterResults results) { 
    articles = (ArrayList<Article>) results.values; 
    if (results.count > 0) { 
     notifyDataSetChanged(); 
    } else { 
     notifyDataSetInvalidated(); 
    } 
} 

클래스는 기본 클래스에서 확장하고 그렇게 다음 articles 참조 모두 같은 아직 기본 클래스에 대한 참조를 업데이트, 기본 생성자에서 List을 넣어. 따라서 ListView은 기본 클래스 생성자에 넣은 List에 대한 항목을 가져옵니다. 당신이 getItemsCount 메소드를 오버라이드 (override) 할 필요가이 문제를 해결하려면
(안드로이드 문서에서 올바른 메소드 이름을 참조하십시오.

+0

당신 그래서getCount() {} getItem (int pos), getItemId (int post) {}, 메서드? 어디에서 사용합니까? –

+0

그래, 그렇게하는 방법이 있다면 (죄송합니다. 이 메소드에서'articles.size()'를 반환해야 함) –

+0

참조 데이터 유형에 대해 잘 이해하지 못했다면 그것에 대해 읽어야하고 C/C++에서 시도하는 것이 더 낫다. –

관련 문제