2 xiaoyaovsxin xiaoyaovsxin 于 2013.01.31 10:36 提问

android ListView mListView.getChildAt(i)为空,求怎么解决?
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View v, int position,
                    long id) {

                for (int i = 0; i < mListView.getCount(); i++) {
                    View callLogView = mListView.getChildAt(i);   
                    mRelativeLayout = (LinearLayout)callLogView.findViewById(R.id.myShow);
                    if(i == position){
                        if(mRelativeLayout.getVisibility() == View.GONE){
                            mRelativeLayout.setVisibility(View.VISIBLE);
                        }
                        else{
                            mRelativeLayout.setVisibility(View.GONE);
                        }
                    }else{
                        mRelativeLayout.setVisibility(View.GONE);
                    }
                }

            }
        });

如题,代码以附上,我现在想做的事是在点击一项ListView后显示出一个布局,而其它项的ListView隐藏,但在超过 mListView.getChildCount()后会出现空指针,求解!

7个回答

xiaoyaovsxin
xiaoyaovsxin   2013.02.02 11:52
已采纳

看来,没有一个十全十美的办法,我采用一个实用的方法,使用mListView.getChildCount()循环,然后再写个滑动监听事件,滑动时再隐藏控件。

hotkarriver
hotkarriver   2013.02.06 13:12

在adapter中的getview方法里操作每个view

c_m_l
c_m_l   2013.09.24 18:41

View v = listView.getAdapter().getView(arg2,null,listView);
TextView t = (TextView) v.findViewById(R.id.textview);

xiaoyaovsxin
xiaoyaovsxin   2013.01.31 11:57

没人知道么?mListView.getChildAt(i)在超过 mListView.getChildCount()后会出现空指针怎么解决??

CSDN_Ask
CSDN_Ask   2013.01.31 14:28
int wantedPosition = 10; // Whatever position you're looking for
int firstPosition = listView.getFirstVisiblePosition() - listView.getHeaderViewsCount(); // This is the same as child #0
int wantedChild = wantedPosition - firstPosition;
// Say, first visible position is 8, you want position 10, wantedChild will now be 2
// So that means your view is child #2 in the ViewGroup:
if (wantedChild < 0 || wantedChild >= listView.getChildCount()) {
  Log.w(TAG, "Unable to get view for desired position, because it's not being displayed on screen.");
  return;
}
// Could also check if wantedPosition is between listView.getFirstVisiblePosition() and listView.getLastVisiblePosition() instead.
View wantedView = listView.getChildAt(wantedChild);

你没有遍历列表视图的子类,这可能会影响性能。

xiaoyaovsxin
xiaoyaovsxin 你这样还是不能访问到所有子类的。只能访问到可见的。
4 年多之前 回复
CSDN_Ask
CSDN_Ask 哪里理解错了呢?
4 年多之前 回复
xiaoyaovsxin
xiaoyaovsxin 兄弟,详细些,貌似理解错了!
4 年多之前 回复
LiDaming_and
LiDaming_and   2013.02.01 13:59

你不能在 onItemClick 中实现。
因为你只能访问可见性的子类,不是所有的子类。
在 onItemClick 你可以在 adapter 中发送位置,然后在 getView 中设置逻辑改变 view, 并且更新 listview 中的 adapter。

xiaoyaovsxin
xiaoyaovsxin 请问怎么才能访问所有的子类呢?在哪能实现?
4 年多之前 回复
yongyong_21
yongyong_21   2013.02.01 14:23

AdapterView.getCount()返回的是数据项的数量,这可能比可见视图要多。因为你想在当前的 ListView 项中找根本就不存在的 Views ,就会获得空指针异常。
为解决这个问题,你需要使用getFirstVisiblePosition()首先找到 Listview 中的第一个可见项,使用getLastVisiblePosition()找到最后一个可见项。
使用下面的循环语句:

int num_of_visible_view=mListView.getLastVisiblePosition() - 
                                   mListView.getFirstVisiblePosition();

for (int i = 0; i < num_of_visible_view; i++) {
      // do your code here
 }
xiaoyaovsxin
xiaoyaovsxin 3q
4 年多之前 回复
xiaoyaovsxin
xiaoyaovsxin 这中方法也是有问题的,如果有2页list,即10项,如果按第一页的第二项(即第二项的list),此时第二页的第二项也会显示(即第二和第七项list都会显示)。
4 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片