我想,以确保列表中滚动一路底部,我以listAdapter更新列表视图后,使其显示在列表中输入的最后一个元素.我怎样才能做到这一点 ?
我试过这个但没有运气:
lv.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
Run Code Online (Sandbox Code Playgroud)
谢谢
来自android开发人员(创建列表和卡片):
RecyclerView小部件是ListView的更高级和灵活的版本.
好吧,这听起来很酷,但是当我看到这个示例图片时,我对两者之间的区别感到非常困惑.

ListView使用自定义适配器可以轻松创建上面的图片.
那么,在什么情况下应该使用RecyclerView?
我习惯在布局文件中放置一个特殊视图,如ListActivity没有数据时要显示的文档中所述.此视图具有id "android:id/empty".
<TextView
android:id="@android:id/empty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/no_data" />
Run Code Online (Sandbox Code Playgroud)
我想知道如何用新的方式做到这一点RecyclerView?
Activity 班级代码:
conversationList = (ListView)findViewById(android.R.id.list);
ConversationArrayAdapter conversationArrayAdapter=new ConversationArrayAdapter(this, R.layout.conversation_list_item_format_left, conversationDetails);
conversationList.setAdapter(conversationArrayAdapter);
conversationList.setOnItemClickListener(new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
Log.d("test","clicked");
}
});
Run Code Online (Sandbox Code Playgroud)
类中的getView函数Adapter:
if (v == null) {
LayoutInflater vi = (LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if(leftSideMessageNumber.equals(m.getTo())) {
v = vi.inflate(R.layout.conversation_list_item_format_left, null);
} else {
v = vi.inflate(R.layout.conversation_list_item_format_right, null);
}
}
Run Code Online (Sandbox Code Playgroud)
在充气时使用两个xmls有问题吗?
Android文档说:
RecyclerView小部件是ListView的更高级和灵活的版本.此窗口小部件是一个容器,用于显示可以通过维护有限数量的视图而非常有效地滚动的大型数据集.如果数据集合的元素在运行时根据用户操作或网络事件而更改,请使用RecyclerView小部件
ListView如果效率无关紧要,实际上可以做到以上所有,我们在RecyclerView用来替换时发现了很多问题ListView:
列表项选择没有onItemClickListener() - 解决方案
列表项之间没有分隔符 - 解决方案
没有内置重叠选择器,当您单击列表项 - 解决方案时没有可视反馈
列表头没有addHeaderView - 解决方案
也许更多问题......
因此,当我们使用RecyclerView替换时ListView,我们必须做更多的额外编码才能达到相同的效果ListView.
题:
- 是否值得我们更换
ListView与RecyclerView完全?- 如果不是那么在这种情况下,我们应该更好地利用
RecyclerView替代ListView,反之亦然?
我正在编写ListAdapter的自定义实现.
在它的构造函数中,我接受一个Context,一个资源ID(即代表布局文件的R.id.xxx),一个列表和一个map(这些包含数据).
现在,问题是我需要一个LayoutInflater来获取View对象,该对象位于单独的布局XML文件中.
如果只给出Context,我怎样才能获得LayoutInflater?
现在,为什么我认为这是可能的,这与传递给ArrayAdapter的构造函数(context,resource,textViewResourceId,data array)非常相似,我认为ArrayAdapter也必须使用LayoutInflater只给出了一个Context.
但怎么办呢?
我想custom adapter为我的列表视图创建一个.是否有任何文章可以指导我如何创建一个并解释它是如何工作的?
可以ListView横向制作吗?我这样做了使用图库视图,但所选项目自动进入屏幕中心.我不希望所选项目在我点击的同一位置.我该如何纠正这个问题?我的想法是设置ListView水平滚动.分享你的想法?
在iOS中,有一个非常简单和强大的工具来动画添加和删除UITableView行,这里是来自youtube视频的剪辑,显示默认动画.请注意周围行如何折叠到已删除的行上.此动画可帮助用户跟踪列表中的更改以及数据更改时列表中的位置.
自从我在Android上开发以来,我发现没有相同的工具来动画TableView中的各个行.调用notifyDataSetChanged()我的适配器会导致ListView立即使用新信息更新其内容.我希望在数据发生变化时显示一个新行推入或滑出的简单动画,但我找不到任何记录的方法来执行此操作.看起来LayoutAnimationController可能包含一个键来使其工作,但是当我在ListView上设置LayoutAnimationController(类似于ApiDemo的LayoutAnimation2)并在列表显示后从我的适配器中删除元素时,元素立即消失而不是被动画化.
我还尝试过以下内容来删除单个项目时的动画:
@Override
protected void onListItemClick(ListView l, View v, final int position, long id) {
Animation animation = new ScaleAnimation(1, 1, 1, 0);
animation.setDuration(100);
getListView().getChildAt(position).startAnimation(animation);
l.postDelayed(new Runnable() {
public void run() {
mStringList.remove(position);
mAdapter.notifyDataSetChanged();
}
}, 100);
}
Run Code Online (Sandbox Code Playgroud)
但是,动画行周围的行不会移动位置,直到它们在notifyDataSetChanged()调用时跳转到新位置.一旦放置了元素,ListView就不会更新它的布局.
虽然编写我自己的ListView实现/分支已经超出了我的想法,但这看起来似乎不应该那么困难.
谢谢!