我有一个列表视图,其中包含来自数据库的约20个奇数项目,以及两个按钮和一个额外的TextView,作为线性布局内包含的计数器。这两个按钮通常用于在一个额外的TextView中递增和递减值。我想要的是当我按下listView之外的按钮时,应该获取所有项目以及额外文本的值。现在,我可以获取线性布局,并且在屏幕上可以看到子项,即屏幕上可以看到20个项目,所以我的问题是如何获取其余项目以及线性布局中包含的不可见的其他Textview值,滚动Listview可以查看?
这是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;
}
}
最佳答案
可见区域之外的视图不存在。 ListView仅创建屏幕上的视图数量。
滚动时,视图消失,它将重新使用该视图。实际上,它要求适配器修改视图的参数,并使用修改后的视图。
例:
假设view1为您的第一行(文字是头像)。向下滚动时,“头像”消失,底部将出现一个新的头像。 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