android listview加载顶部的上一个帖子按钮

时间:2014-05-19 18:00:47

标签: android json listview chat

我有一个消息传递应用程序。我可以通过json从mysql数据库中获取消息和列表。当我收到消息时(例如最后10条消息,而较新的消息位于底部),第一条记录显示在顶部,因此用户必须向下滚动才能看到最后一条消息。我想专注于最后的消息,当用户滚动到顶部时,我想在那里添加一个Load Previous Messages按钮。我找到了Load More buttoni,但它位于页面底部。我怎样才能做到这一点? 我的代码是这些:

 // Hashmap for ListView
    categoryList = new ArrayList<HashMap<String, String>>();

    // get listview
     ListView lv = getListView();
     Button btnLoadMore = new Button(this);
     btnLoadMore.setText("Load older messages");

    FrameLayout footerLayout = (FrameLayout) getLayoutInflater().inflate(R.layout.listfooter,null);
    lv.addFooterView(btnLoadMore);

1 个答案:

答案 0 :(得分:3)

正如我在评论中所说的那样,只需将addFooterView()更改为addHeaderView()方法,即可在列表顶部为加载更多。此方法使用三个参数(至少一个:查看来自reference):

  • 查看v 加载更多视图以在顶部添加
  • 对象数据:与视图相关联的数据
  • boolean isSelectable:值,使视图可选择

使用这三个参数而不仅仅是视图可以允许您使用android:listSelector属性来阻止颜色状态。实际上,有时您希望阻止页眉/页脚视图上的背景状态。话虽这么说,方法可能是:

lv.addHeaderView(headerLayout, null, false); // this isn't clickable now

注意:现在,您可以调用视图变量headerLayout而不是footerLayout ;)

根据我的理解,HeaderView应该将加载更多 Button放入其中,以避免动态创建,如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center" >
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Load More"
        android:onClick="loadMoreDatas" />
</LinearLayout>

现在,您在列表顶部有了正确的按钮,您可以添加一个方法来处理点击事件到Activity(请参阅android:onClick属性):

public void loadMoreDatas(View v) {
    // load more messages
}

最后,要关注特定项目,在您的情况下是列表中的最后一项(位于底部),您应该使用setSelection(int position) 转到其中选择的索引参数。然后,在设置Adapter后,请在ListView上将其称为:

// set the adapter
setListAdapter(adapter);
// go to selection (last item)
lv.setSelection(adapter.getCount() - 1); 

getCount()方法使用(通常)您的ArrayList尺寸。然后,您必须阻止IndexOutBoundsException,因为您的数组以位置0开头,而不是1。因此,最后一个位置是&#34;所有项目少于第一位置(0)&#34;

但是,从列表底部开始的完美方法setStackFromBottom()

  

当stack from bottom设置为true时,列表将从视图底部开始填充其内容。

然后,最好有:

// start from bottom
lv.setStackFromBottom(true); 

这应该可以解决问题,我希望这会有用。