Android:Master Detail模板中ListView默认选择第一项

标签 android android-listview master-detail

我用主从流程编写了一个 RSS 阅读器,左侧是 ListView ,右侧是详细 View 。

创建屏幕时,右侧是空的,左侧没有任何项目被选中。如何默认加载第一项?

我发现这篇文章与我的问题类似:Select the first item by default in a Master Detail flow

我的 ListFragment 中的代码如下所示:

@Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        // Set a listener to be invoked when the list should be refreshed.
        listView = (PullToRefreshListView) getListView();

        listView.setOnRefreshListener(new OnRefreshListener() {
            @Override
            public void onRefresh() {
                //refresh list
                refresh_list();
            }
        });

        listView.setVerticalFadingEdgeEnabled(true);

        // Set custom list adapter to the ListView
        adapter = new CustomListAdapter(getActivity(), feed);
        listView.setAdapter(adapter);

        //create button, on click go to website
        final Button btnAddMore = new Button(getActivity());
        btnAddMore.setText(R.string.button_text_end_list);
        btnAddMore.setBackgroundColor(getResources().getColor(R.color.white));
        btnAddMore.setOnClickListener(new OnClickListener() {
               @Override
               public void onClick(View v) {
                    // go to website on click
                    String url = "http://www.test.de";
                    Intent web = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                    startActivity(web);
               }
              });
        //add button at the end of the listview
        listView.addFooterView(btnAddMore);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        // Restore the previously serialized activated item position.
        if (savedInstanceState != null
                && savedInstanceState.containsKey(STATE_ACTIVATED_POSITION)) {
            setActivatedPosition(savedInstanceState
                    .getInt(STATE_ACTIVATED_POSITION));
        }

        //select the first item in the listview by default
        listView.requestFocusFromTouch();
        listView.setSelection(0);
        listView.performItemClick(listView
                .getAdapter().getView(0, view, null), 0, 0);
    }

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Log.d(TAG, "Hallo in ItemListFragment");

    // show ActionBar
    setHasOptionsMenu(true);

    // get reference to activity
    myApp = getActivity().getApplication();

    // check if intent from ItemListActivity is null
    Bundle be = getActivity().getIntent().getExtras();
    if (be == null) {
        // if null read local feed
        feed = ReadFeed(fileName);
        Log.d(TAG, "Lese Feed lokal :" + feed);
    } else {
        // else get extras from the intent
        feed = (RSSFeed) getActivity().getIntent().getExtras().get("feed");
        Log.d(TAG,
                "Intent von ItemListActivity an ItemListFragment vorhanden");
    }
}

但是我收到这个错误:

01-19 06:39:14.723: E/AndroidRuntime(1921): Caused by: java.lang.NullPointerException
01-19 06:39:14.723: E/AndroidRuntime(1921):     at ItemListFragment.onViewCreated(ItemListFragment.java:185)

在行中

listView.requestFocusFromTouch();

请帮帮我!

自定义列表适配器

public class CustomListAdapter extends BaseAdapter {

    private LayoutInflater layoutInflater;
    public ImageLoader imageLoader;
    public RSSFeed _feed;
    public Date pDate;

    public CustomListAdapter(Activity activity, RSSFeed feed) {

        _feed = feed;

        layoutInflater = (LayoutInflater) activity
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        imageLoader = new ImageLoader(activity.getApplicationContext());
    }

    public void setNewFeed(RSSFeed feed) {
        // set new Feed list, after refresh
        _feed = feed;
    }

    @Override
    public int getCount() {
        // Set the total list item count
        return _feed.getItemCount();
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        // Inflate the item layout and set the views
        View listItem = convertView;
        int pos = position;
        if (listItem == null) {
            listItem = layoutInflater.inflate(R.layout.list_item, null);
        }

        // Initialize the views in the layout
        ImageView iv = (ImageView) listItem.findViewById(R.id.thumb);
        TextView tvTitle = (TextView) listItem.findViewById(R.id.title);
        TextView tvDate = (TextView) listItem.findViewById(R.id.date);
        TextView comment_bubble = (TextView) listItem.findViewById(R.id.comment_bubble);

        // Set the views in the layout
        imageLoader.DisplayImage(_feed.getItem(pos).getImage(), iv);
        tvTitle.setText(_feed.getItem(pos).getTitle());

        // calculate the time difference to the actual system time
        String pubDate = _feed.getItem(pos).getDate();
        SimpleDateFormat df = new SimpleDateFormat(
                "EEE, dd MMM yyyy HH:mm:ss",Locale.ENGLISH);
        try {
            try {
                pDate = df.parse(pubDate);
            } catch (java.text.ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            pubDate = "Vor "
                    + DateUtils.getDateDifference(pDate);
        } catch (ParseException e) {
            Log.e("DATE PARSING", "Error parsing date..");

        }
        //set time difference
        tvDate.setText(pubDate);

        //set comment in bubble
        comment_bubble.setText(_feed.getItem(pos).getComment());

        return listItem;
    }
}

最佳答案

Fragment小号,onViewCreated()将在 onActivityCreated() 之前调用在这里你正在初始化 ListViewonActivityCreated()并使用它 onViewCreated()这导致 NullPointerException (因为 ListView 仍未初始化)。相反,您可以在 onViewCreated() 上初始化它并用于 onActivityCreated() ...

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    listView = (PullToRefreshListView) getListView();

    listView.setOnRefreshListener(new OnRefreshListener() {
        @Override
        public void onRefresh() {
            //refresh list
            refresh_list();
        }
    });

    listView.setVerticalFadingEdgeEnabled(true);

    // Set custom list adapter to the ListView
    adapter = new CustomListAdapter(getActivity(), feed);
    listView.setAdapter(adapter);
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            // handle List item click here...
        }
    });
    ListAdapter adapter = listView.getAdapter();
    listView.performItemClick(listView.getChildAt(0), 0, adapter.getItemId(0)); // this will call OnItemClickListener
        ......
}

关于Android:Master Detail模板中ListView默认选择第一项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21216261/

相关文章:

android - native SIP INFO 消息 (RFC 6086)

android - Siteminder 身份验证和 Android

android - ListView 和键盘导航

android - 动态改变背景颜色listView

delphi - 如何维护主从客户端数据集Delphi中的排序顺序?

javascript - knockout 中级联主从和加载记录。 js

java.net.SocketTimeoutException : timeout

android - Gradle同步失败: The file or directory is corrupted and unreadable in android studio

java - Baseadapter 中的 Android Listview 如何保存对列表的更改

javascript - AngularJS 为数组中的对象创建 Id-s