Android ListView 突出显示会导致奇怪的行为

Posted

技术标签:

【中文标题】Android ListView 突出显示会导致奇怪的行为【英文标题】:Android ListView highlighting causes strange behavior 【发布时间】:2013-01-13 17:51:14 【问题描述】:

我试图让 ListView 在选择每个项目后显示多个突出显示,但我从视图中得到奇怪的行为。如果单击第一项,它会突出显示(单击弹出窗口上的 OK 按钮后)。但是,如果您单击第二项,则最后一项也会突出显示。这是显示 renderer.setBackgroundResource 仅被调用适当次数的日志。

01-30 00:54:07.957: I/HighlightActivity(343): ListView.onItemClick: selected = 0

01-30 00:54:09.757: I/HighlightActivity(343): FINISHED_WORDS[0].equals(set)

01-30 00:54:11.387: I/HighlightActivity(343): ListView.onItemClick: selected = 1

01-30 00:54:12.757: I/HighlightActivity(343): FINISHED_WORDS[0].equals(set)

01-30 00:54:12.776: I/HighlightActivity(343): FINISHED_WORDS[1].equals(set)

如果你尝试不同的选择顺序,就会发生各种奇怪的行为。我不确定这是否是最好的方法,或者问题是什么。 (使用 android 2.3.3 API 10)

感谢您的帮助,

杜鹃。

这是活动:

public class HighlightActivity extends ListActivity 

private static final String DEBUG_TAG = "HighlightActivity";
final Context context = this;
private String[] FINISHED_WORDS = "","","","","","";
private String[] WORDS = "one","two","three","four","five","six";
int selected;   
@Override
public void onCreate(Bundle savedInstanceState) 

    super.onCreate(savedInstanceState);
    this.setListAdapter(new ArrayAdapter<String>(this, R.layout.activity_highlight, 
                    R.id.highlight_layout, WORDS)
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent)
        
            final View renderer = super.getView(position, convertView, parent);
            if (FINISHED_WORDS[position].equals("set"))
            
                renderer.setBackgroundResource(android.R.color.darker_gray);
                Log.i(DEBUG_TAG, "FINISHED_WORDS["+position+"].equals(set)");
            
            return renderer;
        
    );
    ListView list_view = getListView();
    list_view.setTextFilterEnabled(true); 
    list_view.setOnItemClickListener(new OnItemClickListener() 
    
          public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
          
                selected = position;
                Log.i(DEBUG_TAG, "ListView.onItemClick: selected = "+selected);
                final String selected_word = WORDS[position];
                LayoutInflater layout_inflater = LayoutInflater.from(context);
                View popup_view = layout_inflater.inflate(R.layout.highlight_popup, null);
                final AlertDialog.Builder alert_dialog_builder = new AlertDialog.Builder(context);
                alert_dialog_builder.setView(popup_view);
                final TextView ard_player_words_popup_text = (TextView) popup_view.findViewById(R.id.highlight_popup_text);
                ard_player_words_popup_text.setText(selected_word+" selected");
                alert_dialog_builder.setCancelable(false).setPositiveButton("OK",
                        new DialogInterface.OnClickListener() 
                        
                            public void onClick(DialogInterface dialog,int id) 
                            
                                FINISHED_WORDS[selected] = "set";
                                dialog.cancel();
                                ListView list_view = getListView();
                                ArrayAdapter<?> adapter = (ArrayAdapter<?>) list_view.getAdapter();
                                adapter.notifyDataSetChanged();
                            
                          ).setNegativeButton("Cancel", new DialogInterface.OnClickListener() 
                          
                              public void onClick(DialogInterface dialog,int id) 
                              
                                  dialog.cancel();
                              
                          );
                AlertDialog alert_dialog = alert_dialog_builder.create();
                alert_dialog.show();
        
    );


@Override
public boolean onCreateOptionsMenu(Menu menu) 

    getMenuInflater().inflate(R.menu.activity_highlight, menu);
    return true;



这里是 activity_highlight.xml 布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_ >

<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/highlight_layout"
    android:layout_
    android:layout_
    android:padding="10dp"
    android:textSize="20sp" >
</TextView>

</RelativeLayout>

这里是highlight_popup.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:orientation="vertical" >

<TextView
    android:id="@+id/highlight_popup_text"
    android:layout_
    android:layout_
    android:layout_gravity="center_horizontal"/>

</LinearLayout>

【问题讨论】:

【参考方案1】:

您的 getView 方法可能正在获取已回收的 convertView,并且已经设置了背景。

试试这个:

if (FINISHED_WORDS[position].equals("set"))

renderer.setBackgroundResource(android.R.color.darker_gray);
Log.i(DEBUG_TAG, "FINISHED_WORDS["+position+"].equals(set)");

else

renderer.setBackgroundResource(R.color.normal_background);

【讨论】:

感谢 Jorge 的快速回复,这很有效。虽然我无法使用 normal_background。我使用了 android.R.color.background_light ,然后就没有更多奇怪的行为了。 我很高兴它成功了。是的,我写了 normal_background 只是作为一个例子。您需要在 res/ 文件夹中定义它才能使用它。

以上是关于Android ListView 突出显示会导致奇怪的行为的主要内容,如果未能解决你的问题,请参考以下文章

如何在Android中的ListView中突出显示行?

Android - 单击后保持 ListView 的项目突出显示

Android:无需点击即可在Listview上设置焦点突出显示

Android - 禁用 ListView 选择突出显示但保持启用 OnClick [重复]

如何取消 Android ListView 项目在 ListView 的 setOnItemClickListener 中被激活/突出显示?

Android ListView 项目以编程方式突出显示