【问题标题】:onItemClickListener how to have a fixed name for each item?onItemClickListener 如何为每个项目设置一个固定名称?
【发布时间】:2014-11-10 19:41:29
【问题描述】:

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

【问题讨论】:

  • 这并不是真正应该如何使用 onItemClicked。您应该将 onItemClicked 与您的适配器一起使用以获取该位置的项目并以这种方式使用它的数据。
  • @zgc7009 好的,但是如何在适配器中设置?
  • 我对这个问题有点困惑,但知道您可能应该使用适配器 getItem(int position) 方法来处理它。所以你正在搜索和过滤你的列表?当您过滤时,您的列表会适当更新吗?如果是这样,您的列表/适配器此时应该可以使用了。
  • @zgc7009 你能告诉我如何使用getItem(int position)方法
  • getItem(int position) 将返回该位置的列表视图中表示的项目。如果您使用 getItem(0) 它将返回列表中的第一项

标签: java android android-listview onitemclicklistener


【解决方案1】:

假设您的 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 应该准备好了。你已经告诉我们了,"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);

适配器/列表视图的想法是以有组织的方式管理您的数据。当你试图控制它时,你只是在自找麻烦。您必须将您的方法/数据与您的适配器同步,这非常困难。给你适配器它可能需要代表那个数据位置的所有数据,然后当你点击那个位置时使用你得到的数据。这就是重点。

【讨论】:

  • 我不确定我是否理解,如果我添加我的代码并且你告诉我该怎么做会有所帮助:)
  • @youssefabaza 看看我的 onItemClick 方法,看看你的。您只需添加我拥有的行并删除您的 switch 语句。
  • 所以我应该删除这行“switch(position)”并添加这个“String data = dataAdapter.getItem(position);”
  • @youssefabaza 是的。我认为您不了解 onItemClick 的工作原理。您将其视为 onClick,但事实并非如此。 onItemClick 方法已经为您提供了一个项目在适配器中的位置,没有理由试图弄清楚适配器如何管理位置本身,它就在那里。
  • 我在每种情况下都有一个错误“此行有多个标记 - 令牌“case”上的语法错误,断言预期 - 类型不匹配:无法从 int 转换为 boolean”
【解决方案2】:

我建议您使用 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 将通过此语法根据需要根据名称进行过滤。

【讨论】:

  • 这取决于一个数据库和一个游标。
  • 您可以使用 CursorLoader 来输入数据,但坦率地说,您的项目似乎无论如何都可以从数据库中受益。
  • 除了制作数据库和游标之外没有别的方法
  • @PearsonArtPhoto 不是我的项目,只是指出他没有数据库(通常使用游标)或他正在使用的游标,因此 CursorAdapter 将涉及修改他的代码.
猜你喜欢
  • 1970-01-01
  • 2012-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-05
  • 1970-01-01
  • 2022-12-14
  • 1970-01-01
相关资源
最近更新 更多