java - onItemClickListener如何让每个item有一个固定的名称?

标签 java android android-listview onitemclicklistener

我正在尝试创建一个具有 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/

相关文章:

java - 在java中没有for循环将数组拆分为两部分

java - 为什么我会使用 list.clear()

android - Listview 与 ToolBar 重叠

android - 如何从 ListView 获取数据到上下文菜单?

java - 读取前刷新/清除 System.in (stdin)

java - 我的 bash 脚本锁定文件,而 Java 需要读取它

Android 模拟器不在 Virtualbox Ubuntu 实例中启动

android - kotlin 和 ArgumentCaptor - IllegalStateException

java - 在 Android 和 iOS 中本地使用 krpano 的问题

Android ListView 类似于 iOS UITableView