2012-07-17 82 views
5

我是Android开发新手,遇到了难以解决的问题。我想弄清楚如何正确使用AutoCompleteTextView小部件。我想创建一个AutoCompleteTextView,使用来自Web服务的XML数据。我设法让它起作用,但我对这个输出感到不满意。如何获得AutoCompleteTextView适配器的正确ID

我想将id =>名称对的HashMap放到AutoCompleteTextView中,并获取点击项目的ID。当我点击自动完成过滤设置输出时,我想填充自动完成框下面的列表,我也设法开始工作。

迄今所做的:

  • 自动完成行之有效的简单ArrayList,所有的数据过滤 正确
  • onItemClick事件触发正确点击
  • parent.getItemAtPosition(position)返回正确的点击项目String 表示之后

前夕nt onItemClick(AdapterView parent, View v, int position, long id)不符合我的意愿。我怎样才能找出被点击项目的未经过滤的数组位置?将过滤的位置是一个我没兴趣

的其他问题:

  • 如何处理HashMapsCollectionsAutoCompleteTextView
  • 如何得到正确的itemIdonItemClick事件

我在这个问题上做了非常广泛的研究,但没有找到任何有价值的信息可以回答我的问题。

+0

请帮助我的朋友 – sarath 2012-07-18 04:06:36

+0

海的朋友,我试图解决这个问题,但不能......我wonder.Why没有从Android老虎的解决方案??? – 2012-07-20 12:27:51

回答

13

事件onItemClick(AdapterView父,视图v,int位置,长 id)不符合我的意愿。

这是筛选适配器时的正常情况。尽管适配器从其视角保留了对初始未过滤数据的引用,但它有一组基于其的数据(不管是最初的还是由过滤器操作产生的)。但是这不应该引起任何问题。使用默认的sdk适配器(或使用子类),在onItemClick()中,获取适配器所基于的当前列表的position。然后,您可以使用getItem()获取该数据项目position(同样,初始或过滤无关紧要)。

String data = getItem(position); 
int realPosition = list.indexOf(data); // if you want to know the unfiltered position 

这会为表工作,Maps(假设你使用SimpleAdapter)。对于Maps,您始终可以选择添加一个附加密钥来设置初始列表中的未过滤位置。

如果您将自己的适配器与AutoCompleteTextView一起使用,则可以使onItemClick()为您提供正确的id(但您无法更改该位置)。

public class SpecialAutoComplete extends AutoCompleteTextView { 

    public SpecialAutoComplete(Context context) { 
     super(context); 
    } 

    @Override 
    public void onFilterComplete(int count) { 
     // this will be called when the adapter finished the filter 
     // operation and it notifies the AutoCompleteTextView 
     long[] realIds = new long[count]; // this will hold the real ids from our maps 
     for (int i = 0; i < count; i++) { 
      final HashMap<String, String> item = (HashMap<String, String>) getAdapter() 
        .getItem(i); 
      realIds[i] = Long.valueOf(item.get("id")); // get the ids from the filtered items 
     } 
     // update the adapter with the real ids so it has the proper data 
     ((SimpleAdapterExtension) getAdapter()).setRealIds(realIds); 
     super.onFilterComplete(count); 
    } 


} 

和适配器:

public class SimpleAdapterExtension extends SimpleAdapter { 

    private List<? extends Map<String, String>> mData; 
    private long[] mCurrentIds; 

    public SimpleAdapterExtension(Context context, 
      List<? extends Map<String, String>> data, int resource, 
      String[] from, int[] to) { 
     super(context, data, resource, from, to); 
     mData = data; 
    } 

    @Override 
    public long getItemId(int position) {  
     // this will be used to get the id provided to the onItemClick callback 
     return mCurrentIds[position]; 
    } 

    @Override 
    public boolean hasStableIds() { 
     return true; 
    } 

    public void setRealIds(long[] realIds) { 
     mCurrentIds = realIds; 
    } 

} 

如果您还实现Filter类适配器,那么你可以得到从那里的ID,而无需重写AutoCompleTextView类。

1

使用Luksprog方法,我对ArrayAdapter做了一些类似的处理。

public class SimpleAutoCompleteAdapter extends ArrayAdapter<String>{ 
     private String[] mData; 
     private int[] mCurrentIds; 

     public SimpleAutoCompleteAdapter(Context context, int textViewResourceId, 
      String[] objects) { 
      super(context, textViewResourceId, objects); 
      mData=objects; 
     } 

     @Override 
     public long getItemId(int position) { 
      String data = getItem(position); 
      int index = Arrays.asList(mData).indexOf(data); 
      /* 
      * Atention , if your list has more that one same String , you have to improve here 
      */ 
      // this will be used to get the id provided to the onItemClick callback 
      if (index>0) 
       return (long)mCurrentIds[index]; 
      else return 0; 
     } 

     @Override 
     public boolean hasStableIds() { 
      return true; 
     } 

     public void setRealIds(int[] realIds) { 
      mCurrentIds = realIds; 
     } 

    } 
2

为AutoCompleteTextView实施onItemClickListener,然后用你的清单上的indexOf找到所选项目的索引。

actvCity.setOnItemClickListener(new OnItemClickListener() { 

    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
      long arg3) { 
      int index = cityNames.indexOf(actvCity.getText().toString()); 
      // Do Whatever you want to do ;) 
    } 
}); 
0

首先添加数据到自定义的ArrayList现在

// mList used for adding custom data into your model 
     private List<OutletListSRModel> mList = new ArrayList<>(); 
     // listdata used for adding string data for auto completing. 
     ArrayList<String> listdata = new ArrayList<String>(); 
     for (int i = 0; i < JArray.length(); i++) { 
      JSONObject responseJson = JArray.getJSONObject(i); 
      OutletListSRModel mModel = new OutletListSRModel(); 
      mModel.setId(responseJson.getString("id")); 
      mModel.name(responseJson.getString("outlet_name")); 
      listdata.add(responseJson.getString("outlet_name")); 
     } 

    ArrayAdapter adapter = new 
          ArrayAdapter(getActivity(), 
android.R.layout.simple_list_item_1, listdata); 
    searchOutletKey.setAdapter(adapter); 

用于获取从模型我们在上面添加任何价值。我们可以得到这样的结果。

searchOutletKey.setOnItemClickListener (new AdapterView.OnItemClickListener () { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       String txtOutletId = mOutletListSRModel.get(position).getId(); 
      } 
     }); 
相关问题