私はArrayAdapter
自分のカスタムを使用していListView
ます。CheckBox
左側に2つのアイテムTextView
、右側に2つのアイテムがありCheckBox
、積み重ねられています。カスタムも使用していますandroid:listSelector
。
ListView
カスタムインMyActivity
onCreate
メソッドに8つのアイテムを挿入します。
リストの行を選択して色を変更したり、チェックボックスをオンまたはオフにすることもできます。ただし、ビューは垂直方向のスワイプに応答しません。また、指でアイテムにカーソルを合わせたときにアイテムにフォーカスが表示されることもありません。アイテムをクリックすると同時に他の指で下にスクロールするとスクロールできますが、これは必要ありません。どういうわけか、垂直スワイプジェスチャを壊しましたか?
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>
私のカスタムlistSelectorlist_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>