我正在尝试在ListFragment中添加搜索功能。我在标准的Activity中完成了它,但我试图将它移植到片段上。 我目前正在做的是:
我有一个托管片段的Main.java。
我有一个ListFrag.java,它使用R.id.frag_list
My Main.java实现了addTextChangedListener,如下所示:
et.addTextChangedListener(new TextWatcher()
{
public void afterTextChanged(Editable s)
{
// Abstract Method of TextWatcher Interface.
}
public void beforeTextChanged(CharSequence s,
int start, int count, int after)
{
// Abstract Method of TextWatcher Interface.
}
public void onTextChanged(CharSequence s,
int start, int before, int count)
{
textlength = et.getText().length();
array_sort.clear();
for (int i = 0; i < List.TERM.length; i++)
{
if (textlength <= List.TERM[i].length())
{
if(et.getText().toString().equalsIgnoreCase(
(String)
List.TERM[i].subSequence(0,
textlength)))
{array_sort.add(List.TERM[i]);
}
}
}
lv.setAdapter(new ArrayAdapter<String>
(Main.this,
R.layout.main,R.id.frag_list, array_sort));
}
});
我的main.xml是这样的:
<LinearLayout
android:layout_width="fill_parent"
android:background="@drawable/searchbar"
android:layout_height="60dp"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
>
<EditText android:id="@+id/EditText01"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:hint="@string/prompt">
</EditText>
</LinearLayout>
<fragment
android:id="@+id/frag_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="50dp"
android:layout_marginTop="90dp"
android:layout_marginBottom="40dp"
class="com.bernard.ListFrag" />
当我运行应用程序时,我单击editText。我尝试输入一个字母的那一刻,应用程序崩溃了错误日志:
08-11 12:59:57.090: E/AndroidRuntime(20220): FATAL EXCEPTION: main
08-11 12:59:57.090: E/AndroidRuntime(20220): java.lang.NullPointerException
08-11 12:59:57.090: E/AndroidRuntime(20220): at com.bernard.Main$1.onTextChanged(Main.java:54)
08-11 12:59:57.090: E/AndroidRuntime(20220): at android.widget.TextView.sendOnTextChanged(TextView.java:8105)
08-11 12:59:57.090: E/AndroidRuntime(20220): at android.widget.TextView.handleTextChanged(TextView.java:8152)
08-11 12:59:57.090: E/AndroidRuntime(20220): at android.widget.TextView$ChangeWatcher.onTextChanged(TextView.java:8532)
08-11 12:59:57.090: E/AndroidRuntime(20220): at android.text.SpannableStringBuilder.sendTextChange(SpannableStringBuilder.java:892)
08-11 12:59:57.090: E/AndroidRuntime(20220): at android.text.SpannableStringBuilder.change(SpannableStringBuilder.java:352)
08-11 12:59:57.090: E/AndroidRuntime(20220): at android.text.SpannableStringBuilder.change(SpannableStringBuilder.java:266)
08-11 12:59:57.090: E/AndroidRuntime(20220): at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:443)
08-11 12:59:57.090: E/AndroidRuntime(20220): at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:420)
08-11 12:59:57.090: E/AndroidRuntime(20220): at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:29)
08-11 12:59:57.090: E/AndroidRuntime(20220): at android.view.inputmethod.BaseInputConnection.replaceText(BaseInputConnection.java:669)
08-11 12:59:57.090: E/AndroidRuntime(20220): at android.view.inputmethod.BaseInputConnection.setComposingText(BaseInputConnection.java:431)
08-11 12:59:57.090: E/AndroidRuntime(20220): at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:369)
08-11 12:59:57.090: E/AndroidRuntime(20220): at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:85)
08-11 12:59:57.090: E/AndroidRuntime(20220): at android.os.Handler.dispatchMessage(Handler.java:99)
08-11 12:59:57.090: E/AndroidRuntime(20220): at android.os.Looper.loop(Looper.java:156)
08-11 12:59:57.090: E/AndroidRuntime(20220): at android.app.ActivityThread.main(ActivityThread.java:5025)
08-11 12:59:57.090: E/AndroidRuntime(20220): at java.lang.reflect.Method.invokeNative(Native Method)
08-11 12:59:57.090: E/AndroidRuntime(20220): at java.lang.reflect.Method.invoke(Method.java:511)
08-11 12:59:57.090: E/AndroidRuntime(20220): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
08-11 12:59:57.090: E/AndroidRuntime(20220): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
08-11 12:59:57.090: E/AndroidRuntime(20220): at dalvik.system.NativeStart.main(Native Method)
我对这种错误的猜测是:
有人有建议解决此问题吗?谢谢:))
答案 0 :(得分:0)
尝试更换:
for (int i = 0; i < List.TERM.length; i++)
{
if (textlength <= List.TERM[i].length())
{
if(et.getText().toString().equalsIgnoreCase(
(String)
List.TERM[i].subSequence(0,
textlength)))
{array_sort.add(List.TERM[i]);
}
}
}
lv.setAdapter(new ArrayAdapter<String>
(Main.this,
R.layout.main,R.id.frag_list, array_sort));
}
});
使用:
// reuse the existing adapter instead of creating a new one:
ArrayAdapter<String> ad = (ArrayAdapter<String>) getListView().getAdapter();
ad.clear();
for (int i = 0; i < List.TERM.length; i++) {
if (textlength <= List.TERM[i].length()) {
if (et.getText().toString().equalsIgnoreCase(
(String)
List.TERM[i].subSequence(0,
textlength))) {
ad.add(List.TERM[i]);
}
}
}
ad.notifyDataSetChanged(); // tell the ListView to update
答案 1 :(得分:0)
自己找出怎么做!谢谢尼克的帮助:D
这有点粗糙,但它确实有效。如果您认为自己有更好的解决方案,请分享!
所以我所做的是根据http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity
中的示例创建一个列表片段视图片段视图诀窍是,在ListFrag.java中,我只是在onCreateView下的原始活动中实现了所有内容。 重要的部分如下:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
final View V = inflater.inflate(R.layout.list_fragment, container, false);
lv = (ListView) V.findViewById(R.id.ListView01);
final ArrayList <String>ar = new ArrayList<String>();
et = (EditText) V.findViewById(R.id.EditText01);
final String[] words = list.TERM;
// Populate list with our static array of titles.
lv.setAdapter(new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_activated_1, list.TERM));
lv.setTextFilterEnabled(true);
et.addTextChangedListener(new TextWatcher()
{
public void afterTextChanged(Editable s)
{
// Abstract Method of TextWatcher Interface.
}
public void beforeTextChanged(CharSequence s,
int start, int count, int after)
{
// Abstract Method of TextWatcher Interface.
}
public void onTextChanged(CharSequence s,
int start, int before, int count)
{
textlength = et.getText().length();
array_sort.clear();
for (int i = 0; i < words.length; i++)
{
if (textlength <= words[i].length())
{
if(et.getText().toString().equalsIgnoreCase(
(String)
words[i].subSequence(0,
textlength)))
{array_sort.add(words[i]);
}
}
}
lv.setAdapter(new ArrayAdapter<String>
(getActivity(),
android.R.layout.simple_list_item_activated_1, array_sort));
}
});
//Intent after selection is made
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
String name = lv.getItemAtPosition(position).toString();
for (int index = 0; index < words.length; index++)
{
if (name.equals(words[index]))
{
position = index;
break;
}
}
String d1 = words[position];
ar.add(d1.toString());
showDetails(position);
}
});
return V;
}
你有它,在片段里面的列表视图上完全搜索。