我正在为ArrayAdapter
使用自定义ListView
。我左边有CheckBox
,TextView
右边有两个CheckBox
项,彼此叠加。我也在使用自定义android:listSelector
。
我在ListView
MyActivity
方法中将8个项目插入自定义onCreate
。
我可以选择列表中的一行以便更改颜色,我也可以选中并取消选中该复选框。但是,当我用手指将鼠标悬停在项目上时,视图不响应垂直滑动,也不会使项目聚焦。我可以滚动,如果我同时点击该项目并用我的另一个手指向下滚动,但这不是我想要的。我是否以某种方式破坏了垂直滑动手势?
我想指出我的问题中没有ScrollView
个对象。大多数帖子都与那些将ListView
对象放在ScrollView
内的人有关,反之亦然。
我怀疑我的布局有问题和/或我在布局和代码中分配焦点的方式有问题。
这是我的主要活动代码:
import java.util.ArrayList;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.ListView;
import android.widget.TextView;
public class MyActivity extends Activity{
private ListView lv;
private TextView titleDisplay;
private TextView locationDisplay;
private ArrayList<TalkItem> m_talks = null;
private MyListView m_adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.session_view);
lv = (ListView) findViewById(R.id.sessionlist);
titleDisplay = (TextView) findViewById(R.id.sessiontitle);
locationDisplay = (TextView) findViewById(R.id.sessionlocation);
m_talks = new ArrayList<TalkItem>();
this.m_adapter = new MyListView(this, R.layout.sessionlistitem, m_talks);
lv.setAdapter(this.m_adapter);
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
//TODO: do something
}
});
//set title and location display
titleDisplay.setText("TITLE");
locationDisplay.setText("LOCATION");
m_talks.add(new TalkItem("first1", "last1", false));
m_talks.add(new TalkItem("first2", "last2", false));
m_talks.add(new TalkItem("first3", "last3", false));
m_talks.add(new TalkItem("first4", "last4", false));
m_talks.add(new TalkItem("first5", "last5", false));
m_talks.add(new TalkItem("first6", "last6", false));
m_talks.add(new TalkItem("first7", "last7", false));
m_talks.add(new TalkItem("first8", "last8", false));
}
public class MyListView extends ArrayAdapter<TalkItem> {
private ArrayList<TalkItem> items;
public MyListView(Context context, int textViewResourceId,
ArrayList<TalkItem> items) {
super(context, textViewResourceId, items);
this.items = items;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TalkItem talkItem = items.get(position);
CheckBox checkBox;
TextView topText;
TextView bottomText;
if (convertView == null) {
LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = vi.inflate(R.layout.sessionlistitem, null);
checkBox = (CheckBox) convertView.findViewById(R.id.icon);
topText = (TextView) convertView.findViewById(R.id.toptext);
bottomText = (TextView) convertView.findViewById(R.id.bottomtext);
// Optimization: Tag the row with it's child views, so we don't have to
// call findViewById() later when we reuse the row.
convertView.setTag(new TalkItemViewHolder(checkBox, topText, bottomText));
// If CheckBox is toggled, update the listitem it is tagged with.
checkBox.setOnClickListener( new View.OnClickListener() {
public void onClick(View v) {
CheckBox cb = (CheckBox) v ;
TalkItem ti = (TalkItem) cb.getTag();
ti.setChecked( cb.isChecked() );
}
});
}
// Reuse existing row view
else {
// Because we use a ViewHolder, we avoid having to call findViewById().
TalkItemViewHolder viewHolder = (TalkItemViewHolder) convertView.getTag();
checkBox = viewHolder.getCheckBox();
topText = viewHolder.getTopText();
bottomText = viewHolder.getBottomText();
}
// Tag the CheckBox with the Planet it is displaying, so that we can
// access the planet in onClick() when the CheckBox is toggled.
if(talkItem!=null){
if(checkBox!=null){
checkBox.setTag(talkItem);
// Display item data
checkBox.setChecked( talkItem.isChecked() );
}
if(topText!=null)
topText.setText(talkItem.getAuthor());
if(bottomText!=null)
bottomText.setText(talkItem.getTitle());
}
convertView.setBackgroundResource(android.R.color.transparent);
return convertView;
}
}
public class TalkItemViewHolder {
private CheckBox checkBox;
private TextView topText;
private TextView bottomText;
public TalkItemViewHolder(){}
public TalkItemViewHolder(CheckBox checkBox, TextView topText, TextView bottomText){
this.checkBox = checkBox;
this.topText = topText;
this.bottomText = bottomText;
}
public CheckBox getCheckBox(){
return checkBox;
}
public TextView getTopText(){
return topText;
}
public TextView getBottomText(){
return bottomText;
}
public void setCheckBox(CheckBox checkBox){
this.checkBox = checkBox;
}
public void setTopText(TextView topText){
this.topText = topText;
}
public void setBottomText(TextView bottomText){
this.bottomText = bottomText;
}
}
public class TalkItem {
private String title;
private String author;
private boolean checked = false;
public TalkItem(){
title = "";
author = "";
}
public TalkItem(String title, String author, boolean checked){
this.title = title;
this.author = author;
this.checked = checked;
}
public String getTitle(){
return title;
}
public String getAuthor(){
return author;
}
public void setTitle(String title){
this.title = title;
}
public void setAuthor(String author){
this.author = author;
}
public boolean isChecked(){
return checked;
}
public void setChecked(boolean checked){
this.checked = checked;
}
public void toggleChecked(){
checked = !checked;
}
}
}
这是主视图的父级布局,名为session_view.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/sessionviewlayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/white"
android:orientation="vertical" >
<TextView
android:id="@+id/sessiontitle"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:gravity="center"
android:textSize="20dp" />
<TextView
android:id="@+id/sessionlocation"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/sessiontitle"
android:gravity="center"
android:textSize="16dp" />
<ListView
android:id="@+id/sessionlist"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/sessionlocation"
android:cacheColorHint="@color/transparent"
android:descendantFocusability="blocksDescendants"
android:dividerHeight="3.0sp"
android:drawSelectorOnTop="false"
android:listSelector="@drawable/list_selector"
android:minHeight="1in" />
</RelativeLayout>
以下是列表中每个项目的布局,标题为sessionlistitem.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="?android:attr/listPreferredItemHeight"
android:background="@color/white"
android:padding="2dip" >
<CheckBox
android:id="@+id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:button="@android:drawable/btn_star"
android:focusable="false"
android:padding="10dp" />
<LinearLayout
android:layout_width="0dip"
android:layout_height="95dp"
android:layout_weight="0.99"
android:clickable="false"
android:focusable="false"
android:orientation="vertical" >
<TextView
android:id="@+id/toptext"
android:layout_width="wrap_content"
android:layout_height="0dip"
android:layout_weight="1"
android:clickable="false"
android:focusable="false"
android:gravity="center_vertical"
android:singleLine="false"
android:textColor="@color/black"
android:textSize="18dp" />
<TextView
android:id="@+id/bottomtext"
android:layout_width="wrap_content"
android:layout_height="0dip"
android:layout_weight="1"
android:clickable="false"
android:ellipsize="marquee"
android:focusable="false"
android:singleLine="false"
android:textColor="@color/black"
android:textSize="16dp" />
</LinearLayout>
</LinearLayout>
我的自定义listSelector list_selector.xml
是
<?xml version="1.0" encoding="utf-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_pressed="true"
android:drawable="@drawable/list_selector_pressed" />
<item
android:state_focused="true"
android:drawable="@drawable/list_selector_pressed" />
<item
android:drawable="@android:color/transparent" />
</selector>
list_selector_pressed.xml
是
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/blue"/>
</shape>
strings.xml
是
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World!</string>
<string name="app_name">My APP</string>
<color name="gray">#aaaaaa</color>
<color name="white">#ffffff</color>
<color name="blue">#5BB5D7</color>
<color name="transparent">#00000000</color>
<color name="black">#000000</color>
</resources>
答案 0 :(得分:2)
添加所有内容后,需要初始化ArrayAdapter
。具体来说,行:
this.m_adapter = new MyListView(this, R.layout.sessionlistitem, m_talks);
lv.setAdapter(this.m_adapter);
在所有onCreate
之后,应该是m_talks.add(...)
方法中的最后一行。
xml
布局文件没有任何问题。
答案 1 :(得分:0)
我认为问题是由您的listview高度设置为相对布局中的wrap_content引起的。这对于listview来说并不合理,因为它的内容通常大于屏幕上的高度。这里可能的一个解决方法是将您的顶级RelativeLayout更改为LinearLayout,然后列表视图中的高度设置可以是:
android:layout_height="0dp"
android:layout_weight="1"
将使用列表视图的所有剩余空间。