如何在0索引处设置焦点列表视图

时间:2015-02-23 09:54:15

标签: android listview

我正在尝试在加载时将焦点设置在列表视图上。我有一个要求,我想在列表视图上实现导航,就像按下向上按钮时我希望它向上移动一步,类似于向下按钮。直到现在我已经尝试了几乎所有的方法,比如 设置选择(位置),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();


                }
            });

任何有关重点的建议都会受到赞赏。我已经研究了很多,到目前为止还没有任何工作。

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);
            }
        });

4 个答案:

答案 0 :(得分:3)

大家好,非常感谢你们的回复,他们都非常有帮助。然而,确切的事情是:

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);
                    }

如果我将列表背景显示为红色并且选定的索引我将背景更改为黑色。

答案 1 :(得分:1)

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

listView.post(new Runnable() {

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

答案 2 :(得分:1)

使用此代码

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);

答案 3 :(得分:1)

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

}