ListAdapter 在将数组类型更改为 int 后拒绝应用程序
Posted
技术标签:
【中文标题】ListAdapter 在将数组类型更改为 int 后拒绝应用程序【英文标题】:ListAdapter refuses application after changing array type to int 【发布时间】:2015-09-06 11:32:00 【问题描述】:将我的列表项的数组类型更改为“int”后,我的列表适配器拒绝应用它。我该如何解决这个问题?
ListData.java
public class ListData
public static final String[][] items =
R.string.america,R.string.america_description,
R.string.europe, R.string.europe_description,
;
在 FilterListFragment.java 中:
private void initialize(View view)
//Set up list view
mAdapter = new ItemListAdapter(getData(ListData.items), getActivity());
ListView lvItems = (ListView) view.findViewById(R.id.lv_items);
lvItems.setAdapter(mAdapter);
(ListData.items)
出现红色下划线,我收到此错误:
FilterListFragment中的(java.lang.string[])不能应用于(int[][])
ItemListadapter.java
public class ItemListAdapter extends BaseAdapter implements Filterable
private List<String> mData;
private List<String> mFilteredData;
private LayoutInflater mInflater;
private ItemFilter mFilter;
public ItemListAdapter (List<String> data, Context context)
mData = data;
mFilteredData = data;
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
@Override
public int getCount()
return mFilteredData.size();
@Override
public String getItem(int position)
return mFilteredData.get(position);
@Override
public long getItemId(int position)
return position;
@Override
public View getView(int position, View convertView, ViewGroup parent)
String strItem = mFilteredData.get(position);
ViewHolder holder;
if (convertView == null)
convertView = mInflater.inflate(R.layout.item_row, parent, false);
holder = new ViewHolder();
holder.mTitle = (TextView) convertView.findViewById(R.id.item_title);
holder.mDescription = (TextView) convertView.findViewById(R.id.item_description);
convertView.setTag(holder);
else
holder = (ViewHolder) convertView.getTag();
holder.mTitle.setText(strItem);
holder.mDescription.setText(strItem);
return convertView;
@Override
public Filter getFilter()
if (mFilter == null)
mFilter = new ItemFilter();
return mFilter;
/**
* View holder
*/
static class ViewHolder
private TextView mTitle;
private TextView mDescription;
/**
* Filter for filtering list items
*/
private class ItemFilter extends Filter
/**
* Invoked on a background thread. This is where all the filter logic should go
* @param constraint the constraint to filter on
* @return the resulting list after applying the constraint
*/
@Override
protected FilterResults performFiltering(CharSequence constraint)
FilterResults results = new FilterResults();
if (TextUtils.isEmpty(constraint))
results.count = mData.size();
results.values = mData;
else
//Create a new list to filter on
List<String> resultList = new ArrayList<>();
for (String str : mData)
if (str.toLowerCase().contains(constraint.toString().toLowerCase()))
resultList.add(str);
results.count = resultList.size();
results.values = resultList;
return results;
/**
* Runs on ui thread
* @param constraint the constraint used for the result
* @param results the results to display
*/
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results)
if (results.count == 0)
notifyDataSetInvalidated();
else
mFilteredData = (ArrayList<String>)results.values;
notifyDataSetChanged();
【问题讨论】:
发布ItemListAdapter的构造函数 你的资源是int。但是你有 String[] 这是错误的R.string.america
是一个 int 资源。
我知道但我不知道我需要将哪个String
s 更改为int
/Integer
看看@developer.android.com/guide/topics/resources/…
【参考方案1】:
您的getData
需要String[]
,而您在int
上提供矩阵。您应该更改其签名,以便接受int[][]
或更好的int[]
。如果您不想更改适配器,请让getData
将资源的 id 转换为 String。例如
public List<String> getData(int[] res)
ArrayList<String> resStrings = new ArrayList<>();
for (int i : res)
resStrings.add(getString(i));
return resStrings;
或者如果你想使用int[][]
public List<String> getData(int[][] res)
ArrayList<String> resStrings = new ArrayList<>();
for (int[] i : res)
for (int j : i)
resStrings.add(getString(j));
return resStrings;
【讨论】:
你必须改变getData
的实现,在FilterListFragment
如果您将 ListData.items
从 int[][]
更改为 int[]
,而不是 String[] res
,则会使用 int[] res
@MacaronLover 你可以使用模型类和这些类对象的列表,你可能想要2个文本视图,或者你可以使用一个附加新行..
我编辑了我的答案,向您展示如何使用 int[][]。当然,如果您使用 Model 类来包装您需要的信息,那会更好,正如@Raghunandan (thanks) 所建议的那样。但当然,您必须更改适配器。
@MacaronLover 需要上下文。如果在活动中使用ActivityName.this
或在片段中使用getActivity()
以上是关于ListAdapter 在将数组类型更改为 int 后拒绝应用程序的主要内容,如果未能解决你的问题,请参考以下文章
使用 ListAdapter 将项目添加到 ListView