我的Android应用程序面临极其严重的问题。我在任何地方都看不到任何类似的解决方案,无论是谷歌还是SO。
以下是该应用的截图:
这是正常的预期输出。但是当我退出应用程序并从启动器再次恢复时,经常(比如5次中的2次)我碰巧得到了白色组件(列表视图和EditText),如下所示:
在这张图片中,我在截取屏幕截图时触及了listview的第一个元素,以便显示listview项目具有实际内容而不是空白。
这是我的布局资源文件main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ll"
android:cacheColorHint="#00000000"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent" android:weightSum="15" android:background="@android:color/white">
<EditText
android:layout_width="match_parent"
android:layout_height="0dp"
android:id="@+id/edittext" android:layout_weight="2" android:background="#ffffff"
android:textColor="@android:color/black" android:gravity="center" android:hint="Enter Your Text Here"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp" android:layout_weight="2"
android:weightSum="12" android:gravity="center">
<Button android:layout_width="0dp"
android:layout_height="match_parent"
android:text="Tweet"
android:id="@+id/tweetbtn"
android:background="@drawable/mybutton"
android:layout_weight="6"/>
<Button
android:layout_width="0dp"
android:layout_height="match_parent"
android:text="Search"
android:background="@drawable/mybutton"
android:id="@+id/searchbtn"
android:layout_weight="6"/>
</LinearLayout>
<TextView
android:layout_width="match_parent"
android:layout_height="0dp"
android:text="Most Frequently Tweeted"
android:id="@+id/listviewlabel" android:layout_weight="1" android:gravity="center" android:background="#adadad"
android:textColor="@android:color/black"/>
<ListView
android:cacheColorHint="#00000000"
android:background="#ffffff"
android:layout_width="match_parent"
android:layout_height="0dp"
android:id="@+id/listView" android:layout_gravity="center_horizontal" android:layout_weight="10"
android:choiceMode="singleChoice"/>
</LinearLayout>
请有人帮我解决这个问题。 Atleast帮我解决了白色的EditText问题。这将给我一些解决listview问题的线索。
编辑: 列表视图由元素动态填充。这是我的onStart()方法:
@Override
public void onStart(){
super.onStart();
handleFrequentMenuSelected();
}
这是handleFrequentMenuSelected():
private void handleFrequentMenuSelected() {
if(!isAccountAdded()){
showToast("Add an account first to get started! Goto Menu and select account.");
}else{
List<StatusElement>aList=getStatusElementsFromSQLiteDatabase();
HashMap<String,Integer> hMap=new HashMap<String, Integer>();
for(StatusElement s:aList){
String tokens[]=s.toString().split(" ");
String outText="";
if(tokens.length>1){
if(tokens[0].contains("/")){
String tokens2[]=tokens[0].split("/");
try{
long l=Long.parseLong(tokens2[0]);
for(int i=1;i<tokens.length;i++){
outText=outText+tokens[i]+" ";
}
}catch(Exception e){
outText=s.toString();
}
}else{
try{
long l=Long.parseLong(tokens[0]);
for(int i=1;i<tokens.length;i++){
outText=outText+tokens[i]+" ";
}
}catch(Exception e){
outText=s.toString();
}
}
}else{
outText=s.toString();
}
outText=outText.trim();
if(hMap.containsKey(outText)){
int cnt=hMap.get(outText);
cnt++;
hMap.put(outText,cnt);
}else{
hMap.put(outText,1);
}
}
hMap= (HashMap<String, Integer>) StaticConstants.sortByValue(hMap);
ArrayList<String>tweets=new ArrayList<String>();
ArrayList<Integer>frequencies=new ArrayList<Integer>();
ArrayAdapter<String>adapter;
int count=0;
for(String s:hMap.keySet()){
tweets.add(s);
frequencies.add(hMap.get(s));
count++;
if(count==50)
break;
}
adapter=new MyCustomFrequentArrayAdapter(this,tweets,frequencies);
listView.setAdapter(adapter);
listViewLabel.setText("Most Frequent Tweets");
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, final View view,
int position, long id) {
final String item = (String) parent.getItemAtPosition(position);
editText.setText(System.currentTimeMillis()+" "+item);
}
});
}
}
这是我的MyCustomFrequentArrayAdapter:
class MyCustomFrequentArrayAdapter extends ArrayAdapter<String> {
private final Context context;
private final ArrayList<String> values;
private final ArrayList<Integer>frequencies;
public MyCustomFrequentArrayAdapter(Context context, ArrayList<String> values,ArrayList<Integer>frequencies) {
super(context, R.layout.customlistview, values);
this.context = context;
this.values = values;
this.frequencies=frequencies;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.customlistview, parent, false);
TextView textView1 = (TextView) rowView.findViewById(R.id.firstLine);
TextView textView2 = (TextView) rowView.findViewById(R.id.secondLine);
Log.d("Position",""+position);
//Extracting first six words
String s=values.get(position);
String tokens[]=s.split(" ");
String dispText="";
if(tokens.length>6){
for(int i=0;i<6;i++){
dispText=dispText+tokens[i]+" ";
}
}else{
dispText=s;
}
textView2.setText(dispText);
textView1.setText("Frequency:"+frequencies.get(position));
return rowView;
}
}
答案 0 :(得分:1)
引用Romain Guy撰写的博客文章 - Why Is My List Black
ListView
有顶部和底部渐变边缘,表示它可以滚动。
创建渐弱边缘会产生性能问题,因此ListView
会进行优化以提高性能。遗憾的是,如果ListView
的背景设置为默认值以外的其他值,则优化会导致问题。
可以通过设置android:cacheColorHint="#00000000"
来禁用优化,因为您正在做博客文章中的引用...
要解决此问题,您只需禁用缓存颜色提示优化,如果使用非纯色背景,或将提示设置为适当的纯色值。
换句话说,使用android:cacheColorHint="#00000000"
只能用于&#34;非纯色&#34; (透明/半透明的)。
在您的情况下,您使用的是#ffffff
这是一个RGB值,默认情况下,这意味着它的&#39; A&#39;组件(alpha)将ff
使其完全不透明,即&#34; solid&#34;。
所以参考上面引用的最后一部分......
...将提示设置为适当的纯色值。
这表明您应该使用android:cacheColorHint="#ffffff"
来解决ListView
问题。