Android 는 EditText 검색 상자 ListView 에 따라 데 이 터 를 동적 으로 표시 합 니 다.

EditText 검색 상자 ListView 동적 디 스 플레이 데 이 터 는 수요 에 따라 표 시 됩 니 다.이 중 에 관련 된 것 이 비교적 재 미 있 을 것 같 아서 쓰기 시 작 했 습 니 다.도움 이 되 었 으 면 좋 겠 습 니 다.
우선,우 리 는 전체 과정 을 분석 해 보 자.
1.EditText 검색 상자 와 ListView 를 포함 하 는 layot 를 만 듭 니 다.
2.데이터 세트 mData 를 만 들 고 ListView 의 Adapter 생 성 에 사용 합 니 다.
3.EditText 의 텍스트 변경 모니터 추가
4,notifyDataSetChanged()를 이용 하여 동적 업데이트 ListView
첫 번 째 단계:검색 상자 만 들 기
이것 은 그래도 비교적 쉽다.여기 서 내 가 사용 하 는 것 은?http://blog.csdn.net/walker02/article/details/7917392이 글 의 텍스트 상 자 는 점 차 를 모두 삭제 하 는 기능 이 있 지만 검색 단 추 를 삭 제 했 습 니 다.동적 검색 때문에 단 추 를 사용 할 수 없습니다.
Relativelayout 레이아웃 을 추가 하고 두 개의 컨트롤 을 추가 합 니 다(구체 적 으로 3 개).

효 과 는 위 와 같 습 니 다.xml 코드 는 다음 과 같 습 니 다.
두 번 째 단계:데이터 세트 mData 만 들 기
여기 서 Simple Adapter 를 사 용 했 기 때문에 데이터 세트 가 만 든 형식 은 저 는 이 렇 습 니 다.저 는 자신의 Adapter 에 따라 메타 데 이 터 를 만 들 고 mListTitle 과 mListText 에 저 장 된 데 이 터 는 바 뀌 지 않 습 니 다.mData 는 텍스트 상자 가 바 뀔 때 mData 의 데이터 도 상응 하 게 변 경 됩 니 다.이것 은 업데이트 작업 에 필요 한 것 입 니 다.메타 데이터 세트 를 만 드 는 것 입 니 다.
코드 는 다음 과 같 습 니 다:

  ListView mListView;
  
  ArrayList<map<string, object="">> mData = new ArrayList<map<string, object="">>();
  
  ArrayList<string> mListTitle = new ArrayList<string>();
  ArrayList<string> mListText = new ArrayList<string>();
   
  private void getmData(ArrayList<map<string, object="">> mDatas)
  {
    Map<string, object=""> item = new HashMap<string, object="">();
    mListTitle.add(This is a title!);
    mListText.add(this is a text.
2014.09.18.16.33);
 
    item.put(title, mListTitle.get(0));
    item.put(text, mListText.get(0));
    mDatas.add(item);
    mListTitle.add(This is an another title!);
    mListText.add(this is an another text.
2014.09.18.16.33);
  
    item = new HashMap<string, object="">();
    item.put(title, mListTitle.get(1));
    item.put(text, mListText.get(1));
    mDatas.add(item);
  }</string,></string,></string,></map<string,></string></string></string></string></map<string,></map<string,>
그리고 mData 를 이용 하여 Adapter 를 만 듭 니 다.

private void set_mListView_adapter()
{
 mListView = (ListView) findViewById(R.id.mListView);
  
 getmData(mData);
  
 adapter = new SimpleAdapter(this,mData,android.R.layout.simple_list_item_2, 
   new String[]{title,text},new int[]{android.R.id.text1,android.R.id.text2});
  
 mListView.setAdapter(adapter);
}
여기 서 프로그램 시작 상 태 는 표 시 됩 니 다.검색 상자 가 없 으 면 이만 하면 됩 니 다.
세 번 째 단계:EditText 텍스트 변경 모니터 추가
ListView 의 디 스 플레이 를 동적 으로 수정 해 야 하기 때문에 감청 을 하고 그 에 상응하는 동작 을 해 야 합 니 다.텍스트 가 바 뀌 었 다 는 말 을 들 었 을 때 Handler post 하나의 Runnable 로 바 꿉 니 다.

private void set_eSearch_TextChanged()
{
 eSearch = (EditText) findViewById(R.id.etSearch);
   
 eSearch.addTextChangedListener(new TextWatcher() {
    
   @Override
   public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
    // TODO Auto-generated method stub
    //                 ,       。
   }
    
   @Override
   public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
      int arg3) {
    // TODO Auto-generated method stub
    //               
   }
    
   @Override
   public void afterTextChanged(Editable s) {
    // TODO Auto-generated method stub
    /**                
     *          ,         ,   listview           ,           。
     *                     。
     */
    if(s.length() == 0){
      ivDeleteText.setVisibility(View.GONE);//       ,     
    }
    else {
      ivDeleteText.setVisibility(View.VISIBLE);//        ,    
      myhandler.post(eChanged);
    }
   }
 });
   
}
Handler 는 여기 서 커 다란 용 도 를 나 타 냈 다.우 리 는 Handler 의 이러한 post 기능 에 따라 인터페이스 신마 에 대해 자신 이 원 하 는 변 화 를 할 수 있다.ListView 의 수정 만 있 는 것 이 아니 라 글 자 를 입력 할 때마다 글씨체 가 다른 색깔 로 바 뀌 어도 된다.
STEP 4:notifyDataSetChanged()를 이용 하여 동적 업데이트 ListView
본론 으로 돌아 가 는 것 이 가장 중요 한 단계 입 니 다.우 리 는 post 가 나 왔 습 니 다.그러면 우 리 는 텍스트 상자 의 텍스트 를 검색 한 다음 에 메타 데 이 터 를 선별 한 다음 에 맞 는 데 이 터 를 ListView 에 표시 해 야 합 니 다.
(/*가장귀,S4 를 이 고 블 로 그 를 쓰 는 것 은 죄 가 아 닙 니까?*/)
adapter 는 notifyDataSetChanged()방법 이 있 습 니 다.데이터 업데이트 시 이 방법 을 사용 하면 바 인 딩 된 ListView 를 업데이트 할 수 있 습 니 다.효 과 는 다음 과 같 습 니 다.

5 를 입력 하 시 겠 습 니까?아니면 두 개의 item 이 있 습 니까?제 선택 은 title 과 text 가 텍스트 상자 의 문 자 를 포함 하면 대상 item 입 니 다.

50 을 입력 하면 한 item 의 title 이나 text 텍스트 에 검색 상자 의 텍스트 만 포함 되 어 있 기 때문에 이것 만 표시 합 니 다.

여기에 0 을 더 하면 아 이 템 이 없 는 텍스트 가 500 을 포함 하기 때문에 Listview 에 아 이 템 이 없습니다.
순조롭게 효 과 를 거 두 었 습 니 다.정말 좋 습 니 다.LZ 수준 이 너무 낮 아서 약간의 문제 에 부 딪 혔 습 니 다.
여기 서 문제 가 생 길 수 있 습 니 다.
1.notifyDataSetChanged(),이 업데이트,mData 데이터 세트 도 확실히 바 뀌 었 지만 ListView 는 업데이트 되 지 않 았 습 니 다.저 는 예전 에 이 랬 습 니 다.나중에 발 견 했 을 때 mData 데이터 세트 의 인용 이 바 뀌 었 기 때문에 Adapter 는 notify 를 사용 하지 않 았 습 니 다.Adapter 는 mData 의 인용 과 연결 되 어 있 고 인용 이 바 뀌 었 기 때문에 데 이 터 는 ListView 에 업데이트 되 지 않 았 습 니 다.이것 도 제 가 get 함수 인 자 를 사용 하 는 것 이 인용 을 전달 하 는 이유 입 니 다.인용 을 직접 되 돌려 주면 이 문제 가 발생 할 수 있 으 므 로 주의해 야 합 니 다.참고 가능/kf/2014 01/273017.html
2.인터페이스 UI 업데이트 에 대해 Handler 를 사용 할 수 있 습 니 다.Post 를 통 해 Runnable 을 업데이트 할 수 있 습 니 다.Runnable 은 검색 상자 의 텍스트 에 따라 mData 의 데 이 터 를 업데이트 합 니 다.
코드 는 다음 과 같 습 니 다:

Runnable eChanged = new Runnable() {
   
 @Override
 public void run() {
   // TODO Auto-generated method stub
   String data = eSearch.getText().toString();
    
   mData.clear();
    
   getmDataSub(mData, data);
    
   adapter.notifyDataSetChanged();
    
 }
};
3.mData 에 대한 이해 에 문제 가 있 을 수 있 습 니 다.데이터 가 업 데 이 트 된 후에 모든 선별 데 이 터 는 mData 에 놓 여 있 기 때 문 입 니 다.그러면 원래 의 데 이 터 는 당연히 mListTitle 과 mListText 에 있 습 니 다.데 이 터 를 얻 은 getmDataSub 의 코드 에 따라 알 수 있 습 니 다.

private void getmDataSub(ArrayList<map<string, object="">> mDataSubs, String data)
{
  int length = mListTitle.size();
  for(int i = 0; i < length; ++i){
   if(mListTitle.get(i).contains(data) || mListText.get(i).contains(data)){
    Map<string,object> item = new HashMap<string,object>();
    item.put(title, mListTitle.get(i));
    item.put(text, mListText.get(i));
    mDataSubs.add(item);
   }
  }
} </string,object></string,object></map<string,>
4.텍스트 상자 가 첫 번 째 에 있 기 때문에 프로그램 이 실행 되면 텍스트 상자 에 초점 을 맞 추고 입력 법 을 팝 업 합 니 다.xml 파일 에 길이 가 0 인 LinearLayout 를 추가 하여 초점 을 얻 습 니 다.코드 는 다음 과 같 습 니 다.
종합 적 으로 이 동적 인 방법 은 개선 이 필요 할 수 있 습 니 다.예 를 들 어 선별 하 는 방법,그리고 컨트롤 은 SampleAdapter 를 위 한 Listview 일 뿐 사용자 정의 ListView 라면 최적화 할 수 있 을 것 입 니 다.그리고 ListView 의 height 설정 을 wrap 로 설정 합 니 다.content 와 fillparent 두 가지 방법 은 실제 기계 로 바 꾸 면 두 가지 차 이 를 체험 할 수 있 습 니 다.비교적 뚜렷 하 죠?바로 아래로 그 리 는 과정 입 니 다.
이상 은 Android 가 EditText 검색 상자 ListView 에 따라 데 이 터 를 동적 으로 표시 하 는 인 스 턴 스 입 니 다.필요 한 친 구 를 도와 주 셨 으 면 합 니 다.본 사이트 에 대한 지원 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기