有没有办法在我的自定义列表视图上创建一个使用BaseAdapter而不是ArrayAdapter创建的搜索过滤器,因为我只遇到过在自定义列表视图中使用ArrayAdapters的方法。 Follwing是我遇到的Making a filter using Array Adapter
答案 0 :(得分:2)
如果你正在使用List集合,那么扩展ArrayAdapter - 它是BaseAdapter的子类。
覆盖getView方法(在您的情况下,只需稍加修改即可复制旧的getView代码)。
覆盖集合中的对象的toString并设置:
listView.setTextFilterEnabled(true);
答案 1 :(得分:2)
以下是使用基本适配器创建的列表视图的示例。 我搜索了很多,但没有得到任何令人满意的解决方案。因此我想把它放在一起以便以后它可以帮助别人。
以下是 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>
以下是 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>
以下是 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>
抱歉,我无法以正确的格式放置代码。由于没有标签,这些内容已经发生了变化,这很不错。但为了方便用户,这也是一个很好的选择。 也许我的错是我无法以正确的格式发布。似乎我们无法发布xml文件内容。所以,想想布局的设计方式。
活动代码为: -
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>();
}
答案 2 :(得分:0)
答案 3 :(得分:0)
这是一个例子。编辑并使用您需要的内容。
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;
}