如何将焦点设置为 0 索引的列表视图

How to set focus on list view at 0 index

我试图在加载列表视图时将焦点设置在列表视图上。我有一个要求,我想在列表视图上实现导航,就像按下向上按钮时我希望它向上移动一步,类似于向下按钮。到目前为止,我已经尝试了几乎大多数方法,例如 set selection(position),listview.requestfocus(),list.setSelected(true),list.setItemsCanFocus(true) 但到目前为止没有任何效果。 我也试过这种方法来获取列表视图中的视图并且它工作正常:

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);
    }
}
then I am getting the view and trying to set focus..however it does not work                

runOnUiThread(new Runnable() {
                public void run() {
                    getViewByPosition(0, list);
                    View v = getViewByPosition(0, list);

                    Log.v("WifiScanReceiver", "View found: " + v);
                    v.setFocusable(true);
                    v.setFocusableInTouchMode(true);
                    v.requestFocus();


                }
            });

任何实现焦点的建议都是appreciated.I已经研究了很多,但到目前为止没有任何效果。

public class MainActivity extends Activity {
    ListView listView ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Get ListView object from xml
        listView = (ListView) findViewById(R.id.list);

        // Defined Array values to show in ListView
        String[] values = new String[] { "Android List View", 
                                         "Adapter implementation",
                                         "Simple List View In Android",
                                         "Create List View Android", 
                                         "Android Example", 
                                         "List View Source Code", 
                                         "List View Array Adapter", 
                                         "Android Example List View" 
                                        };


        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
          android.R.layout.simple_list_item_1, android.R.id.text1, values);



        listView.setAdapter(adapter); 
        listView.post(new Runnable() {

            @Override
            public void run() {
                listView.setSelection(0);
            }
        });

它可能有也可能没有视觉效果(背景突出显示),具体取决于某些设备。因此,为该视图设置一些焦点颜色

listView.post(new Runnable() {

    @Override
    public void run() {
        listView.setSelection(focusedPosition);
        View v = getViewByPosition(0, list);
        v.setBackgroundResource(R.color.black);
    }
});

使用此代码

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            R.layout.drawer_list_item, R.id.text1, values) {

        public View getView(int pos, View convertView,
                android.view.ViewGroup parent) {
            View v = convertView;
            if (v == null) {
                LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                v = vi.inflate(R.layout.drawer_list_item, null);
            }
            TextView tv =(TextView) v.findViewById(R.id.text1);
            tv.setText(String.valueOf(values[pos]));
            if (pos == 0) {
                tv.setBackgroundColor(Color.BLUE);
            }

            return v;

        }
    };

    listView.setAdapter(adapter);

A) 文档说只有在 onResume 方法被调用后才能安全地触摸您的视图。

B) 我遇到了同样的问题...我的解决方案非常简单 :D

@Override 
protected void Resume() {
    //do whatever you need here
    new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                listView.requestFocus();
            },500);//the delay period can be changed, of course

}

大家好,非常感谢你们的精彩回复,他们都非常有帮助。然而,真正起作用的是:

list.post(new Runnable() {

                    @Override
                    public void run() {
                        list.getChildAt(indexPos + 1).setBackgroundColor(
                                Color.RED);
                        list.getChildAt(indexPos).setBackgroundColor(
                                Color.BLACK);
                        // String selectedFromList = (String) (list
                        // .getItemAtPosition(0));
                        Log.v("Case2", "Selected text is:" + selectedFromList);
                    }

我将列表背景设置为红色,对于选定的索引,我将背景更改为黑色。