我只是在xml中构建一些UI,Lint给了我一个警告,并说要将android:baselineAligned设置为false以提高ListView的性能.
添加此警告的Lint更改的文档说
布局性能:使用权重查找LinearLayouts,您应该设置android:baselineAligned ="false"以获得更好的性能,还会发现嵌套权重可能导致性能问题的情况.
有人可以解释为什么这会改善性能,特别是涉及体重时?
我想做什么:运行后台线程计算ListView内容并部分更新ListView,同时计算结果.
我知道我必须避免:我不能从后台线程中弄乱ListAdapter内容,所以我继承了AsyncTask并从onProgressUpdate发布结果(向适配器添加条目).我的适配器使用结果对象的ArrayList,这些arraylists上的所有操作都是同步的.
其他人的研究:有非常有价值的数据在这里.对于500名用户来说,我几乎每天都会遇到崩溃,当我list.setVisibility(GONE)/trackList.setVisibility(VISIBLE)在onProgressUpdate中添加了阻塞时,崩溃率下降了10倍但没有消失.(有人建议回答)
我有时得到的:请注意,它很少发生(每周一次为3.5k用户之一).但我想完全摆脱这个错误.这是部分堆栈跟踪:
`java.lang.IllegalStateException:` The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. [in ListView(2131296334, class android.widget.ListView) with Adapter(class com.transportoid.Tracks.TrackListAdapter)]
at android.widget.ListView.layoutChildren(ListView.java:1432)
at android.widget.AbsListView.onTouchEvent(AbsListView.java:2062)
at android.widget.ListView.onTouchEvent(ListView.java:3234)
at android.view.View.dispatchTouchEvent(View.java:3709)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:852)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
[...]
Run Code Online (Sandbox Code Playgroud)
救命?不再需要了,见下文
最终答案:事实证明,我notifyDataSetChanged每次调用5次以避免闪烁和突然更改列表.它不能这样做,总是在基本列表更改时通知适配器.这个错误现在已经消失了.
我正在尝试为ListView创建自定义适配器,因为列表中的每个项目都可以有不同的视图(链接,切换或无线电组),但是当我尝试运行使用ListView的Activity时,我收到错误,该应用程序停止.该应用程序针对Android 1.6平台.
代码:
public class MenuListAdapter extends BaseAdapter {
private static final String LOG_KEY = MenuListAdapter.class.getSimpleName();
protected List<MenuItem> list;
protected Context ctx;
protected LayoutInflater inflater;
public MenuListAdapter(Context context, List<MenuItem> objects) {
this.list = objects;
this.ctx = context;
this.inflater = (LayoutInflater)this.ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.i(LOG_KEY, "Position: " + position + "; convertView = " + convertView + "; parent=" + parent);
MenuItem item = list.get(position);
Log.i(LOG_KEY, "Item=" + item );
if (convertView == …Run Code Online (Sandbox Code Playgroud) 可能重复:
Android中的水平ListView?
像Android中的许多东西一样,你不会认为这会是一个如此难的问题,但哦,哦,你会错的.而且,与Android中的许多内容一样,API甚至没有提供合理可扩展的起点.如果我要打开自己的ListView,我会被诅咒,当我想要的只是把它拿走并把它转向它.\咆哮
好吧,现在我已经完成了冒烟,让我们谈谈问题本身.我需要的基本上就像是Gallery,但没有中心锁定功能.我真的不需要ListViewlistSelector,但这是一个很好的选择.大多数情况下,我可以用LinearLayout内部的方式做我想做的事情ScrollView,但我需要来自a的子视图ListAdapter,我真的希望有一个视图回收器.我真的不想写任何布局代码.
我偷看了其中一些类的源代码......
图库:如果我覆盖大多数'onXyz'方法,复制所有源代码,但不要调用,看起来我可以使用Gallery scrollIntoSlots().但我敢肯定,如果我这样做,我会遇到一些无法访问的成员字段或其他一些无法预料的后果.
AbsSpinner:由于该mRecycler字段是包私有的,我怀疑我是否能够扩展这个类.
AbsListView:看起来这个类只适用于垂直滚动,所以没有帮助.
AdapterView:我从来没有直接扩展这个类.如果你告诉我它很容易做,并且很容易自己动手RecycleBin,我会非常怀疑,但我会试一试.
我想我可以复制这两个 AbsSpinner并Gallery得到我想要的东西......希望那些类没有使用一些我无法访问的包私有变量.你们都认为这是一个好习惯吗?有没有人有任何教程或第三方解决方案可能会让我朝着正确的方向前进?
更新:
到目前为止我找到的唯一解决方案是自己完成所有工作.自从提出这个问题以来,我已经AdapterView从头开始重写并实现了自己的"HorizontalListView".真正覆盖Gallery的中心锁定功能的唯一方法是覆盖私有scrollIntoSlots方法,我认为这需要在运行时生成子类.如果你足够大胆地做到这一点,它可以说是最好的解决方案,但我不想依赖可能改变的无证方法.
下面的Swathi EP建议我给出Gallery一个OnTouchListener并覆盖滚动功能.如果你不关心你的列表中有一扔支持,或者如果它是没关系的意见,在一扔动画结束捕捉到中心,那么这会为你工作!然而,最终仍然证明在不移除支撑的情况下移除中心锁定特征是不可能的.而且我问你,什么样的名单不扔?
所以,唉,这对我不起作用.:-(但如果你对这种方法感兴趣,请继续阅读......
我还必须对Swathi的代码添加一些内容以获得我想要的内容.在GestureListener.onTouch,除了委托给手势检测器,我还必须返回true ACTION_UP和ACTION_CANCEL事件.这成功禁用了中心锁定功能,但它也禁用了投掷功能.我能够通过将自己的GestureListener委托给Gallery的onFling方法来重新启用fling .如果您想尝试一下,请进入ApiDemos示例代码并使用以下代码替换Gallery1.java类:
import com.example.android.apis.R;
import android.app.Activity;
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.GestureDetector;
import android.view.MenuItem;
import android.view.MotionEvent; …Run Code Online (Sandbox Code Playgroud) 我有一个ListView地方,列表中的每个元素都包含一个TextView和两个不同的按钮.像这样的东西:
ListView
--------------------
[Text]
[Button 1][Button 2]
--------------------
[Text]
[Button 1][Button 2]
--------------------
... (and so on) ...
Run Code Online (Sandbox Code Playgroud)
使用此代码,我可以OnItemClickListener为整个项目创建一个:
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> list, View view, int position, long id) {
Log.i(TAG, "onListItemClick: " + position);
}
}
});
Run Code Online (Sandbox Code Playgroud)
但是,我不希望整个项目是可点击的,而只是每个列表元素的两个按钮.
所以我的问题是,如何使用以下参数为这两个按钮实现onClickListener:
int button (单击了元素的哪个按钮)int position (这是按钮单击发生的列表中的元素)更新:我找到了一个解决方案,如下面的答案中所述.现在我可以通过触摸屏点击/点击按钮.但是,我无法使用轨迹球手动选择它.它总是选择整个列表项,并从那里直接进入下一个列表项忽略按钮,即使我设置.setFocusable(true)和setClickable(true)按钮getView().
我还将此代码添加到我的自定义列表适配器:
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public boolean isEnabled(int position) {
return false;
} …Run Code Online (Sandbox Code Playgroud) 在Android上,我如何ListView根据用户输入进行过滤,其中显示的项目是根据TextView值动态更新的?
我正在寻找这样的东西:
-------------------------
| Text View |
-------------------------
| List item |
| List item |
| List item |
| List item |
| |
| |
| |
| |
-------------------------
Run Code Online (Sandbox Code Playgroud) 我有一个自定义列表适配器:
class ResultsListAdapter extends ArrayAdapter<RecordItem> {
Run Code Online (Sandbox Code Playgroud)
在重写的'getView'方法中,我做了一个打印来检查它是什么位置以及它是否是convertView:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
System.out.println("getView " + position + " " + convertView);
Run Code Online (Sandbox Code Playgroud)
此输出(当列表首次显示时,尚未输入用户)
04-11 16:24:05.860: INFO/System.out(681): getView 0 null
04-11 16:24:29.020: INFO/System.out(681): getView 1 android.widget.RelativeLayout@43d415d8
04-11 16:25:48.070: INFO/System.out(681): getView 2 android.widget.RelativeLayout@43d415d8
04-11 16:25:49.110: INFO/System.out(681): getView 3 android.widget.RelativeLayout@43d415d8
04-11 16:25:49.710: INFO/System.out(681): getView 0 android.widget.RelativeLayout@43d415d8
04-11 16:25:50.251: INFO/System.out(681): getView 1 null
04-11 16:26:01.300: INFO/System.out(681): getView 2 null
04-11 16:26:02.020: INFO/System.out(681): getView 3 null
04-11 16:28:28.091: INFO/System.out(681): getView 0 …Run Code Online (Sandbox Code Playgroud) 对于我的部分应用,会向用户显示一个名称列表,并要求他们按照自己的意愿对其进行分组.
(注意,ListView代码是从Android视图教程中逐字复制的.我还没有根据我的需要对其进行定制,我只想弄清楚如何使其工作.)
基本布局是一个LinearLayout,包含一个ScrollView(在下面的代码中称为"groupsScrollView"),包含一个RelativeLayout.我有一些按钮和文本,然后是我的ListView,它显示了名称列表.所有这一切都高于可见屏幕区域,因此允许用户垂直滚动以查看所有内容.
这一切都很漂亮,除非页面加载时总是预先滚动到我的ListView顶部 - 在页面中间.我创建的文本和按钮告诉用户该做什么是不可见的.
我可以抓住屏幕并向上滚动,这很好用,但我希望屏幕加载已经滚动到顶部.用户不必向上滚动以查看新加载页面的顶部.但我尝试以编程方式滚动到屏幕顶部的所有内容都失败了.
这是我的onCreate方法:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.groups);
mainScrollView = (ScrollView)findViewById(R.id.groupsScrollView);
//get the Bundle out of the Intent...
Bundle extras = getIntent().getExtras();
mNames = extras.getStringArray("mNames");
setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, mNames));
ListView lv = getListView();
lv.setTextFilterEnabled(true);
//This is the line I'm having issues with
mainScrollView.pageScroll(View.FOCUS_UP);
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// When clicked, show a toast with the TextView text
Toast.makeText(getApplicationContext(), ((TextView) view).getText(),
Toast.LENGTH_SHORT).show();
}
}); …Run Code Online (Sandbox Code Playgroud) 我在滚动ListView里面遇到麻烦ScrollView.我有一个Activity在顶部有一些EditTexts,然后是一个带有两个选项卡的选项卡主机,每个选项卡都有一个ListView.当EditText视图聚焦时,软键盘出现,因为我有一个ScrollView,内容是可滚动的.但问题出现在ListViews中有更多项目(选项卡中的项目),即使有更多项目,我也无法滚动ListView.
以下是布局XML:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="?backgroundImage"
android:orientation="vertical">
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="50dip"
android:layout_alignParentBottom="true"
android:layout_margin="10dip"
android:id="@+id/buttons">
<Button
android:text="Save"
android:layout_margin="2dip"
android:textSize="20dip"
android:id="@+id/btnSaveorUpdate"
android:layout_height="wrap_content"
android:layout_width="145dip"></Button>
<Button
android:text="Cancel"
android:layout_margin="2dip"
android:textSize="20dip"
android:id="@+id/btnCancelorDelete"
android:layout_height="wrap_content"
android:layout_width="145dip"></Button>
</LinearLayout>
<ScrollView
android:layout_above="@id/buttons"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:fillViewport="true"
android:layout_margin="10dip">
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_margin="10dip">
<TextView
android:text="Bill details"
android:textColor="?textColorDark"
android:layout_alignParentTop="true"
android:id="@+id/txtEnterDetails"
android:textSize="25dip"
android:textStyle="bold"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:layout_marginBottom="2dip"></TextView>
<LinearLayout
android:focusable="true"
android:focusableInTouchMode="true"
android:layout_width="0dip"
android:layout_height="0dip" />
<EditText
android:layout_width="fill_parent"
android:hint="Enter data"
android:inputType="numberDecimal"
android:id="@+id/txtSample"
android:textSize="@dimen/editText"
android:layout_height="@dimen/editTextHeight"
android:text=""></EditText>
<EditText
android:layout_width="fill_parent"
android:id="@+id/txtDescription"
android:hint="Enter description"
android:textSize="@dimen/editText" …Run Code Online (Sandbox Code Playgroud) 我最近遇到了RecycleViewAndroid 5.0发布的android ,它似乎RecycleView只是一个封装的传统ListView,其中包含了ViewHolder模式,它促进了视图的重用,而不是每次都创建它.
使用的其他好处是RecycleView什么?如果两者在性能方面具有相同的效果,为什么会选择使用RecycleView`?
编辑
我发现人们提出了类似的问题并且答案没有定论,在这里添加它们以保存记录.
我们应该使用RecyclerView来取代ListView吗?
为什么RecyclerView没有onItemClickListener()?和RecyclerView如何与Listview不同?
android ×10
listview ×10
adapter ×2
exception ×2
scrollview ×2
android-lint ×1
button ×1
filter ×1
gallery ×1
java ×1
performance ×1