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 资源。 我知道但我不知道我需要将哪个Strings 更改为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.itemsint[][] 更改为 int[],而不是 String[] res,则会使用 int[] res @MacaronLover 你可以使用模型类和这些类对象的列表,你可能想要2个文本视图,或者你可以使用一个附加新行.. 我编辑了我的答案,向您展示如何使用 int[][]。当然,如果您使用 Model 类来包装您需要的信息,那会更好,正如@Raghunandan (thanks) 所建议的那样。但当然,您必须更改适配器。 @MacaronLover 需要上下文。如果在活动中使用ActivityName.this 或在片段中使用getActivity()

以上是关于ListAdapter 在将数组类型更改为 int 后拒绝应用程序的主要内容,如果未能解决你的问题,请参考以下文章

使用 ListAdapter 将项目添加到 ListView

当属性类型可能从 Int 更改为 String 时,如何使用 Decodable 协议解析 JSON?

将主键 int 类型更改为串行

将带有数字的列的类型从 varchar 更改为 int

将数据类型从int更改为time会导致现有值出错

Sequelize:将列类型更改为 ENUM