Я использую пользовательский ArrayAdapter
для моего ListView
. У меня есть CheckBox
слева и два TextView
пунктов справа от CheckBox
, уложенных друг на друга. Я также использую таможню android:listSelector
.Android View не будет прокручиваться жестом и не будет прокручиваться. Использование ListView с ArrayAdapter
Вставить 8 элементов в мой заказ ListView
в 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>
Мой пользовательский списокSelector 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>
Это действительно звучит так, как будто что-то в вашем адаптере происходит неправильно, но если это невозможно, я не вижу, где .... – Barak
Выполняет ли действие прокрутки фокус, который будет включен определенным образом? – erin