Android ::如何读取列表视图中不可见的子元素?

时间:2011-04-12 07:38:00

标签: android android-emulator android-listview

我有一个列表视图,其中包含来自数据库的大约20个奇数项以及两个按钮和一个额外的TextView作为线性布局中的计数器。这两个按钮通常用于增加和减少额外TextView中的值。我想要的是当我按下listView之外的按钮时应该获取所有项目以及额外文本的值。现在我可以获取线性布局和屏幕上可见的子项目,即屏幕上可以看到20个项目10,所以我的问题是如何获取剩余项目以及线性布局中包含的额外Textview值,这些值是不可见的我们滚动列表视图时可以查看?

这是main.xml文件

   <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation= "horizontal"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:background="#CBCBCB">

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/widget64"
android:background="@drawable/toolbar_color"
android:layout_x="0px"
android:layout_y="0px"
android:layout_width="match_parent" android:layout_height="40dip">
    <Button
    android:id="@+id/save_creature_for_encounter"
    android:layout_marginTop="5px"
    android:textSize="10dip"
    android:textColor="#ffffff"
    android:textStyle="bold"
    android:layout_centerVertical="true"
    android:layout_alignParentRight="true"
    android:background="@drawable/onclick_button_bg" 
    android:layout_width="40dip" android:layout_height="50dip"
    android:text="Save"/>

    <Button
    android:id="@+id/back_show_encounter"
    android:layout_width="80dip"
    android:layout_marginTop="5px"
    android:text="Cancel"
    android:textSize="10dip"
    android:textColor="#ffffff"
    android:textStyle="bold"
    android:layout_centerVertical="true"
    android:layout_alignParentLeft="true"
    android:background="@drawable/button_color"
    android:layout_height="50dip">
    </Button>
  </RelativeLayout>

        <ListView 
    android:id="@+id/list_view"
    android:background="#ffffff"
        android:fadingEdge="none"
        android:cacheColorHint="#ffffff"
        android:layout_weight="1" 
               android:layout_gravity="center"    
              android:scrollbars="vertical"
     android:layout_marginTop="28dip" android:layout_width="fill_parent"
      android:layout_height="fill_parent"/>  
      </FrameLayout>

这是我的custom_list.xml文件

        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:gravity="left|center"
        android:paddingBottom="5px"
        android:paddingTop="5px" android:paddingLeft="5px" android:layout_width="wrap_content" android:layout_height="wrap_content">
        <TextView android:text="test" android:id="@+id/item_creatures_to_encounter"
        android:layout_marginLeft="10px" android:layout_width="180dip" android:layout_height="wrap_content"></TextView>
        <Button
                android:id="@+id/desc"
                android:layout_width="30px"
                android:layout_height="30px"
                android:layout_marginTop="5px"
                android:text="-"
                android:textSize="10dip"
                android:textColor="#ffffff"
                android:textStyle="bold"
                android:layout_alignTop="@+id/widget66"
                android:layout_alignParentRight="true"
                android:onClick="myDescClickHandler">
                >
                </Button>
        <Button
                android:id="@+id/asc"
                android:layout_width="30px"
                android:layout_height="30px"
                android:layout_marginTop="5px"
                android:text="+"
                android:textSize="10dip"
                android:textColor="#ffffff"
                android:textStyle="bold"
                android:layout_alignTop="@+id/widget66"
                android:layout_alignParentRight="true"
                android:onClick="myAscClickHandler">

                >
                </Button>

                <TextView android:text="@string/counter" android:id="@+id/counter"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dip" android:layout_width="30dip"></TextView>
        </LinearLayout>

enter image description here

这是我的自定义适配器文件

   public class DomainAdapter extends SimpleCursorAdapter{

    private LayoutInflater mInflater;


    public DomainAdapter(Context context, int layout, Cursor c, String[] from, int[] to) {
        super(context, layout, c, from, to);
        mInflater = LayoutInflater.from(context);
    }

    public View getView(int position, View convertView, ViewGroup parent, Cursor data) {
        // A ViewHolder keeps references to children views to avoid unneccessary calls
        // to findViewById() on each row.
        //final ViewHolder holder;
        View row = super.getView(position, convertView, parent);
        ViewHolder holder=(ViewHolder)row.getTag();
        if (holder == null) {
            holder = new ViewHolder(row);
            row.setTag(holder);
            holder.add = (Button) row.findViewById(R.id.asc);
            Button.OnClickListener b = 
                new Button.OnClickListener() {
                public void onClick(View v) {
                    LinearLayout parent = (LinearLayout)v.getParent();
                    TextView label=(TextView)parent.findViewById(R.id.counter);
                    Log.d("AAAAJJJAAA", ""+ parent);
                    CharSequence value = ((TextView) label).getText();
                    int count = Integer.parseInt((String) value);
                     count++;
                     String inc = String.format("%d", count);
                    label.setText(inc);
                    //parent.refreshDrawableState();       
                }
            };
            holder.add.setOnClickListener(b);
        }
        return row;
    }

}

3 个答案:

答案 0 :(得分:2)

可见区域之外的视图不存在。 ListView仅创建屏幕上的视图数量。

滚动时,如果视图消失,则会重新使用该视图。它实际上要求Adapter修改View的参数,它使用修改后的View。

示例:

让view1成为你的第一行(文本是头像的那一行)。当您向下滚动时,“avatar”消失,并在底部显示一个新的。 ListView不再需要view1,因为它不可见。因此它给适配器提供了view1并要求它将view1的参数修改为新行。适配器将view1上的文本设置为下一行(例如“human”)并将其返回到ListView。 ListView将在列表底部显示view1。

基本上,可见区域之外的视图不存在。

您可以做什么:当用户按下+或 - 按钮时,将计数保存到适配器。

然后,您可以询问数据项(listView.getItemAtPosition(int position))并计算这些数据。

此代码示例:

class DataForView {
    int counter;
}

ListView mListView;
...

int sumCounter = 0;
for (int i=0; i<mListView.getCount(); i++) {
  sumCounter += ((DataForView)mListView.getItem(i)).counter;
}

请查看以下有关自定义适配器的教程:

http://commonsware.com/Android/excerpt.pdf

答案 1 :(得分:1)

  1. 列表视图不包含所有子项。滚动时,它仅在运行时创建可见项。
    2。如果你想完全获得所有孩子,那么最好保留你的列表所具有的子对象的ArrayList。您可以根据需要在此ArrayList中添加或删除子项。

答案 2 :(得分:0)

获取ListView的适配器实例,然后尝试调用getItem(http://developer.android.com/reference/android/widget/Adapter.html#getItem%28int%29