执行搜索后的ListView setOnItemClickListener不工作 [英] ListView setOnItemClickListener not working after implementing search
本文介绍了执行搜索后的ListView setOnItemClickListener不工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个具有搜索功能的对话框里一个简单的列表视图。搜索功能工作正常,但名单的setOnItemClickListener停止工作执行搜索后。
函数来创建列表视图:
私人无效showCollegePopUp(){
QustomDialogBuilder建设者=新QustomDialogBuilder(EditYourProfile.this);
builder.setDividerColor(ColorController.bright_green); 视图V = builder.setCustomView(R.layout.dialog_friend_layout,这一点); 最终的ListView列表=(ListView控件)v.findViewById(R.id.dialog_list_view_friends);
LayoutInflater吹气=(LayoutInflater)EditYourProfile.this.getSystemService
(Context.LAYOUT_INFLATER_SERVICE);
footerView = inflater.inflate(R.layout.add_college_list_footer,列表,FALSE);
list.addFooterView(footerView);
inputSearch =(EditText上)v.findViewById(R.id.inputSearch);
TextView中的TextView =(TextView中)v.findViewById(R.id.add_college); textView.setTypeface(TypeFaceController.generalTextFace(EditYourProfile.this)); 的LinearLayout footer_linear_layout =(的LinearLayout)v.findViewById(R.id.footer_linear_layout);
footer_linear_layout.setOnClickListener(新View.OnClickListener(){
@覆盖
公共无效的onClick(视图v){
alertDialog.dismiss();
意图I =新意图(EditYourProfile.this,CreateCollegeActivity.class);
startActivity(ⅰ);
}
});
footerView.setVisibility(View.GONE); 如果(listOfCollegeCourseNames.size()== 0){
listOfCollegeCourseNames.add(抢学院......);
} 适配器=新CustomDialogAdapterBasic(EditYourProfile.this,android.R.id.text1,listOfCollegeCourseNames);
list.setPadding(16,0,0,0);
list.setAdapter(适配器);
inputSearch.addTextChangedListener(新TextWatcher(){ //对EditTex改变字的事件时
@覆盖
公共无效onTextChanged(CharSequence中,诠释开始,诠释之前,诠释计数){
Log.e(文本,文本[+ S +]); 。adapter.getFilter()过滤(s.toString());
} @覆盖
公共无效beforeTextChanged(CharSequence中,诠释开始,诠释计数,
INT后){ } @覆盖
公共无效afterTextChanged(编辑S){
} });
builder.setTitle(选择你的大学);
builder.setMessage(从列表中选择大学:);
builder.setCancelable(真); builder.setPositiveButton(取消,新DialogInterface.OnClickListener(){
公共无效的onClick(DialogInterface为arg0,ARG1 INT){ }
}); list.setOnItemClickListener(新OnItemClickListener(){
公共无效onItemClick(适配器视图<>母公司,观景,INT位置,长的id){
//随你的便,请 如果(adapter.getItem(位置)的ToString()。等于(collegeData.get(位置).getNameForCollege())
|| adapter.getItem(位置)的ToString()。等于(collegeData.get(位置).getStudentsNameForCollege())){ newCollegeName = adapter.getItem(位置)的ToString(); collegeEditPage.setText(Html.fromHtml((newCollegeName))); // +
//编辑));
//courseEditPage.setText(Html.fromHtml((\"Must选择新课程))); // +
//编辑));
//当然不存在了。
studentObject.setCourseName(NULL);
studentObject.setCollegeName(newCollegeName); 如果(EditYourProfile.this.alertDialog!= NULL){
EditYourProfile.this.alertDialog.dismiss();
//刷新使用的列表。
listOfCollegeCourseNames =新的ArrayList<串GT;();
newCollegeId = collegeData.get(位置).getCollegeUnqId();
studentObject.setCollegeId(newCollegeId);
} } }
}); this.alertDialog = builder.create();
this.alertDialog.setOnShowListener(新OnShowListener(){
@覆盖
公共无效昂秀(DialogInterface对话){
AlertDialog alertDialog =(AlertDialog)对话框;
Button按钮= alertDialog.getButton(DialogInterface.BUTTON_POSITIVE);
button.setTextSize(17);
button.setTypeface(TypeFaceController.titleFace(getApplicationContext()));
}
});
alertDialog.show(); }
ListView的适配器,支持搜索功能:
公共类CustomDialogAdapterBasic扩展ArrayAdapter<串GT;实现可筛选{ 上下文语境;
清单<串GT; valuesComingIn =新的ArrayList<串GT;();
清单<串GT; valuesFiltered =新的ArrayList<串GT;();
私人ItemFilter MFILTER =新ItemFilter();
公共CustomDialogAdapterBasic(上下文的背景下,INT资源列表与LT;弦乐> listComingIn){
超(背景下,资源);
this.context =背景;
this.valuesComingIn = listComingIn;
this.valuesFiltered = listComingIn;
}
公共无效updateBrowser(){
this.notifyDataSetChanged();
} @覆盖
公众诠释的getCount(){
返回valuesFiltered.size();
} 公共字符串的getItem(INT位置)抛出IndexOutOfBoundsException异常{
返回valuesFiltered.get(位置);
} 众长getItemId(INT位置){
返回的位置;
} @覆盖
公共布尔isEnabled(INT位置){
返回true;
} @覆盖
公共查看getView(INT位置,查看convertView,父母的ViewGroup){
LayoutInflater吹气=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
查看rowView = inflater.inflate(R.layout.qustom_layout_list,父母,假);
TextView中的TextView =(TextView中)rowView.findViewById(R.id.basic_text_view); textView.setTypeface(TypeFaceController.generalTextFace(上下文));
textView.setText(的getItem(位置)); 返回rowView;
} 公共过滤用getFilter(){
返回MFILTER;
} 私有类ItemFilter扩展过滤器{
@覆盖
保护FilterResults performFiltering(CharSequence的约束){ 字符串filterString = constraint.toString()与toLowerCase()。
Log.e(filterString,filterString); FilterResults结果=新FilterResults(); 最终名单<串GT;名单= valuesComingIn; 诠释计数=则为list.size();
最终的ArrayList<串GT; NLIST =新的ArrayList<串GT;(计数); 串filterableString; 的for(int i = 0; I<计数;我++){
filterableString = list.get(ⅰ);
如果(filterableString.toLowerCase()。包括(filterString)){
nlist.add(filterableString);
}
} results.values = NLIST;
results.count = nlist.size(); 返回结果;
} @燮pressWarnings(未登记)
@覆盖
保护无效publishResults(CharSequence的约束,FilterResults结果){
valuesFiltered =(ArrayList的<串GT;)results.values;
notifyDataSetChanged();
} }}
列表视图行布局:
< LinearLayout中的xmlns:机器人=http://schemas.android.com/apk/res/android
机器人:layout_width =match_parent
机器人:layout_height =match_parent
机器人:方向=垂直
机器人:descendantFocusability =blocksDescendants> <的TextView
机器人:ID =@ + ID / basic_text_view
机器人:layout_width =WRAP_CONTENT
机器人:layout_height =WRAP_CONTENT
机器人:TEXTSIZE =17sp
机器人:layout_margin =8DP
机器人:文字=TextView的/>< / LinearLayout中>
包含列表视图对话框的布局:
< LinearLayout中的xmlns:机器人=http://schemas.android.com/apk/res/android
机器人:layout_width =match_parent
机器人:layout_height =match_parent
机器人:方向=垂直> < EditText上机器人:ID =@ + ID / inputSearch
机器人:layout_width =FILL_PARENT
机器人:layout_height =WRAP_CONTENT
机器人:提示=搜索院校。
安卓的inputType =textVisiblePassword/>
< ListView控件
机器人:ID =@ + ID / dialog_list_view_friends
机器人:layout_width =match_parent
机器人:layout_height =match_parent
>< /&的ListView GT;< / LinearLayout中>
我在哪里去了?为什么 setOnItemClickListener
搜索后没有工作?
解决方案
试试这个方式来实现clickListener
公共类CustomDialogAdapterBasic扩展ArrayAdapter<串GT;实现可筛选{ 上下文语境;
清单<串GT; valuesComingIn =新的ArrayList<串GT;();
清单<串GT; valuesFiltered =新的ArrayList<串GT;();
私人ItemFilter MFILTER =新ItemFilter();
公共CustomDialogAdapterBasic(上下文的背景下,INT资源列表与LT;弦乐> listComingIn){
超(背景下,资源);
this.context =背景;
this.valuesComingIn = listComingIn;
this.valuesFiltered = listComingIn;
}
公共无效updateBrowser(){
this.notifyDataSetChanged();
} @覆盖
公众诠释的getCount(){
返回valuesFiltered.size();
} 公共字符串的getItem(INT位置)抛出IndexOutOfBoundsException异常{
返回valuesFiltered.get(位置);
} 众长getItemId(INT位置){
返回的位置;
} @覆盖
公共布尔isEnabled(INT位置){
返回true;
} @覆盖
公共查看getView(INT位置,查看convertView,父母的ViewGroup){
LayoutInflater吹气=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
查看rowView = inflater.inflate(R.layout.qustom_layout_list,父母,假);
TextView中的TextView =(TextView中)rowView.findViewById(R.id.basic_text_view); textView.setTypeface(TypeFaceController.generalTextFace(上下文));
textView.setText(的getItem(位置));
textView.setOnClickListener(新侦听器(的getItem(位置)));
返回rowView;
} 公共过滤用getFilter(){
返回MFILTER;
} 类监听实现View.OnClickListener
{
字符串的TextData;
侦听器(字符串的TextData)
{
this.textData =的TextData;
} @覆盖
公共无效的onClick(视图v){
//这里实现你的点击功能,并调用此类活动的任何方法
//((ActivityName)上下文).methodName();
}
} 私有类ItemFilter扩展过滤器{
@覆盖
保护FilterResults performFiltering(CharSequence的约束){ 字符串filterString = constraint.toString()与toLowerCase()。
Log.e(filterString,filterString); FilterResults结果=新FilterResults(); 最终名单<串GT;名单= valuesComingIn; 诠释计数=则为list.size();
最终的ArrayList<串GT; NLIST =新的ArrayList<串GT;(计数); 串filterableString; 的for(int i = 0; I<计数;我++){
filterableString = list.get(ⅰ);
如果(filterableString.toLowerCase()。包括(filterString)){
nlist.add(filterableString);
}
} results.values = NLIST;
results.count = nlist.size(); 返回结果;
} @燮pressWarnings(未登记)
@覆盖
保护无效publishResults(CharSequence的约束,FilterResults结果){
valuesFiltered =(ArrayList的<串GT;)results.values;
notifyDataSetChanged();
} }}
I have a simple listview inside a dialog which has a search function. The search function is working fine, but the list's setOnItemClickListener stops working after a search is performed.
Function to create the listview:
private void showCollegePopUp(){
QustomDialogBuilder builder = new QustomDialogBuilder(EditYourProfile.this);
builder.setDividerColor(ColorController.bright_green);
View v = builder.setCustomView(R.layout.dialog_friend_layout, this);
final ListView list = (ListView) v.findViewById(R.id.dialog_list_view_friends);
LayoutInflater inflater = (LayoutInflater)EditYourProfile.this.getSystemService
(Context.LAYOUT_INFLATER_SERVICE);
footerView = inflater.inflate(R.layout.add_college_list_footer, list, false);
list.addFooterView(footerView);
inputSearch = (EditText)v.findViewById(R.id.inputSearch);
TextView textView = (TextView) v.findViewById(R.id.add_college);
textView.setTypeface(TypeFaceController.generalTextFace(EditYourProfile.this));
LinearLayout footer_linear_layout = (LinearLayout)v.findViewById(R.id.footer_linear_layout);
footer_linear_layout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
alertDialog.dismiss();
Intent i = new Intent(EditYourProfile.this, CreateCollegeActivity.class);
startActivity(i);
}
});
footerView.setVisibility(View.GONE);
if (listOfCollegeCourseNames.size() == 0) {
listOfCollegeCourseNames.add("Grabbing colleges...");
}
adapter = new CustomDialogAdapterBasic(EditYourProfile.this, android.R.id.text1, listOfCollegeCourseNames);
list.setPadding(16, 0, 0, 0);
list.setAdapter(adapter);
inputSearch.addTextChangedListener(new TextWatcher() {
//Event when changed word on EditTex
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
Log.e("Text", "Text [" + s + "]");
adapter.getFilter().filter(s.toString());
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
builder.setTitle("Select your college");
builder.setMessage("Choose College from the list:");
builder.setCancelable(true);
builder.setPositiveButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface arg0, int arg1){
}
});
list.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id){
// Do as you please
if (adapter.getItem(position).toString().equals(collegeData.get(position).getNameForCollege())
|| adapter.getItem(position).toString().equals(collegeData.get(position).getStudentsNameForCollege())) {
newCollegeName = adapter.getItem(position).toString();
collegeEditPage.setText(Html.fromHtml((newCollegeName)));// +
// edit));
//courseEditPage.setText(Html.fromHtml(("Must choose new course")));// +
// edit));
// course doesn't exist anymore.
studentObject.setCourseName(null);
studentObject.setCollegeName(newCollegeName);
if (EditYourProfile.this.alertDialog != null) {
EditYourProfile.this.alertDialog.dismiss();
// Refresh the list used.
listOfCollegeCourseNames = new ArrayList<String>();
newCollegeId = collegeData.get(position).getCollegeUnqId();
studentObject.setCollegeId(newCollegeId);
}
}
}
});
this.alertDialog = builder.create();
this.alertDialog.setOnShowListener(new OnShowListener() {
@Override
public void onShow(DialogInterface dialog){
AlertDialog alertDialog = (AlertDialog) dialog;
Button button = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE);
button.setTextSize(17);
button.setTypeface(TypeFaceController.titleFace(getApplicationContext()));
}
});
alertDialog.show();
}
Listview's adapter that supports search functionality:
public class CustomDialogAdapterBasic extends ArrayAdapter<String> implements Filterable {
Context context;
List<String> valuesComingIn = new ArrayList<String>();
List<String> valuesFiltered = new ArrayList<String>();
private ItemFilter mFilter = new ItemFilter();
public CustomDialogAdapterBasic(Context context, int resource, List<String> listComingIn) {
super(context, resource);
this.context = context;
this.valuesComingIn = listComingIn;
this.valuesFiltered = listComingIn;
}
public void updateBrowser() {
this.notifyDataSetChanged();
}
@Override
public int getCount() {
return valuesFiltered.size();
}
public String getItem(int position) throws IndexOutOfBoundsException {
return valuesFiltered.get(position);
}
public long getItemId(int position) {
return position;
}
@Override
public boolean isEnabled(int position) {
return true;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.qustom_layout_list, parent, false);
TextView textView = (TextView) rowView.findViewById(R.id.basic_text_view);
textView.setTypeface(TypeFaceController.generalTextFace(context));
textView.setText(getItem(position));
return rowView;
}
public Filter getFilter() {
return mFilter;
}
private class ItemFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
String filterString = constraint.toString().toLowerCase();
Log.e("filterString", filterString);
FilterResults results = new FilterResults();
final List<String> list = valuesComingIn;
int count = list.size();
final ArrayList<String> nlist = new ArrayList<String>(count);
String filterableString ;
for (int i = 0; i < count; i++) {
filterableString = list.get(i);
if (filterableString.toLowerCase().contains(filterString)) {
nlist.add(filterableString);
}
}
results.values = nlist;
results.count = nlist.size();
return results;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
valuesFiltered = (ArrayList<String>) results.values;
notifyDataSetChanged();
}
}
}
Listview row layout:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:descendantFocusability="blocksDescendants">
<TextView
android:id="@+id/basic_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="17sp"
android:layout_margin="8dp"
android:text="TextView" />
</LinearLayout>
The layout of the dialog containing listview:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<EditText android:id="@+id/inputSearch"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Search colleges.."
android:inputType="textVisiblePassword"/>
<ListView
android:id="@+id/dialog_list_view_friends"
android:layout_width="match_parent"
android:layout_height="match_parent"
></ListView>
</LinearLayout>
Where am I going wrong? Why is the setOnItemClickListener
not working after search?
解决方案
Try this way to implement clickListener
public class CustomDialogAdapterBasic extends ArrayAdapter<String> implements Filterable {
Context context;
List<String> valuesComingIn = new ArrayList<String>();
List<String> valuesFiltered = new ArrayList<String>();
private ItemFilter mFilter = new ItemFilter();
public CustomDialogAdapterBasic(Context context, int resource, List<String> listComingIn) {
super(context, resource);
this.context = context;
this.valuesComingIn = listComingIn;
this.valuesFiltered = listComingIn;
}
public void updateBrowser() {
this.notifyDataSetChanged();
}
@Override
public int getCount() {
return valuesFiltered.size();
}
public String getItem(int position) throws IndexOutOfBoundsException {
return valuesFiltered.get(position);
}
public long getItemId(int position) {
return position;
}
@Override
public boolean isEnabled(int position) {
return true;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.qustom_layout_list, parent, false);
TextView textView = (TextView) rowView.findViewById(R.id.basic_text_view);
textView.setTypeface(TypeFaceController.generalTextFace(context));
textView.setText(getItem(position));
textView.setOnClickListener(new Listener(getItem(position)));
return rowView;
}
public Filter getFilter() {
return mFilter;
}
class Listener implements View.OnClickListener
{
String textData;
Listener(String textData)
{
this.textData = textData;
}
@Override
public void onClick(View v) {
// Implement your click functionality here and call any method of activity like this
// ((ActivityName)context).methodName();
}
}
private class ItemFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
String filterString = constraint.toString().toLowerCase();
Log.e("filterString", filterString);
FilterResults results = new FilterResults();
final List<String> list = valuesComingIn;
int count = list.size();
final ArrayList<String> nlist = new ArrayList<String>(count);
String filterableString ;
for (int i = 0; i < count; i++) {
filterableString = list.get(i);
if (filterableString.toLowerCase().contains(filterString)) {
nlist.add(filterableString);
}
}
results.values = nlist;
results.count = nlist.size();
return results;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
valuesFiltered = (ArrayList<String>) results.values;
notifyDataSetChanged();
}
}
}
这篇关于执行搜索后的ListView setOnItemClickListener不工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文