【问题标题】:Android: only some rows are displayed at first runAndroid:第一次运行时只显示一些行
【发布时间】:2015-12-04 15:01:44
【问题描述】:

Listview 显示的是一些行而不是所有项目(有时,它什么也不显示),我不明白为什么会发生这种情况。它在第一次运行时发生。之后,它运行良好,数据库中的所有项目都填满了屏幕。我在我的线性布局 xml 文件和 wrap_content 高度中放置了垂直方向。但问题并没有解决。

这是我的主要活动:

public class MainActivity extends Activity {

public static final String PREFS_NAME = "MyPrefsFile1";

private TextView mTextView;
private ListView mListView;


ArrayList<WordDefinition> allWordDefinitions=new ArrayList<WordDefinition>();

DictionaryDatabase DictionaryDatabase;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);    
    setContentView(R.layout.main);
    mTextView = (TextView) findViewById(R.id.text);
    mListView = (ListView) findViewById(R.id.list);
    DictionaryDatabase=new DictionaryDatabase(this); 
    allWordDefinitions=DictionaryDatabase.getAllWords(); 

    Collections.sort(allWordDefinitions, new CustomComparator());    
        mListView.setAdapter(new BaseAdapter() {

        @Override
        public View getView(int position, View view, ViewGroup arg2) {
            if (view==null) {
                view=getLayoutInflater().inflate(R.layout.list_item, arg2, false);
            }
            TextView textView=(TextView) view.findViewById(R.id.listItemTextView);
            textView.setText(allWordDefinitions.get(position).word);

            return view;
        }

        @Override
        public long getItemId(int arg0) {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public Object getItem(int arg0) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return allWordDefinitions.size();
        }
    });

    mListView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View view, int position,
                long arg3) {
            Intent intent =new Intent(MainActivity.this, WordDefinitionDetailActivity.class);
            intent.putExtra("word", allWordDefinitions.get(position).word);
            intent.putExtra("definition", allWordDefinitions.get(position).definition);


            startActivity(intent);
        }
    });


    handleIntent(getIntent());
}

@Override
protected void onNewIntent(Intent intent) {
    handleIntent(intent);
}

private void handleIntent(Intent intent) {
    if (Intent.ACTION_VIEW.equals(intent.getAction())) {
        Intent wordIntent = new Intent(this, WordActivity.class);
        this.finish();
        wordIntent.setData(intent.getData());
        startActivity(wordIntent);
    } else if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
        String query = intent.getStringExtra(SearchManager.QUERY);
        showResults(query);

    }
}

private void showResults(String query) {

    Cursor cursor = managedQuery(DictionaryProvider.CONTENT_URI, null, null,
                            new String[] {query}, null);

    if (cursor == null) {
        mTextView.setText(getString(R.string.no_results, new Object[] {query}));
    } else {
        int count = cursor.getCount();
        String countString = getResources().getQuantityString(R.plurals.search_results,
                                count, new Object[] {count, query});
        mTextView.setText(countString);

        String[] from = new String[] { DictionaryDatabase.KEY_WORD,
                                       DictionaryDatabase.KEY_DEFINITION };

        int[] to = new int[] { R.id.word,
                               R.id.definition };

        SimpleCursorAdapter words = new SimpleCursorAdapter(this,
                                      R.layout.result, cursor, from, to);
        mListView.setAdapter(words);

        mListView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Intent wordIntent = new Intent(getApplicationContext(), WordActivity.class);
                Uri data = Uri.withAppendedPath(DictionaryProvider.CONTENT_URI,
                                                String.valueOf(id));
                wordIntent.setData(data);
                startActivity(wordIntent);

            }
        });
    }
}


public class CustomComparator implements Comparator<WordDefinition> {          

   @Override
       public int compare(WordDefinition p1, WordDefinition p2) {
          return p1.word.compareTo(p2.word);
       }
    }

}

WorDefinition(数组列表):

public class WordDefinition {
String word,definition;

public WordDefinition(String word,ArrayList<String> alldefinition) {
    this.word=word;

    StringBuilder stringBuilder=new StringBuilder();
    for (String string : alldefinition) {
        stringBuilder.append(string);
    }       
    this.word=stringBuilder.toString();

}

public WordDefinition(String word,String alldefinition) {
    this.word=word;     
    this.definition=alldefinition;

   } 


 }

字典数据库 (sn-p)

public ArrayList<WordDefinition> getAllWords() {
ArrayList<WordDefinition> arrayList=new ArrayList<WordDefinition>();
SQLiteDatabase database=mDatabaseOpenHelper.getReadableDatabase();

String selectAllQueryString="SELECT * FROM "+FTS_VIRTUAL_TABLE;
Cursor cursor=database.rawQuery(selectAllQueryString, null);

if (cursor.moveToFirst()) {
    do {            
        WordDefinition wordDefinition=new WordDefinition(cursor.getString(cursor.getColumnIndex(KEY_WORD)), cursor.getString(cursor.getColumnIndex(KEY_DEFINITION)));
        arrayList.add(wordDefinition);              
    } while (cursor.moveToNext());          
}   
return arrayList;
}

主要 XML

  <?xml version="1.0" encoding="utf-8"?>
  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/fundoeua"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    >

    <LinearLayout
    android:id="@+id/Line1"        
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/text"
        android:textColor="#FFFFFF"
        android:gravity="right"
        android:textAlignment="gravity"
        android:paddingTop="5dp"
        android:paddingBottom="5dp"
        android:paddingRight="15dp"
        android:textStyle="bold"
        android:textSize="20sp"
        android:text="@string/chamada"
        android:background="@color/vermelho"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />



<ListView
        android:id="@+id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"

        android:divider="#ff0000"
            android:dividerHeight="4px" 
         />

</LinearLayout>





</RelativeLayout>

list_item.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/seletor2"
    android:orientation="vertical" >

    <TextView
    android:id="@+id/listItemTextView"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="5dp"        
    android:textColor="@color/preto"
    android:text="Large Text"
    android:textAppearance="?android:attr/textAppearanceLarge" />

   </LinearLayout>

【问题讨论】:

  • 可能是ListView高度计算不正确。然后 ListView 显示所有项目,但您需要滚动它才能观看最后的项目。对不起我的英语不好)
  • @mlevytskiy 不要担心你的英语。我将更新我的问题,提供我的 xml 布局。你能告诉我高度计算错误的地方吗?
  • @mlevytskiy 看看我的 xml 文件。 ListView 是@id/dictionaryListView
  • 是的,我看。一瞬间 =)
  • 对不起,但我现在不明白为什么 ListView 计算高度不正确。这个问题必须更深入的调查

标签: android sqlite android-listview


【解决方案1】:

ListView 有时高度计算不正确。

Android: wrap_content is not working with ListView

您可以使用一个适配器和一个 ListView 而不是两个 ListView。使用此适配器中项目的类型。通过这种方式,您可以删除 wrap_content 并在 ListView 中为 height 属性设置 match_parent

【讨论】:

  • 不幸的是,这不是解决方案。我从这个链接完成了每一步,并删除了 ListView 中高度属性的 wrap_content e 更改为 match_parent。没有成功!
  • 我尝试重现这个错误。但是 ListView 工作正常(
  • 这个错误是否只在一个具体的设备中重现?
  • 或者可能是应用启动时数据库未填满
  • 只是为了好奇,当我在按 KEY_WORD + "ASC" 排序的 DataBaseActivity 中实现 Collections.sort e 时,问题就开始了。所以,它只在第一次运行时发生。
猜你喜欢
  • 1970-01-01
  • 2017-10-12
  • 2012-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 2012-12-18
相关资源
最近更新 更多