ListViewDragginganimation中的自定义列表视图项

时间:2015-05-08 12:18:13

标签: java android listview android-listview

所以我有一个android项目,我很好地使用了排序功能。我一直在使用DevBytes ListViewDraggingAnimation https://www.youtube.com/watch?v=_BZIvjMgH-Q

我已经在我的应用和布局中使用它,但仍然存在一个大问题,我无法使用我的自定义ListView项目。 DevBytes代码中的库存商品是普通的TextView

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#FFF"
    android:textSize="@dimen/list_text_size"
    android:gravity="center_vertical"
    android:paddingLeft="15dp"
    android:paddingRight="15dp"
    android:minHeight="@dimen/list_item_height"
    android:textColor="#000000"
/>

我的自定义ListView项目由RelativeLayout组成,其中包含四个TextView。就这样:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="adress"
        android:id="@+id/item_adressView"
        android:layout_alignParentTop="true"
        android:layout_toEndOf="@+id/item_driveTypeView"
        android:textSize="15dp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="postnr, ort"
        android:id="@+id/item_zipcodePlaceView"
        android:textSize="15dp"
        android:layout_below="@+id/item_adressView"
        android:layout_toEndOf="@+id/item_driveTypeView" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="företag"
        android:id="@+id/item_companyView"
        android:textSize="15dp"
        android:layout_below="@+id/item_zipcodePlaceView"
        android:layout_toEndOf="@+id/item_driveTypeView" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="P1"
        android:id="@+id/item_driveTypeView"
        android:textSize="40dp"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true" />
</RelativeLayout>

诚然,我不太了解数据结构。我在更改它以接受我的物品时所做的每一次尝试都使程序崩溃。我担心在某些尝试中我已经更改了代码的更多部分。有人可以帮我指出我需要更改的代码部分,以便让ListView接受我的自定义项吗?

发布所有java代码会使我的帖子超出字符数限制。

代码可以在这里找到: http://developer.android.com/shareables/devbytes/ListViewDraggingAnimation.zip

3 个答案:

答案 0 :(得分:1)

如果要将数据绑定到多个视图(除了简单的TextView之外),则需要更改适配器。阅读ArrayAdapter reference以了解这些适配器的工作原理。

基本上,构造函数需要接受复杂的数据结构,然后需要覆盖getView()以将数据绑定到多个视图。使用DevBytes示例,尝试这样的事情:

// Update the adapter to use string arrays instead of just strings
public class StableArrayAdapter extends ArrayAdapter<String[]> {

    final int INVALID_ID = -1;
    HashMap<String, Integer> mIdMap = new HashMap<String, Integer>();

    // Save these references to the layout and string data
    int mRowLayout;
    List<String[]> mStrings;

    // Constructor should accept string arrays
    public StableArrayAdapter(Context context, int rowLayout, List<String[]> objects) {

        super(context, rowLayout, objects);

        // Change this so your string array list can be indexed
        for (int i = 0; i < objects.size(); ++i) {

            // Make sure you are using a unique string for each list row
            // String[0] is just an example
            String[] stringArray = objects.get(i);
            String uniqueString = stringArray[0]; 

            mIdMap.put(uniqueString, i);
        }

        mRowLayout = rowLayout;
        mStrings = objects;
    }

    ...

    // Populate your layout text views with data from your string array
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        convertView = LayoutInflater.from(getContext()).inflate(mRowLayout, null);

        TextView tvAddress = (TextView)convertView.findViewById(R.id.item_adressView);
        TextView tvZipCode = (TextView)convertView.findViewById(R.id.item_zipcodePlaceView);
        TextView tvCompany = (TextView)convertView.findViewById(R.id.item_companyView);
        TextView tvDriveType = (TextView)convertView.findViewById(R.id.item_driveTypeView);

        tvAddress.setText(mStrings.get(position)[0]);
        tvZipCode.setText(mStrings.get(position)[1]);
        tvCompany.setText(mStrings.get(position)[2]);
        tvDriveType.setText(mStrings.get(position)[3]);

        return convertView;
    }
}

在您的活动中,只需使用您的布局xml文件和字符串数组加载适配器,如下所示:

StableArrayAdapter adapter = new StableArrayAdapter(this, R.layout.list_row, mStringsList);

我没有测试过代码,但应该可以使用。我最近用过类似的东西。此外,您可以在互联网上找到有关如何制作自定义适配器的几个教程。这是一个很好的结账:Using an ArrayAdapter with ListView

答案 1 :(得分:0)

首先让我们调试当前的问题并希望修复运行时错误&#34; java.lang.ClassCastException :android.widget.RelativeLayout无法强制转换为android.widget。的TextView&#34 ;.

使用您的设计,在布局中只创建一个Textview UI,如:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="adress"
        android:id="@+id/item_adressView"
        android:layout_alignParentTop="true"
        android:layout_toEndOf="@+id/item_driveTypeView"
        android:textSize="15dp" />
</RelativeLayout>
祝你好运......

EDIT1 :在logcat消息中:

com.example.android.listviewdragginganimation E / ArrayAdapter:  您必须为TextView提供资源ID

com.example.android.listviewdragginganimation E / AndroidRuntime:致命异常:主要      处理:com.example.android.listviewdragginganimation,PID:1830

java.lang.IllegalStateException:ArrayAdapter要求资源ID为TextView 在android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:386)  ...

备注

  • 最大的提示是&#34;您必须为TextView提供资源ID ...&#34;。在您的布局中,现在只提供1个TextView。我上面已经举了一个例子。试一试,看看会发生什么。
  • 完成此修复后,您可以在布局中添加更多TextView。但是您必须指定特定的Textview。

答案 2 :(得分:0)

有一个第三方库可以为您完成此操作,只需要低估并以我们想要的方式实现,只需在尝试其他任何内容之前尝试this