我有一个消息传递应用程序。我可以通过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);
答案 0 :(得分:3)
正如我在评论中所说的那样,只需将addFooterView()
更改为addHeaderView()
方法,即可在列表顶部为加载更多。此方法使用三个参数(至少一个:查看来自reference):
使用这三个参数而不仅仅是视图可以允许您使用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);
这应该可以解决问题,我希望这会有用。