从Fragment

时间:2016-09-14 19:44:32

标签: android listview android-fragments

我有Fragment正在实施ListView。我在ListView类中有Fragment的全局引用,我想更改ListView方法中updateStep(int position)项的背景颜色。我不想改变列表中每个项目的颜色。我正在片段中进行一些处理,我想相应地更改ListView项的颜色。

我的updateStep方法很简单:

public void updateStep(int position) {
        if(stepsListView != null)
             stepsListView.getChildAt(position).setBackgroundColor(Color.GREEN);    
}

但是getChildAt(position)返回null。获取项目和更新项目颜色的另一种方法是什么。

list_item.xml如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white"
    android:padding="8dp">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textSize="@dimen/standard_text_size"
        android:textColor="@color/gray"
        android:text="@string/about_text_default"
        android:id="@+id/text_list_item">
    </TextView>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textSize="16sp"
        android:textColor="@color/gray"
        android:text="@string/about_text_default"
        android:id="@+id/test_list_item_description">
    </TextView>
</LinearLayout>

并且片段(具有列表)如下所示:

<FrameLayout 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"
    tools:context="com.carmanah.views.fragments.TestListFragment">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:id="@+id/text_heading"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:textColor="@color/gray"
            android:textStyle="bold"
            android:textSize="@dimen/standard_heading_text_size"
            android:text="@string/heading_text_tests">

        </TextView>

        <ListView
            android:id="@+id/task_list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:minHeight="@dimen/standard_text_size"
            android:divider="@color/gray"
            android:dividerHeight="2dip">

        </ListView>
    </LinearLayout>
</FrameLayout>

P.S。我在此列表中使用CustomArrayAdapter

2 个答案:

答案 0 :(得分:1)

您只能从ListView获取可见的视图,因为ListView中的行视图是可重用的。所以,你应该控制项目位置。

以下方法可帮助您获取视图。

public View getViewByPosition(int pos, ListView listView) {
    final int firstListItemPosition = listView.getFirstVisiblePosition();
    final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1;

    if (pos < firstListItemPosition || pos > lastListItemPosition ) {
        return listView.getAdapter().getView(pos, null, listView);
    } else {
        final int childIndex = pos - firstListItemPosition;
        return listView.getChildAt(childIndex);
    }
}

您可以更改项目的背景颜色,如下所示:

public void updateStep(int position) {
        if(stepsListView != null)
             getViewByPosition(position, stepsListView).setBackgroundColor(Color.GREEN);   
}

答案 1 :(得分:0)

获得物品的另一种方式&amp;通过在自定义数组适配器的getView方法中指定颜色来更新颜色。 Juts使相对/线性布局具有所有组件,并使用以下语句指定颜色: -

viewHolder.lin_item.setBackgroundColor(getResources().getColor(R.color.white));

其中lin_item是ViewHolder&amp;中的Liner布局。您可以根据您选择的任何条件指定颜色。

getView方法已经有位置,因此无需担心。