2

编辑 我必须告诉你我的 ListView 是由 AsyncTask 填充的。

当我在 onPostExecute 方法中执行以下代码时,以下代码可以正常工作:

synchronized (mListView) {
            if(mFeeds==null || mFeeds.size()==0){
                Utils.Log("mFeeds empty");
                _this.setListShown(false);
            }else{
                Utils.Log("mFeeds Full");
                _this.setListShown(true);
                mListView.setAdapter(new ListFeedsAdapter(mActivity,mFeeds));
                mListView.notifyAll();

                NewsFeedsDetailViewPagerFragment fragment = (NewsFeedsDetailViewPagerFragment) getFragmentManager()
                        .findFragmentById(R.id.feeddetailViewPagerFragment);

                if(fragment!=null){
                    mListView.performItemClick(null, 0, mListView.getFirstVisiblePosition());

                }
            }

        }

单击该项目并填充我的详细信息视图...

我尝试将我的 Fragment 更改为 ListFragment 但没有任何改变......

编辑结束

对于我的应用程序,我创建了一个 UI(用于平板电脑),左侧屏幕为 ListView,右侧为详细视图。我想在加载数据后自动选择第一项,并查看详细信息。

我可以通过调用mListView.performItemClick(null, 0, mListView.getFirstVisiblePosition());

mListView.setOnItemClickListener(new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
            long arg3) {
    // TODO Auto-generated method stub

    NewsFeedsDetailViewPagerFragment fragment = (NewsFeedsDetailViewPagerFragment)
            getFragmentManager().findFragmentById(R.id.feeddetailViewPagerFragment);
    if(fragment!=null){
        fragment.setFeedDetail(mFeeds, arg2);
    }
});

现在,我要做的是突出显示第一个项目,例如平板电脑的 Gmail 应用程序。我在每一行上使用选择器背景,例如:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/selected_item_background" android:state_activated="true"/>
    <item android:drawable="@drawable/pressed_item_background" android:state_activated="false" android:state_pressed="true"/>
    <item android:drawable="@drawable/pressed_item_background" android:state_focused="true"/>
    <item android:drawable="@drawable/unselected_item_background"/>
</selector>

当我mListView.getChildAt(arg2).setActivated(true);在 onItemClick 侦听器中使用时,我有一个 NullPointerException,因为mListView.getChildAt(arg2)它是 null,只有当我保留 perforItemClick 时。如果我只是评论这一行,然后单击一行,则该行会像在 Gmail 应用程序中一样突出显示。

你能帮我告诉我我做错了什么吗?

预先感谢

4

4 回答 4

3

我找到了解决我的问题的方法,如果有处于相同情况的开发人员,我会在此处发布解决方案。

我在我的适配器中创建了一个必须激活标志位置的方法,在我的 getView 方法中,我只是将当前位置与标志进行比较并激活或不激活该行:

((ListFeedsAdapter) mListView.getAdapter()).setItemSelected(mOldPosition);

在适配器中:

private int mItemSelected = -1 ;
public void setItemSelected(int position){
mItemSelected=position;
}

public View getView(int position, View convertView, ViewGroup parent){
       //some code ....
    if(mItemSelected==position){
        convertView.setActivated(true);
    }else{
        convertView.setActivated(false);
    }
}

谢谢 !

于 2012-04-25T08:36:07.040 回答
2

我认为这是因为您在performItemClick()方法中传递了 null :

mListView.performItemClick(null, 0, mListView.getFirstVisiblePosition());

尝试类似:

mListView.performItemClick(mListView.getChildAt(0), 0, mListView.getFirstVisiblePosition());
于 2012-04-24T13:16:16.180 回答
0

你试过 setSelection() 吗?

mListView.setSelection(0)
于 2012-04-24T11:24:05.173 回答
0

我知道答案被接受,但如果这对某人有帮助。

如果您想在列表加载时自动选择/播放列表视图的第一个视图,那么您应该访问此链接。我一直在寻找同样的东西,并找到了 post() 方法,它等到你的列表被填满。

这是我的问题链接:-在 android 中加载列表视图时访问列表的第一项

这是它的解决方案链接:- notifyDataSetChanged 后的 smoothScrollToPosition 在 android 中不起作用

但是,在 getView() 中编写任何代码都会花费您,因为 getView 会被重复调用。谢谢。

于 2014-04-11T05:34:44.033 回答