listView.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View viewItem, int position, long arg3) {
for(int i =parent.getFirstVisiblePosition(); i <parent.getLastVisiblePosition(); i ++)
{
Log.i("in", Integer.toString(i));
View v = parent.getChildAt(i);
((Button)v.findViewById(R.id.removefav)).setVisibility(View.INVISIBLE);
((Button)v.findViewById(R.id.gotherefav)).setVisibility(View.INVISIBLE);
}
viewItem=listView.getChildAt(position);
((Button)viewItem.findViewById(R.id.removefav)).setVisibility(View.VISIBLE);
((Button)viewItem.findViewById(R.id.gotherefav)).setVisibility(View.VISIBLE);
TextView text = (TextView)viewItem.findViewById(R.id.item);
name = text.getText();
如果您点击ListView
第一个开头可见的项目,此代码有效,但是如果您滚动并拥有,则说出一半可见项目,抛出NullpointerException
:
07-02 18:38:47.290: WARN/dalvikvm(6078): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
07-02 18:38:47.290: ERROR/AndroidRuntime(6078): Uncaught handler: thread main exiting due to uncaught exception
07-02 18:38:47.300: ERROR/AndroidRuntime(6078): java.lang.NullPointerException
07-02 18:38:47.300: ERROR/AndroidRuntime(6078): at walk.me.Tabber$1.onItemClick(Tabber.java:89)
07-02 18:38:47.300: ERROR/AndroidRuntime(6078): at android.widget.AdapterView.performItemClick(AdapterView.java:284)
07-02 18:38:47.300: ERROR/AndroidRuntime(6078): at android.widget.ListView.performItemClick(ListView.java:3285)
07-02 18:38:47.300: ERROR/AndroidRuntime(6078): at android.widget.AbsListView$PerformClick.run(AbsListView.java:1640)
07-02 18:38:47.300: ERROR/AndroidRuntime(6078): at android.os.Handler.handleCallback(Handler.java:587)
07-02 18:38:47.300: ERROR/AndroidRuntime(6078): at android.os.Handler.dispatchMessage(Handler.java:92)
07-02 18:38:47.300: ERROR/AndroidRuntime(6078): at android.os.Looper.loop(Looper.java:123)
07-02 18:38:47.300: ERROR/AndroidRuntime(6078): at android.app.ActivityThread.main(ActivityThread.java:4363)
07-02 18:38:47.300: ERROR/AndroidRuntime(6078): at java.lang.reflect.Method.invokeNative(Native Method)
07-02 18:38:47.300: ERROR/AndroidRuntime(6078): at java.lang.reflect.Method.invoke(Method.java:521)
07-02 18:38:47.300: ERROR/AndroidRuntime(6078): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
07-02 18:38:47.300: ERROR/AndroidRuntime(6078): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
07-02 18:38:47.300: ERROR/AndroidRuntime(6078): at dalvik.system.NativeStart.main(Native Method)
我要做的是,我有一个ListView
和两个按钮。并且用户触摸子视图中的一个项目(两个按钮),当用户触摸另一个项目时,先前所选项目上的按钮消失。
我做错了什么?这个“半可见”项目(滚动列表时)是NPE吗?我也试过从
开始i=0
但它是一样的。
答案 0 :(得分:3)
您不应该像listView中那样修改视图。 android中的列表视图始终由适配器支持,并且它已经过优化,以便在视图滚动到屏幕外时重新使用视图。这意味着你总是应该在适配器中实现getView(),它应该反映视图中数据(适配器中的模型)的呈现方式。 当您收到getView参数中的回收视图(即不是从头开始创建它,而是根据与视图对应的适配器中的项目设置正确的字段,文本,可见性等)时,正确做出反应非常重要。
每当您修改适配器中的所有相关数据(更改指示您的情况下的可见性的标志)时,您应该在适配器上调用notifyDataSetChanged(),然后listview将自己重新创建所有可见项(它将循环通过它们并调用getView()重用已经创建的视图。
另请参阅Android listActivity onListItemClick with CheckBox,其中包含类似的问题。