2011-03-30 20 views
5

Có cách nào để tạo bộ lọc tìm kiếm trong chế độ xem danh sách tùy chỉnh của tôi được tạo bằng BaseAdapter chứ không phải là ArrayAdapter, vì tôi chỉ gặp các phương thức đang sử dụng ArrayAdapters trong đó Chế độ xem danh sách tùy chỉnh. Follwing là những gì tôi đã xem qua Making a filter using Array AdapterAndroid: ListView tìm kiếm Bộ lọc

+0

tôi shoud thực hiện các giao diện lọc trong BaseAdapter của tôi? – hassanadnan

+0

Bạn đang sử dụng, Cursor hoặc Array hoặc cái gì khác? – pawelzieba

+0

Tôi đang sử dụng BaseAdapter – hassanadnan

Trả lời

3

Nếu bạn đang sử dụng Bộ sưu tập danh sách thì hãy mở rộng ArrayAdapter - đó là phân lớp của BaseAdapter.

Ghi đè phương thức getView (Trong trường hợp của bạn, chỉ cần sao chép mã getView cũ của bạn với ít sửa đổi).

Override toString của đối tượng đó là trong bộ sưu tập của bạn và thiết lập:

listView.setTextFilterEnabled(true); 
+0

Tôi đang làm điều này ngay bây giờ 'lớp FriendsListAdapter mở rộng BaseAdapter thực hiện Filterable' xin vui lòng cho tôi biết những gì bạn có nghĩa là bằng cách ghi đè các BaseAdapter? – hassanadnan

+0

Như tôi đã viết nó sẽ đơn giản hơn nhiều để ghi đè lên ArrayAdapter: 'lớp FriendsListAdapter mở rộng ArrayAdapter ' – pawelzieba

+0

hoặc thêm android: textFilterEnabled = "true" cho ListView trong bố cục – pawelzieba

0

ArrayAdapter là một lớp con của BaseAdapter.

Mã nguồn cho ArrayAdapter là here. Hãy xem nó ..

Điều này sẽ giải quyết được vấn đề của bạn.

0

Đây là một ví dụ. Chỉnh sửa và sử dụng những gì bạn cần.

public class CustomListAdapter extends BaseAdapter { 
private ArrayList<String> countryStringList; 
private ArrayList<Integer> countryImageList; 
private LayoutInflater mInFlater; 
// private Bitmap mIcon1; 
// private Bitmap mIcon2; 
private int layoutID; 
private Context context; 
// private LayoutInflater mInflater; 
public CustomListAdapter(Context context, int textViewResourceId, 
     ArrayList<String> stringObjects, ArrayList<Integer> imgObjects) { 
    super(); 
    this.context = context; 
    countryStringList = stringObjects; 
    countryImageList = imgObjects; 
    layoutID = textViewResourceId; 
    mInFlater = LayoutInflater.from(context); 
} 

@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    // return countryStringList.size(); 
    return countryStringList.size(); 
} 

@Override 
public Object getItem(int position) { 
    // TODO Auto-generated method stub 
    return position; 
} 

@Override 
public long getItemId(int position) { 
    // TODO Auto-generated method stub 
    return position; 
} 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 
    final ViewHolder holder; 
    if (convertView == null) { 

     convertView = mInFlater.inflate(layoutID, null); 
     holder = new ViewHolder(); 
     holder.textCountryName = (TextView) convertView 
       .findViewById(R.id.txtSelectedCountryName); 
     holder.icon = (ImageView) convertView 
       .findViewById(R.id.imgSelectedCountryImage); 
     holder.textCountryPosition = (TextView) convertView 
       .findViewById(R.id.txtSelectedCountryPosition); 
     // holder.checkBoxListView=(CheckBox)convertView.findViewById(R.id.CheckBoxListView); 
     holder.relativeLayoutList = (RelativeLayout) convertView 
       .findViewById(R.id.relativeLayoutListItem); 
     holder.checkBoxListView = (CheckBox) convertView 
       .findViewById(R.id.checkBoxSelectedCountry); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
     // holder=(ViewHolder)convertView.findViewById(R.id.TextViewIcon1) 
    } 
    holder.checkBoxListView.setTag(position); 
    holder.textCountryName.setText(countryStringList.get(position)); 
    holder.textCountryPosition.setText(position + 1 + "/" 
      + countryStringList.size()); 
    holder.icon.setImageResource((countryImageList.get(position))); 
    if (ListViewController.checkStatusList.get(position).equalsIgnoreCase("present")) { 
     holder.checkBoxListView.setVisibility(View.VISIBLE); 
    } else { 
     holder.checkBoxListView.setVisibility(View.GONE); 
    } 
    /* 
    * holder.checkBoxListView.setOnCheckedChangeListener(new 
    * OnCheckedChangeListener(){ 
    * 
    * @Override public void onCheckedChanged(CompoundButton buttonView, 
    * boolean isChecked) { // TODO Auto-generated method stub 
    * 
    * ListActivityImplementation listActivityImplementation = new 
    * ListActivityImplementation(); //show("Checkbox"); 
    * ListActivityImplementation.countryStringList.remove(position); 
    * ListActivityImplementation.countryImageList.remove(position); 
    * ListActivityImplementation.lv.invalidateViews(); 
    * 
    * //ListActivityImplementation.show("Checkbox"); } 
    * 
    * }) ; 
    */ 
    holder.textCountryName.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      holder.textCountryPosition.setText(position + 1 + "/" 
        + countryStringList.size() + "clicked"); 
     } 

    }); 
    holder.checkBoxListView 
      .setOnCheckedChangeListener(new android.widget.CompoundButton.OnCheckedChangeListener() { 

       @Override 
       public void onCheckedChanged(CompoundButton buttonView, 
         boolean isChecked) { 
        MathHelper.showToast(context, buttonView.getTag() 
          + " clicked"); 
       } 
      }); 
    return convertView; 
} 
} 
class ViewHolder { 
TextView textCountryName; 
ImageView icon; 
TextView textCountryPosition; 
RelativeLayout relativeLayoutList; 
CheckBox checkBoxListView; 

}

+0

Cảm ơn bạn vì điều này nhưng tôi muốn biết cách sử dụng giao diện Filterbale với bộ điều hợp cơ sở, để tôi có thể lọc tìm kiếm danh sách xem của tôi – hassanadnan

2

Dưới đây là một ví dụ cho xem danh sách được tạo ra sử dụng bộ chuyển đổi cơ sở. Tôi đã tìm kiếm rất nhiều nhưng không nhận được bất kỳ giải pháp thỏa đáng nào. Tôi nghĩ là nên đưa nó lên để trong tương lai nó có thể giúp người khác.

Đây là mã của history_container.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" android:layout_height="fill_parent" 
    android:orientation="vertical"> 
    <EditText android:layout_width="fill_parent" android:layout_height="wrap_content" 
     android:id="@+id/filter_text" /> 
    <FrameLayout android:layout_width="fill_parent" 
     android:layout_height="fill_parent" android:id="@+id/historyContainerLayout" /> 
</LinearLayout> 

Dưới đây là đoạn code của history_list_view.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_height="wrap_content" android:gravity="left|center" 
    android:layout_width="wrap_content" android:paddingBottom="5px" 
    android:paddingTop="5px" android:paddingLeft="5px"> 
    <TextView android:text="@+id/historytext" android:id="@+id/historytext" 
     android:layout_width="wrap_content" android:layout_height="wrap_content" 
     android:layout_marginLeft="10px" android:textColor="#0099CC"/> 
</LinearLayout> 

Dưới đây là đoạn code của history_schedule.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <ScrollView android:id="@+id/scrollItemInfo" 
     android:layout_width="fill_parent" android:layout_height="1000dip"> 
     <LinearLayout android:orientation="vertical" 
      android:layout_width="fill_parent" android:layout_height="fill_parent"> 
       <ListView android:id="@+id/historylist" android:layout_height="1000dip" 
         android:layout_width="fill_parent"/> 
     </LinearLayout> 
    </ScrollView> 
</LinearLayout> 

Xin lỗi, tôi không thể đặt mã ở định dạng đúng. Có điều gì đó đã thay đổi vì không còn thẻ nào tốt đẹp nữa. Nhưng để thuận tiện cho người dùng, bạn cũng nên có tab. Có thể đó là lỗi của tôi mà tôi không thể đăng ở định dạng chính xác.Và có vẻ như chúng tôi không thể đăng nội dung tệp xml..Vì vậy, hãy nghĩ cách bố cục sẽ được thiết kế.

Mã hoạt động là: -

package com.testfilter; 

import java.util.ArrayList; 
import java.util.List; 

import android.app.Activity; 
import android.content.Context; 
import android.os.Bundle; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.view.ViewStub; 
import android.widget.BaseAdapter; 
import android.widget.EditText; 
import android.widget.FrameLayout; 
import android.widget.ListView; 
import android.widget.TextView; 


public class TestFilterListView extends Activity { 
    FrameLayout historyContainer; 
    ViewStub viewStub; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.history_container); 
     historyContainer = (FrameLayout) findViewById(R.id.historyContainerLayout); 
     EditText filterEditText = (EditText) findViewById(R.id.filter_text); 
     filterEditText.addTextChangedListener(new TextWatcher() { 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 

       historyContainer.removeAllViews(); 
       final List<String> tempHistoryList = new ArrayList<String>(); 
       tempHistoryList.addAll(historyList); 
       for(String data : historyList) { 
        if(data.indexOf((s.toString())) == -1) { 
         tempHistoryList.remove(data); 
        } 
       } 
       viewStub = new ViewStub(TestFilterListView.this, R.layout.history_schedule); 
       viewStub.setOnInflateListener(new ViewStub.OnInflateListener() 
       { 
        public void onInflate(ViewStub stub, View inflated) 
        { 

         setUIElements(inflated, tempHistoryList); 
        } 
       }); 
       historyContainer.addView(viewStub); 
       viewStub.inflate(); 

      } 

      @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 

      } 
     }); 

     setViewStub(); 
    } 


    /********************************************************************************************************/ 
    private void setViewStub() 
    { 
     historyList.add("first"); 
     historyList.add("second"); 
     historyList.add("third"); 
     historyList.add("fourth"); 
     historyList.add("fifth"); 
     historyList.add("sixth"); 
     historyList.add("seventh"); 


     viewStub = new ViewStub(TestFilterListView.this, R.layout.history_schedule); 
     viewStub.setOnInflateListener(new ViewStub.OnInflateListener() 
     { 
      public void onInflate(ViewStub stub, View inflated) 
      { 

       setUIElements(inflated, historyList); 
      } 
     }); 
     historyContainer.addView(viewStub); 
     viewStub.inflate(); 
    } 

    /********************************************************************************************************/ 
    final List<String> historyList = new ArrayList<String>(); 
    String displayName = ""; 
    ListView historyListView; 
    private void setUIElements(View v, List<String> historyLists) 
    { 

     if (v != null) 
     { 
      historyScheduleData.clear(); 
      //historyList.clear(); 

      historyScheduleData.addAll(historyLists); 
      historyListView = (ListView) findViewById(R.id.historylist); 
      historyListView.setAdapter(new BeatListAdapter(this)); 

      registerForContextMenu(historyListView); 


     } 
    } 

    /********************************************************************************************************/ 
    private static class BeatListAdapter extends BaseAdapter { 
     private LayoutInflater mInflater; 

     public BeatListAdapter(Context context) { 
      mInflater = LayoutInflater.from(context); 

     } 

     public int getCount() { 
      return historyScheduleData.size(); 
     } 

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

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

     public View getView(int position, View convertView, ViewGroup parent) { 
      ViewHolder holder; 
      if (convertView == null) { 
       convertView = mInflater.inflate(R.layout.history_list_view, null); 
       holder = new ViewHolder(); 
       holder.historyData = (TextView) convertView 
         .findViewById(R.id.historytext); 

       convertView.setTag(holder); 
      } else { 
       holder = (ViewHolder) convertView.getTag(); 
      } 

      holder.historyData.setText(historyScheduleData.get(position)); 

      return convertView; 
     } 

     static class ViewHolder { 

      TextView historyData; 
     } 
    } 

    private static final List<String> historyScheduleData = new ArrayList<String>(); 


} 
+0

đây là url nơi bạn có thể xem blog của tôi [link] http://androidsearchfilterlistview.blogspot.com/ –