【问题标题】:Difference between physical and programmatically click on ListView物理点击和编程点击 ListView 的区别
【发布时间】:2017-01-05 05:11:22
【问题描述】:

我在onCreate 方法上以编程方式单击ListView 项目,如下所示:

    // setting listener for ListView item click
    listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                changeView(i);
            }
        });

    // Clicking ListView first position programmatically.
    listview.performItemClick(listview.getChildAt(0), 0,
                listview.getAdapter().getItemId(0));

在上面的代码中,当我调试代码 changeView(i); 时,programmatic 和 physical 点击均正确调用。

我正在使用 changeView() 更改 ListView 项目视图(TextView 和 ImageView)的颜色,如下所示:

private void changeView(int position) {
        for (int i = 0; i < adapter.getCount(); i++) {
            View v = getViewByPosition(i, listview);
            ImageView imgIcon = (ImageView) v.findViewById(R.id.icon);
            TextView txtTitle = (TextView) v.findViewById(R.id.title);
            if (i == position) {
                imgIcon.setColorFilter(ContextCompat.getColor(mActivity, R.color.app_red));
                txtTitle.setTextColor(ContextCompat.getColor(mActivity, R.color.app_red));
            } else {
                imgIcon.setColorFilter(ContextCompat.getColor(mActivity, R.color.colorWhite));
                txtTitle.setTextColor(ContextCompat.getColor(mActivity, R.color.colorWhite));
            }
        }

        lvSlideMenu.setItemChecked(position, true);
        lvSlideMenu.setSelection(position);
    }

其中getViewByPosition()方法用于获取ListView项的视图:

public View getViewByPosition(int pos, ListView listView) {
        final int firstListItemPosition = listView.getFirstVisiblePosition();
        final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1;

        if (pos < firstListItemPosition || pos > lastListItemPosition) {
            return listView.getAdapter().getView(pos, null, listView);
        } else {
            final int childIndex = pos - firstListItemPosition;
            return listView.getChildAt(childIndex);
        }
    }

问题: 当我点击物理(手动)而不是以编程方式。

提前致谢。

【问题讨论】:

    标签: android listview onitemclick


    【解决方案1】:

    尝试在 chnageView() 中发送视图

      changeView(view);
    

    在 chnageView() 中

    ImageView imgIcon = (ImageView) v.findViewById(R.id.icon);
            TextView txtTitle = (TextView) v.findViewById(R.id.title);
    

    【讨论】:

    • v 是在 changeview(view) 方法中传递的视图。删除 for (int i = 0; i
    【解决方案2】:

    分析代码,我可以推断,当您以编程方式更改颜色并调用 changeView() 时,您的颜色更改代码部分不会被执行:

    for (int i = 0; i < adapter.getCount(); i++) {
                View v = getViewByPosition(i, listview);
                ImageView imgIcon = (ImageView) v.findViewById(R.id.icon);
                TextView txtTitle = (TextView) v.findViewById(R.id.title);
                if (i == position) {
                    imgIcon.setColorFilter(ContextCompat.getColor(mActivity, R.color.app_red));
                    txtTitle.setTextColor(ContextCompat.getColor(mActivity, R.color.app_red));
                } else {
                    imgIcon.setColorFilter(ContextCompat.getColor(mActivity, R.color.colorWhite));
                    txtTitle.setTextColor(ContextCompat.getColor(mActivity, R.color.colorWhite));
                }
            }
    

    你能检查一下for块是否被执行。

    【讨论】:

    • 我在以编程方式单击项目之前设置了 setOnItemClickListener,这是调用颜色更改代码。我调试看看代码是否被调用以及它的调用。
    猜你喜欢
    • 2020-11-22
    • 2022-12-18
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 2015-11-28
    • 2011-04-20
    • 1970-01-01
    相关资源
    最近更新 更多