2012-05-24 2 views
2

Я использую пользовательский 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> 
+0

Это действительно звучит так, как будто что-то в вашем адаптере происходит неправильно, но если это невозможно, я не вижу, где .... – Barak

+0

Выполняет ли действие прокрутки фокус, который будет включен определенным образом? – erin

ответ

2

ArrayAdapter необходимо инициализировать после того, как все будет добавлено. В частности, линии:

this.m_adapter = new MyListView(this, R.layout.sessionlistitem, m_talks); 
lv.setAdapter(this.m_adapter); 

должны были последние строки в методе onCreate, после того, как все m_talks.add(...).

В файлах макетов xml ничего плохого не было.

0

Я считаю, что проблема вызвана, установив высоту ListView в wrap_content в вашей относительной макете. Это не имеет смысла для списка, потому что его содержимое обычно больше, чем его высота на экране. Одним из возможных решений здесь, чтобы изменить верхний RelativeLayout в LinearLayout, то настройки высоты на ListView может быть:

android:layout_height="0dp" 
android:layout_weight="1" 

который будет использовать все оставшееся пространство для ListView.

+0

Я пробовал это, и это не устраняет проблему :( – erin

+0

Было ли это иметь какой-либо эффект или точно так же? Вы также можете попробовать установить небольшую статическую высоту в качестве теста, например 50dp, и посмотреть, есть ли прокрутка. –

+0

У меня есть возможность прокрутки, но не как обычный listView. Я использую эмулятор, и я могу только прокручивать его, когда я удерживаю кнопку клика, а также подметаю пальцы. по умолчанию ListView прокручивает с широким движением по экрану, но мое приложение этого не делает. Возможно, связанная с этим проблема заключается в том, что мне также хотелось бы, чтобы мои строки были сфокусированы и меняли цвет, когда мои пальцы парили над элементами строки. – erin

Смежные вопросы