Java ListAdapter在将数组类型更改为int后拒绝应用程序
将我的列表项的数组类型更改为“int”后,我的列表适配器拒绝应用它。我怎样才能解决这个问题 ListData.javaJava ListAdapter在将数组类型更改为int后拒绝应用程序,java,android,arrays,android-listview,android-listfragment,Java,Android,Arrays,Android Listview,Android Listfragment,将我的列表项的数组类型更改为“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},
public class ListData {
public static final String[][] items = {
{R.string.america,R.string.america_description},
{R.string.europe, R.string.europe_description},
};
}
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();
}
}
}
}
在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 ListData {
public static final String[][] items = {
{R.string.america,R.string.america_description},
{R.string.europe, R.string.europe_description},
};
}
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扩展BaseAdapter实现可过滤{
私有列表数据;
私人名单;
私人停车场;
私有项目过滤器;
公共ItemListAdapter(列表数据、上下文){
mData=数据;
mFilteredData=数据;
mInflater=(LayoutInflater)context.getSystemService(context.LAYOUT\u充气机\u服务);
}
@凌驾
public int getCount(){
返回mFilteredData.size();
}
@凌驾
公共字符串getItem(int位置){
返回mFilteredData.get(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
String strItem=mFilteredData.get(位置);
视窗座;
if(convertView==null){
convertView=mInflater.充气(R.layout.item_行,父项,false);
holder=新的ViewHolder();
holder.mTitle=(TextView)convertView.findViewById(R.id.item_title);
holder.mddescription=(TextView)convertView.findViewById(R.id.item_description);
convertView.setTag(支架);
}否则{
holder=(ViewHolder)convertView.getTag();
}
holder.mTitle.setText(strItem);
holder.mDescription.setText(strItem);
返回视图;
}
@凌驾
公共过滤器getFilter(){
if(mFilter==null){
mFilter=newitemfilter();
}
返回过滤器;
}
/**
*视图持有者
*/
静态类视窗夹{
私有文本视图mTitle;
私有文本视图mddescription;
}
/**
*用于筛选列表项的筛选器
*/
私有类ItemFilter扩展了筛选器{
/**
*在后台线程上调用。这是所有筛选器逻辑应该去的地方
*@param constraint要筛选的约束
*@应用约束后返回结果列表
*/
@凌驾
受保护的筛选器结果性能筛选(CharSequence约束){
FilterResults results=新的FilterResults();
if(TextUtils.isEmpty(约束)){
results.count=mData.size();
结果.values=mData;
}否则{
//创建要筛选的新列表
List resultList=new ArrayList();
for(字符串str:mData){
if(str.toLowerCase().contains(constraint.toString().toLowerCase())){
结果列表添加(str);
}
}
results.count=resultList.size();
results.values=结果列表;
}
返回结果;
}
/**
*在ui线程上运行
*@param constraint用于结果的约束
*@param results要显示的结果
*/
@抑制警告(“未选中”)
@凌驾
受保护的void publishResults(CharSequence约束、FilterResults结果){
如果(results.count==0){
notifyDataSetionValidated();
}否则{
mFilteredData=(ArrayList)results.values;
notifyDataSetChanged();
}
}
}
}
您的getData
需要一个字符串[]
,并且您正在提供一个关于int
的矩阵。您应该更改其签名,以便接受int[][]
或更好的int[]
。如果不想更改适配器,请让getData
,将资源的id转换为字符串。例如
public List<String> getData(int[] res) {
ArrayList<String> resStrings = new ArrayList<>();
for (int i : res) {
resStrings.add(getString(i));
}
return resStrings;
}
发布ItemListAdapter的构造函数您的资源是int。但是您的字符串[]是错误的
R.String。america
是int资源。我知道,但我不知道我需要将哪个String
s更改为int
/Integer
看看@您必须更改getData
的实现,在FilterListFragment
中,如果您将ListData.items
从int[][
更改为int[]
,您将使用int[]res
@MacaronLover您可以使用模型类和这些类对象的列表,您可能需要2个文本视图,或者可以使用一个带有附加新行的文本视图。我编辑了我的答案,向您展示了如何使用int[][]。当然,如果像@Raghunandan(谢谢)所建议的那样,使用一个模型类来包装所需的信息会更好。但当然,您必须更改需要上下文的适配器。如果在活动中使用ActivityName.this
或在片段中使用getActivity()