我正在尝试创建一个具有 editText 的 listView,当您输入某些内容时,它会将所有内容过滤到包含用户输入的文本的名称,然后按它以显示有关该名称的更多信息。过滤器工作正常,但 onItemClickListener 中的每个案例都是由它的数字定义的,例如:
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;
}
}
最佳答案
假设您的 Activity 中有一个 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 应该已准备就绪。您已经告诉我们,“过滤器工作正常”
,所以我假设此时您只需要管理对某个项目的点击处理,这是通过
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);
适配器/ ListView 的想法是以有组织的方式管理数据。当你试图控制它时,你只是自找麻烦。您必须将您的方法/数据与适配器同步,这是非常困难的。为您的适配器提供表示该数据位置可能需要的所有数据,然后当您单击该位置时使用您获得的数据。这就是重点。
关于java - onItemClickListener如何让每个item有一个固定的名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26851689/