我正在尝试创建一个包含editText的listView,当您键入内容时,它会将所有内容过滤到包含用户键入的文本的名称,然后按下它以显示有关此名称的更多信息。过滤器工作正常,但是在onItemClickListener中,每个案例都由它的数字ex定义:
case 0:
....
break;
case 1:
....
break;
case 2:
....
break;
当用户键入内容并且名称被过滤时,例如案例45将变为案例0并且它将打开案例0而不是案例45的信息,那么我怎样才能拥有它们的固定名称,就像在键入按钮的ID时的onClick方法。
由于
我的代码:
final EditText inputSearch = (EditText) view.findViewById(R.id.inputSearch);
list = (GridView) view.findViewById(R.id.gv);
final ArrayAdapter<String> dataAdapter=new ArrayAdapter<String>(getActivity().getBaseContext(),R.layout.gridview_design,R.id.name, heartlessNames);
list.setAdapter(dataAdapter);
inputSearch.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s,int start,int before,int count){
updateText();
}
@Override public void beforeTextChanged(CharSequence s,int start,int count,int after){
updateText();
}
@Override public void afterTextChanged(Editable s){
updateText();
}
private void updateText(){
dataAdapter.getFilter().filter(inputSearch.getText().toString());
}
});
list.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v,
int position, long id) {
switch(position){
case 0:
sp.play(soundId, 1, 1, 0, 0, 1);
startActivity(new Intent(getActivity().getBaseContext(), shadow.class));
getActivity().overridePendingTransition(R.animator.push_left_in, R.animator.push_left_out);
break;
case 1:
sp.play(soundId, 1, 1, 0, 0, 1);
startActivity(new Intent(getActivity().getBaseContext(), soldier_kh2fm.class));
getActivity().overridePendingTransition(R.animator.push_left_in, R.animator.push_left_out);
break;
}
}
});
return view;
}
}
答案 0 :(得分:1)
假设您的活动中有一个ListView,我们将其称为listView
,它可能会设置为类似
private ListView listView;
private MyListAdapter adapter;
public class MainActivity extends Activity{
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(android.R.id.list);
...
}
...
}
在某些时候,您将构建适配器并将其设置为listView(listView.setAdapter(adapter);
)。注意adapter和listView是类变量,所以它们可以在整个类中使用。现在你的listView应该准备好了。您告诉我们,"The filter works fine"
,所以我现在假设您需要管理点击某个项目的处理,这是通过
listView.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
/* THIS IS WHAT YOU WANT TO DO TO GET AN ITEM FROM YOUR LIST */
String data = dataAdapter.getItem(position);
// do what you want with your data String
}
});
将MyDataObject
替换为适配器所从列表中的类型。如您所见,您使用适配器和您单击的位置实际从该位置获取数据。您的列表本身将管理数据位置,您无需这样做。
修改强>
根据您的代码,我会创建一个列表对象,该对象提供您所需的内容,并且仍然允许您的适配器管理所有内容。
public class ListItemObject{
private String data;
private Class clazz;
private int[] soundSettings;
public ListItemObject(String data, Class clazz, int[] soundSettings){
this.data = data;
this.clazz = clazz;
this.soundSettings = soundSettings;
}
// getters and setters
}
然后将ArrayAdapter更改为ArrayAdapter,并在适配器的getView方法中设置值,例如
textView.setText(getItem(position).getData());
这样在onItemClickListener中你可以做到
int[] soundSettings = adapter.getItem(position).getSoundSettings();
sp.play(soundId, soundSettiings[0], soundSettings[1], soundSettings[2],
soundSettings[3], soundSettings[4]);
startActivity(new Intent(getActivity(), adapter.getItem(position).getClazz()));
getActivity().overridePendingTransition(R.animator.push_left_in, R.animator.push_left_out);
适配器/列表视图的想法是以有组织的方式管理您的数据。当你试图控制你,你只是在寻找麻烦。您必须将您的方法/数据与适配器同步,这非常困难。为适配器提供表示数据位置所需的所有数据,然后单击该位置时使用您获得的数据。这就是重点。
答案 1 :(得分:0)
我建议您使用CursorAdapter作为列表的后端。您可以直接使用FilterQueryProvider进行过滤。有一些很好的例子,例如this one。这样的事情是关键:
dataAdapter.setFilterQueryProvider(new FilterQueryProvider() {
public Cursor runQuery(CharSequence constraint) {
return dbHelper.fetchCountriesByName(constraint.toString());
}
});
EditText myFilter = (EditText) findViewById(R.id.myFilter);
myFilter.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {
}
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
public void onTextChanged(CharSequence s, int start,
int before, int count) {
dataAdapter.getFilter().filter(s.toString());
}
});
然后你的dbHelper将根据名称进行过滤,根据需要通过这种语法。