onItemClickListener如何为每个项目设置固定名称?

时间:2014-11-10 19:41:29

标签: java android android-listview onitemclicklistener

我正在尝试创建一个包含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;
}
}

2 个答案:

答案 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将根据名称进行过滤,根据需要通过这种语法。