我有一个列表视图,其中包含来自数据库的大约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>
这是我的自定义适配器文件
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;
}
}
答案 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;
}
请查看以下有关自定义适配器的教程:
答案 1 :(得分:1)
答案 2 :(得分:0)
获取ListView的适配器实例,然后尝试调用getItem(http://developer.android.com/reference/android/widget/Adapter.html#getItem%28int%29)