2014-09-22 88 views
0

你好朋友我已经开始学习Android的某些日子了 我在列表视图上工作,我想在列表视图中搜索项目。 gi已经经历了许多帖子,并且写了下面的代码,但是一些它没有工作。请帮忙 。ListView搜索不能正常工作

QyestionActivity

public class QuestionActivity extends ActionBarActivity { 

String filepath = null; 
String question_filepath = null; 
Controller c; 
ListView question_list_view; 
EditText txt_search; 
ArrayList<SingleQuestion> question_list; 
Main_QuestionList_Adapter questionlistAdapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_question); 
    filepath = Constant.application_file_path; 
    question_filepath = filepath + "questions.txt"; 
    File test_fiFile = new File(question_filepath); 
    if (!test_fiFile.exists()) { 
     copyAssets(); 
    } 

    new ParseQuestionFIle().parseQuestionfile(question_filepath); 
    c = Controller.getController(); 
    question_list = c.getQuestions().getQuestions(); 
    question_list_view = (ListView) findViewById(R.id.lst_questionlit); 
    txt_search = (EditText) findViewById(R.id.editText1); 
    questionlistAdapter = new Main_QuestionList_Adapter(
      QuestionActivity.this); 
    question_list_view.setAdapter(questionlistAdapter); 
    question_list_view.setTextFilterEnabled(true); 
} 

protected void onResume() { 
    super.onResume(); 

    txt_search.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      questionlistAdapter.getFilter().filter(s); 
      questionlistAdapter.notifyDataSetInvalidated(); 
      questionlistAdapter.notifyDataSetChanged(); 
      question_list_view.setAdapter(questionlistAdapter); 

     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      // TODO Auto-generated method stub 

     } 
    }); 


} 

适配器类别

公共类Main_QuestionList_Adapter延伸BaseAdapter实现可筛选{

Controller c = Controller.getController(); 
ArrayList<SingleQuestion> questions_aerraylist; 
LayoutInflater inflater; 
Context context; 
SingleQuestion singleQuestion; 
Filter filter; 
public Main_QuestionList_Adapter(Context context) { 
    this.context = context; 
    questions_aerraylist = new ArrayList<SingleQuestion>(); 
    questions_aerraylist = c.getQuestions().getQuestions(); 
    inflater = LayoutInflater.from(context); 

} 

@Override 
public int getCount() { 
    return questions_aerraylist.size(); 
} 

@Override 
public Object getItem(int position) { 
    return position; 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(final int position, View currentView, ViewGroup parentView) { 
    QuestioViewHolder questionviewholder; 

    if (currentView == null) { 
     currentView = inflater 
       .inflate(
         com.example.ten_step.R.layout.main_question_list_adapter_view, 
         null); 
     questionviewholder = new QuestioViewHolder(); 
     currentView.setTag(questionviewholder); 
    } else { 
     questionviewholder = (QuestioViewHolder) currentView.getTag(); 
    } 
    questionviewholder.question_text_view = (TextView) currentView 
      .findViewById(com.example.ten_step.R.id.txt_question_text); 
    singleQuestion = new SingleQuestion(); 
    singleQuestion = questions_aerraylist.get(position); 
    questionviewholder.question_text_view.setText(singleQuestion 
      .getQuestion().toString()); 
    questionviewholder.question_text_view.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       if(singleQuestion != null) 
       { 
        c.setSelected_question(questions_aerraylist.get(position)); 
        Toast.makeText(context, c.getSelected_question().getQuestion(), Toast.LENGTH_LONG).show(); 
       } 
       else 
       { 
        Toast.makeText(context, "Please Tr Againg", Toast.LENGTH_LONG).show(); 
       } 
      } 
     }); 
    return currentView; 
} 

class QuestioViewHolder { 
    TextView question_text_view; 
} 

@Override 
public Filter getFilter() { 
     if (filter == null) { 
      filter = new QuestionFilter(); 
     } 
     return filter; 
} 



private class QuestionFilter extends Filter { 

    ArrayList<SingleQuestion> actual_list; 
    ArrayList<SingleQuestion> sorted_list; 

    Controller controller; 

    public QuestionFilter() { 
     actual_list = new ArrayList<SingleQuestion>(); 
     controller = Controller.getController(); 
     actual_list = controller.getQuestions().getQuestions(); 
     sorted_list = new ArrayList<SingleQuestion>(); 

    } 

    @Override 
    protected FilterResults performFiltering(CharSequence searchQuer) { 
     String search_query = searchQuer.toString().toLowerCase(); 
     FilterResults result = new FilterResults(); 
     if(search_query != null || search_query.length() !=0) 
     { 
      for (int i = 0 ; i < actual_list.size() ; i++) 
      { 
       if(actual_list.get(i).getQuestion().toLowerCase().contains(search_query) && !sorted_list.contains(actual_list.get(i))) 
       { 
        sorted_list.add(actual_list.get(i)); 
       } 
      } 
      if(sorted_list.size() !=0) 
      { 
       result.values = sorted_list; 
       result.count = sorted_list.size(); 

      } 
     } 
     else 
     { 
      result.values = actual_list; 
      result.count = actual_list.size(); 
     } 
     c.getQuestions().setQuestion((ArrayList<SingleQuestion>) result.values); 
     return result; 
    } 

    @Override 
    protected void publishResults(CharSequence searchQuer, FilterResults results) { 
     ArrayList<SingleQuestion> new_sorted_list = (ArrayList<SingleQuestion>) results.values; 
     if (results.count > 0) { 
      c.getQuestions().setQuestion(new_sorted_list); 
      // notifyDataSetChanged(); 
     } else { 
      notifyDataSetInvalidated(); 
     } 
    } 

} 

}

预先感谢。

+0

嗨下来投票请在投票前添加您的评论。所以我会纠正自己,如果我做了一些错误的事情。 – 2014-09-23 05:10:42

回答

0

我已经以不同的方式完成了SEARCH IN LIST VIEW。 我已经使用Textwatcher而不是实现适配器的Filterable接口。

请看看下面的代码,并提供建议,如果你有。

public class QuestionActivity extends ActionBarActivity { 

String filepath = null; 
String question_filepath = null; 
Controller c; 
ListView question_list_view; 
EditText txt_search; 
ArrayList<SingleQuestion> question_list; 
Main_QuestionList_Adapter questionlistAdapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_question); 
    filepath = Constant.application_file_path; 
    question_filepath = filepath + "questions.txt"; 
    File test_fiFile = new File(question_filepath); 
    if (!test_fiFile.exists()) { 
     copyAssets(); 
    } 

    new ParseQuestionFIle().parseQuestionfile(question_filepath); 
    c = Controller.getController(); 
    question_list = c.getQuestions().getQuestions(); 
    question_list_view = (ListView) findViewById(R.id.lst_questionlit); 
    txt_search = (EditText) findViewById(R.id.editText1); 
    questionlistAdapter = new Main_QuestionList_Adapter(
      QuestionActivity.this , c.getQuestions().getQuestions()); 
    question_list_view.setAdapter(questionlistAdapter); 
    question_list_view.setTextFilterEnabled(true); 
    txt_search.addTextChangedListener(searchTextChangeListener); 
} 

protected void onResume() { 
    super.onResume(); 

} 

TextWatcher searchTextChangeListener = new TextWatcher() { 

    @Override 
    public void onTextChanged(CharSequence s, int start, int before, 
      int count) { 
     ArrayList<SingleQuestion> defaultQuestinList = c.getQuestions() 
       .getQuestions(); 
     if (s.length() > 0) { 

      Set<SingleQuestion> sortedQuestionSet = new HashSet<SingleQuestion>(); 
      int questionListCount = defaultQuestinList.size(); 
      String searchQuery = s.toString().toLowerCase(); 
      for (int i = 0; i < questionListCount; i++) { 
       if (defaultQuestinList.get(i).getQuestion().toLowerCase() 
         .contains(searchQuery)) { 
        sortedQuestionSet.add(defaultQuestinList.get(i)); 
       } 
      } 
      ArrayList<SingleQuestion> sortedQuestionList = new ArrayList<SingleQuestion>(); 
      sortedQuestionList.addAll(sortedQuestionSet); 
      questionlistAdapter = new Main_QuestionList_Adapter(QuestionActivity.this ,sortedQuestionList); 
      question_list_view.setAdapter(questionlistAdapter); 
     } 
     else 
     { 
      Questions q = c.getQuestions(); 
      q.setQuestion(defaultQuestinList); 

      questionlistAdapter = new Main_QuestionList_Adapter(QuestionActivity.this ,defaultQuestinList); 
      question_list_view.setAdapter(questionlistAdapter); 
     } 
    } 

    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, 
      int after) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void afterTextChanged(Editable s) { 
     // TODO Auto-generated method stub 

    } 
}; 

上面的代码为我工作完全正常。