我相信我的问题是将xml视图与我的活动正确连接。我认为simple_list_item_1.xml是Android用来命名布局的默认方式,但也许我错了...
我一直在关注这个教程,现在我的代码中没有错误,应用程序在我的手机上运行(整体说明很棒,但它的布局很大程度上取决于想象力):
但是当我运行我的应用程序时,它看起来像这样:
在设计模式中,item_contact.xml如下所示:
我发布了相关文件的确切项目代码。任何帮助,我将非常感激(这可能与问题有关 - 我的应用程序底部的灰色矩形更浅的阴影?)
MainActivity.java:
package com.example.chris.contactswithcursorloader;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.database.Cursor;
import android.provider.ContactsContract;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
public class MainActivity extends AppCompatActivity {
// ... existing code ...
private SimpleCursorAdapter adapter;
// Defines the asynchronous callback for the contacts data loader
private LoaderManager.LoaderCallbacks<Cursor> contactsLoader =
new LoaderManager.LoaderCallbacks<Cursor>() {
// Create and return the actual cursor loader for the contacts data
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
// Define the columns to retrieve
String[] projectionFields = new String[]{ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts.PHOTO_URI};
// Construct the loader
CursorLoader cursorLoader = new CursorLoader(MainActivity.this,
ContactsContract.Contacts.CONTENT_URI, // URI
projectionFields, // projection fields
null, // the selection criteria
null, // the selection args
null // the sort order
);
// Return the loader for use
return cursorLoader;
}
// When the system finishes retrieving the Cursor through the CursorLoader,
// a call to the onLoadFinished() method takes place.
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
// The swapCursor() method assigns the new Cursor to the adapter
adapter.swapCursor(cursor);
}
// This method is triggered when the loader is being reset
// and the loader data is no longer available. Called if the data
// in the provider changes and the Cursor becomes stale.
@Override
public void onLoaderReset(Loader<Cursor> loader) {
// Clear the Cursor we were using with another call to the swapCursor()
adapter.swapCursor(null);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.item_contact);
setupCursorAdapter();
// Initialize the loader with a special ID and the defined callbacks from above
getSupportLoaderManager().initLoader(CONTACT_LOADER_ID,
new Bundle(), contactsLoader);
// Find list and bind to adapter
ListView lvContacts = (ListView) findViewById(R.id.lvContacts);
if(lvContacts != null) {
lvContacts.setAdapter(adapter);
}
}
// Create simple cursor adapter to connect the cursor dataset we load with a ListView
private void setupCursorAdapter() {
// Column data from cursor to bind views from
String[] uiBindFrom = { ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts.PHOTO_URI };
// View IDs which will have the respective column data inserted
int[] uiBindTo = { R.id.tvName, R.id.ivImage };
// Create the simple cursor adapter to use for our list
// specifying the template to inflate (item_contact),
adapter = new SimpleCursorAdapter(
this, R.layout.item_contact,
null, uiBindFrom, uiBindTo,
0);
}
public static final int CONTACT_LOADER_ID = 78; // From docs: A unique identifier for this loader. Can be whatever you want.
}
item_contact.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView android:id="@+id/lvContacts"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:layout_weight="1">
</ListView>
<!--android:background="#ff3399"-->
</LinearLayout>
simple_list_item_1.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView android:id="@+id/tvName"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="TextView"/>
<TextView android:id="@+id/ivImage"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="TextView_callnumber"/>
</LinearLayout>
的AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.chris.contactswithcursorloader" >
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
答案 0 :(得分:2)
adapter = new SimpleCursorAdapter(
this, R.layout.item_contact,
null, uiBindFrom, uiBindTo,
0);
布局应该是项目的布局,而不是活动的主要布局。你想在这里使用simple_list_item1。