【问题标题】:Android Custom ArrayAdapterAndroid 自定义 ArrayAdapter
【发布时间】:2015-05-10 00:07:28
【问题描述】:

我已经用谷歌搜索了如何制作自定义数组,但我一直无法找到解释我想要实现的目标的教程。我已经尝试转换包含添加图像和文本视图的教程,但是在将“图像”转换/替换为另一个文本视图的某个地方,代码会变得很糟糕。我很难找出问题所在,因为我不知道更改某件事是否会影响自定义适配器所需的其他依赖项。

无论如何,关于我的问题:有人愿意编写一个非常、非常、非常、通用、直接且简单的自定义 ArrayAdapter,它需要两个字符串值,可以与 ListView 一起使用吗? ...或者,尝试调试我的尝试并希望发现我的问题。

感谢您的帮助,谢谢。

我已经包含了我知道是必需的代码,但我一直在删除其他所有内容。

custom_listview.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
     tools:context=".LoginActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:text="Please wait.."
        android:layout_weight="1"
        android:id="@+id/txtFieldName" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:text="Please wait.."
        android:id="@+id/txtFieldValue" />
</LinearLayout>

CustomListViewAdapter.java

public class CustomListViewAdapter extends ArrayAdapter<String> {
    private final Context context;
    private final String[] fieldNames;
    private final String[] fieldValues;


    public CustomListViewAdapter(Context context, String[] fieldNames, String[] fieldValues) {
        super(context, R.layout.custom_listview, fieldNames, fieldValues);
        this.context = context;
        this.fieldNames = fieldNames;
        this.fieldValues= fieldValues;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View rowView = inflater.inflate(R.layout.custom_listview, parent, false);
        TextView txtField= (TextView) rowView.findViewById(R.id.txtFieldName);
        TextView txtValue= (TextView) rowView.findViewById(R.id.txtFieldValue);
        txtField.setText(fieldNames[position]);
        txtValue.setText(fieldValues[position]);

        return rowView;
    }
}

MainActivity.java

public class MainActivity extends ListActivity {


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setListAdapter(new CustomListViewAdapter(this, "myTestField", "myTestValue"));

    }


}

我收到的错误消息:

错误:(20, 9) 错误: 没有找到合适的构造函数 ArrayAdapter(Context,int,String[],String[]) 构造函数 ArrayAdapter.ArrayAdapter(Context,int,int,List) 不是 适用(实际参数 String[] 不能通过以下方式转换为 int 方法调用转换)构造函数 ArrayAdapter.ArrayAdapter(Context,int,List) 不适用 (实际参数列表和形式参数列表的长度不同)构造函数 ArrayAdapter.ArrayAdapter(Context,int,int,String[]) 不适用 (实参String[]不能通过方法转换为int 调用转换)构造函数 ArrayAdapter.ArrayAdapter(Context,int,String[]) 不适用 (实际参数列表和形式参数列表的长度不同)构造函数 ArrayAdapter.ArrayAdapter(Context,int,int) 不适用(实际 和形式参数列表的长度不同)构造函数 ArrayAdapter.ArrayAdapter(Context,int) 不适用(实际和 形式参数列表的长度不同)

【问题讨论】:

    标签: android listview custom-adapter


    【解决方案1】:

    你得到的错误是因为你在你的构造函数上调用super(context, R.layout.custom_listview, fieldNames, fieldValues);,而没有这样的构造函数接受两个String[]参数可用于ArrayAdapter类。

    您应该查看ArrayAdapter here 的文档并找到一个合适的构造函数以在您的子类中使用。例如:

    public CustomListViewAdapter(Context context, String[] fieldNames, String[] fieldValues) {
            super(context, R.layout.custom_listview);
            ...
        }
    

    编辑: Here 是关于 ListViewArrayAdapters 的一个很好的教程。

    【讨论】:

    • 我不得不玩了一段时间,但构造函数文档帮助我找出了为什么我的代码构建没有错误,但没有显示列表视图内容。因此,当您匹配给定构造函数的字段时,是否会自动包含其余对象?超级(上下文,R.layout.custom_listview,fieldNames);
    【解决方案2】:

    我建议您扩展 BaseAdapter 而不是 ArrayAdapter,这是一篇关于编写适配器时的良好做法的精彩文章:http://www.piwai.info/android-adapter-good-practices/

    它基本上涵盖了创建适配器时所需的所有内容。

    【讨论】:

    • 我看了看材料,如果 ArrayAdapter 是 BaseAdapter 的扩展,那听起来我是在重新发明轮子。我将回去阅读文章的其余部分,看看我是否遗漏了一些使 BaseAdapter 优于 ArrayAdapter 的内容。到目前为止,灵活性非常突出。感谢您的参考和建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    相关资源
    最近更新 更多