【问题标题】:Android/ListView : Select first item after loading datasAndroid/ListView : 加载数据后选择第一项
【发布时间】:2012-04-24 11:19:31
【问题描述】:

编辑 我必须告诉你,我的 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>

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

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

提前致谢

【问题讨论】:

标签: android listview gmail tablet


【解决方案1】:

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

我在我的适配器中创建了一个必须激活标志位置的方法,在我的 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);
    }
}

谢谢!

【讨论】:

    【解决方案2】:

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

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

    尝试类似:

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

    【讨论】:

    • 感谢您的建议,但我尝试了您的解决方案但没有成功。我找到了一个名为 HoneycombGallery 的示例,它完全符合我的要求,但我不明白它是如何工作的。他们使用mListView.setItemChecked(position,true)。当我尝试它时,什么也没发生。我想这是因为在示例中,每个列表项都有android:background="?android:attr/activatedBackgroundIndicator"
    • 对不起,我没有看到你说的示例,但我认为performItemClick的第三个参数肯定有问题,它需要一个行id但你使用mListView.getFirstVisiblePosition()。跨度>
    • 我尝试用mListView.performItemClick(null, 0, mListView.getItemIdAtPosition(0)); 替换我感谢您为帮助我所做的努力,但这没有任何效果...
    【解决方案3】:

    你试过 setSelection() 吗?

    mListView.setSelection(0)
    

    【讨论】:

    • mListView.setSelection(0) 只需将列表视图移动到顶部。我已经尝试过了,但没有成功...
    【解决方案4】:

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

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

    这是我的问题链接:-Accessing list's first item when list view is loaded in android

    这里是它的解决方案链接:-smoothScrollToPosition after notifyDataSetChanged not working in android

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多