2015-06-14 55 views
-2

我無法弄清楚我的ListView出了什麼問題,因爲它太小了。我想要更大的項目,比如Android上的默認列表視圖。樣式項Android中的視圖ListView

SelectContactActivity

public class SelectContactActivity extends Activity { 

private ArrayList<Contact> listContacts = new ArrayList<Contact>(); 

private ArrayList<SongInfo> listSong = new ArrayList<SongInfo>(); 
private ListContactsAdapter adapter; 
private Util util = new Util(); 
private ListView list; 
private EditText txt_search; 
private ArrayList<Contact> listSearch; 

private Handler guiThread; 

private Runnable updateTask; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
// TODO Auto-generated method stub 
super.onCreate(savedInstanceState); 
this.setContentView(R.layout.mycontacts); 

list = (ListView)findViewById(R.id.list); 
txt_search = (EditText)findViewById(R.id.txt_search); 

final int position = this.getIntent().getIntExtra("position", 0); 

listSong = util.getAllSong(this); 

listContacts = util.getAllContact(this); 

Log.i("LOG", "Size: " + listContacts.size()); 

adapter = new ListContactsAdapter(this, android.R.layout.simple_list_item_1, listContacts); 
list.setAdapter(adapter); 
list.setTextFilterEnabled(true); 

list.setOnItemClickListener(new OnItemClickListener() { 
@Override 
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
long arg3) { 
// TODO Auto-generated method stub 
util.assignRingtoneToContact(SelectContactActivity.this, 
listSong.get(position), listContacts.get(arg2)); 
Toast.makeText(
SelectContactActivity.this, 
"Ringtone set successfully", 
Toast.LENGTH_LONG).show(); 
finish(); 
} 
}); 

innitThread(); 

txt_search.addTextChangedListener(new TextWatcher() { 

@Override 
public void onTextChanged(CharSequence s, int start, int before, 
int count) { 
queueUpdate(500); 
} 

@Override 
public void beforeTextChanged(CharSequence s, int start, int count, 
int after) { 

} 

@Override 
public void afterTextChanged(Editable s) { 

} 
}); 

} 

private void queueUpdate(long delayMillisecond) { 
guiThread.removeCallbacks(updateTask); 
// update data if no change in textSearch after time config 
// timer by = milliseconds 
guiThread.postDelayed(updateTask, delayMillisecond); 
} 

private void innitThread() { 
guiThread = new Handler(); 
updateTask = new Runnable() { 

@Override 
public void run() { 

String word = txt_search.getText().toString().trim(); 
if (word.equalsIgnoreCase("")) { 
// if not change set listView first 
list.setAdapter(new ListContactsAdapter(SelectContactActivity.this, 
android.R.layout.simple_list_item_1, listContacts)); 
} else 
// if txtSearch not null 
{ 

// get data from webservice 
getDataByKeywords(word); 
// Show on list 
listSearch = new ArrayList<Contact>(); 

// get data from webservice 
listSearch = getDataByKeywords(word); 

list.setAdapter(new ListContactsAdapter(SelectContactActivity.this, android.R.layout.simple_list_item_1, listSearch)); 
adapter.notifyDataSetChanged(); 
} 

} 
}; 
} 

public ArrayList<Contact> getDataByKeywords(String keyword) { 
listSearch = new ArrayList<Contact>(); 
keyword = keyword.toUpperCase(); 
for (int i = 0; i < listContacts.size(); i++) { 
String contain = listContacts.get(i).getName().toUpperCase(); 
if (contain.contains(keyword)) { 
listSearch.add(listContacts.get(i)); 
} 
} 
return listSearch; 
} 

} 

ListContactsAdapter

public class ListContactsAdapter extends ArrayAdapter<Contact>{ 

private ArrayList<Contact> contacts; 
private Context context; 

public ListContactsAdapter(Context context, int textViewResourceId, 
ArrayList<Contact> objects) { 
super(context, textViewResourceId, objects); 
this.context = context; 
this.contacts = objects; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
// TODO Auto-generated method stub 
if(convertView!=null){ 
convertView.setBackgroundResource(R.drawable.list_selector); 
} 

TextView textView = getGenericView(); 
textView.setBackgroundResource(R.drawable.list_selector); 
textView.setText(contacts.get(position).getName()); 
return textView; 
} 

public TextView getGenericView() { 
// Layout parameters for the ExpandableListView 
AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT, 70); 

TextView textView = new TextView(context); 
textView.setLayoutParams(lp); 
// Center the text vertically 
textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT); 
// Set the text starting position 
textView.setPadding(16, 0, 0, 0); 
textView.setTextSize(18); 
textView.setShadowLayer(1, 1, 1, Color.BLACK); 
textView.setTextColor(0xffeeeeee); 
return textView; 
} 

} 

mycontacts.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" > 

<RelativeLayout 
android:id="@id/relativeLayoutSearch" 
android:layout_width="fill_parent" 
android:layout_height="55dp" 
android:gravity="center_vertical" 
android:paddingLeft="12dp" 
android:paddingRight="12dp" > 

<EditText 
android:id="@id/txt_search" 
android:layout_width="fill_parent" 
android:layout_height="40dp" 
android:background="@drawable/search_bar" 
android:hint="@string/hint_apps_search" 
android:paddingBottom="12dp" 
android:paddingLeft="45.0dip" 
android:paddingRight="14dp" 
android:paddingTop="12dp" 
android:singleLine="true" 
android:textSize="15.0sp" /> 

<Button 
android:id="@id/button2" 
android:layout_width="40dp" 
android:layout_height="40dp" 
android:background="@drawable/zoomicon" /> 

</RelativeLayout> 

<ListView 
android:id="@id/list" 
style="@style/ContactList" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:layout_below="@id/relativeLayoutSearch" 
android:cacheColorHint="#e0000000" /> 
</RelativeLayout> 

styles.xml

<style name="ContactList"> 
    <!-- <item name="android:background">@color/listbg</item> --> 
    <item name="android:layout_width">fill_parent</item> 
    <item name="android:layout_height">fill_parent</item> 
    <item name="android:cacheColorHint">#e0000000</item> 
    <item name="android:divider">@color/listdiv</item> 
    <item name="android:dividerHeight">1.0dip</item> 
    </style> 

這是我的聯繫人列表的代碼,這裏是一個截圖,看起來如何,但我想要列表中的更大的項目。有什麼建議麼?

當前列表視圖:

Current listview

+0

這個代碼是否與這個問題有關?請僅包含[必需的最小代碼量](http://stackoverflow.com/help/mcve)來複制問題。 – IronFlare

+0

我不知道哪裏出了問題,所以我包含了所有與發佈相關的代碼:( – Anna6541

+0

in mycontacts.xml更改'RelativeLayout'元素的'android:layout_height =「150dp」' – zaingz

回答

0

我將開始變小,通過重新審視你的適配器。 ListView本身非常簡單 - 在您的活動佈局中,您將ListView設置爲寬度和高度均爲match_parent


適配器是其產生每一行,這在ListAdapter,由getView()方法發起的部件。

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if (convertView != null) { 
     convertView.setBackgroundResource(R.drawable.list_selector); 
    } 

    TextView textView = getGenericView(); 
    textView.setBackgroundResource(R.drawable.list_selector); 
    textView.setText(contacts.get(position).getName()); 
    return textView; 
} 

注意你在這裏做的是不正確的;你做了一些convertView,但你忽略它,只是做一個新的視圖。該模式更像是:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View rowView = convertView; 
    if (rowView == null) { 
     rowView = // create a new View that represents your row 
    } 
    // bind the data to rowView, then return it 
    return rowView; 
} 

而你的情況可能是:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    TextView rowView = (TextView) convertView; 
    if (rowView == null) { 
     rowView = getGenericView(); 
     rowView.setBackgroundResource(R.drawable.list_selector); 
    } 
    rowView.setText(contacts.get(position).getName()); 
    return rowView; 
} 

看,你只需要創建rowView,如果它是空。此外,背景只需設置一次(如果需要,這可以用XML完成)。


隨着創建行視圖,我建議首先膨脹包含單個TextView作爲唯一元素的佈局。

view_item_contact.xml:

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" /> 

那麼你getGenericView()可以重命名爲createContactRowView()

private TextView createContactRowView(ViewGroup parent) { 
    LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext()); 
    return ((TextView) layoutInflater.inflate(R.layout.view_item_contact, parent, false)); 
} 

從那裏,你可以開始添加填充樣式在view_item_contact.xml你行,設立最低高度,通過應用重力垂直居中文本等。

view_item_contact。XML:

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:minHeight="48dp" 
    android:gravity="center_vertical" 
    android:paddingLeft="16dp" 
    android:paddingRight="16dp" 
    android:background="@drawable/list_selector" /> 

在幾乎所有情況下,我會避免編程方式創建視圖 - 總是從XML膨脹,所以你可以從你的邏輯分離的樣式和佈局。

+0

wow @ataulm非常感謝您的解釋!一些新的知識,謝謝!我只有一個錯誤:代碼中的ListContactsAdapter類型的createContactRowView(ViewGroup)方法不適用於參數() – Anna6541

+0

'createContactRowView(ViewGroup)'是你自己的方法,所以你應該使它適用 - 在'createContactRowView(parent)'中傳遞ViewGroup'parent'' – ataulm