0

这可能是一个重复的问题,但我查看了很多SO问题,但没有找到任何帮助。ActionBar 2个选项卡,每个选项卡中的列表,onClick并不总是触发

我有一个应用程序使用ActionBar有2个选项卡。每个都是一个ListFragment,我无法选择它们上的任何项目。他们会填充很好,但onListItemClick只是不会触发。如果我将setOnItemClickListener直接用于ListView,它也不会触发。但是,如果我只是扩展Fragment而不是ListFragment,如果我将onClickListener附加到每行,那么onClick将会触发。但它会允许多行可点击,这不是我想要发生的事情。任何人都可以帮我弄清楚我做错了什么吗?提前致谢。

这是我的MainActivity:

public class MainActivity extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // Get the action bar 
     Drawable drawable = getResources().getDrawable(R.drawable.action_bar); 
     ActionBar bar = getActionBar(); 
     bar.setBackgroundDrawable(drawable); 
     bar.addTab(bar.newTab().setText("Tab 1").setTabListener(new TabHandler())); 
     bar.addTab(bar.newTab().setText("Tab 2").setTabListener(new TabHandler())); 
     bar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_USE_LOGO); 
     bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
     bar.setDisplayShowHomeEnabled(true); 
     bar.setDisplayHomeAsUpEnabled(true); 
     bar.setDisplayShowTitleEnabled(false); 
    } 
} 

这是我的TabHandler:

public class TabHandler implements ActionBar.TabListener { 
    public Fragment mFragment; 

    public TabHandler() { } 

    @Override 
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
     switch (tab.getPosition()) { 
      case 0: 
       if(mFragment == null) { 
        mFragment = new ListFragmentA(); 
        fragmentTransaction.add(android.R.id.content, mFragment, null); 
       } 
       else { 
        fragmentTransaction.show(mFragment); //Looking into detach and attach as well 
       } 
       break; 
      case 1: 
       if(mFragment == null) { 
        mFragment = new ListFragmentB(); 
        fragmentTransaction.add(android.R.id.content, mFragment, null); 
       } 
       else { 
        fragmentTransaction.show(mFragment); 
       } 
       break; 

      default: 
       break; 
     } 
    } 

    @Override 
    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
     if (mFragment != null) { 
      mFragment.getFragmentManager().popBackStackImmediate(); 
      fragmentTransaction.hide(mFragment); 
     } 
    } 

    @Override 
    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
     mFragment.getFragmentManager().popBackStackImmediate(); 
    } 
} 

这是我的片段之一的一个示例:

public class ListFragmentA extends ListFragment { 
MyCustomAdapter myCustomAdapter; 
ListView myListView; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.my_list_background,container,false); 
} 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    if(getActivity() != null) { 
     myListView = (ListView)getActivity().findViewById(android.R.id.list); 
     if(myListView != null) { 
      CrudService itemService = new CrudService<TestItem>(TestItem.class); 
      ArrayList<TestItem> myItems = (ArrayList<TestItem>) itemService.FindAll(); 
      myCustomAdapter = new MyCustomAdapter(getActivity(), myItems); 
      myListView.setAdapter(myCustomAdapter); 
      myListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
      myListView.setOnItemClickListener(new OnItemClickListener(){ 
       @Override 
       public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
        Log.i("ListFragmentA", "MyListView onItemClick"); 
       }     
      }); 
     } 
    } 
} 
//This isn't getting fired 
@Override 
public void onListItemClick(ListView l, View v, int position, long id) { 
    Log.i("ListFragmentA", "onListItemClick at position " + position); 
} 

public class MyCustomAdapter extends ArrayAdapter<TestItem> { 
    Context mContext; 
    ArrayList<TestItem> mItems; 

    public MyCustomAdapter(Context context, ArrayList<TestItem> items) { 
     super(context, android.R.id.list, items); 
     mContext = context; 
     mItems = items; 
    } 

    public int getCount() { 
     return mItems.size(); 
    } 

    public TestItem getItem(int position) { 
     return mItems.get(position); 
    } 

    public long getItemId(int position) { 
     return mItems.get(position).getId(); 
    } 

    public View getView(final int position, View convertView, ViewGroup arg2) { 
     View rowView = convertView; 
     if(rowView == null) { 
      LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      rowView = inflater.inflate(R.layout.single_item, null); 

      TestItemViewHolder viewHolder = new TestItemViewHolder(); 

      viewHolder.Name = (TextView)rowView.findViewById(R.id.txt_TestItem_Name); 
      //I have a few more things 
      rowView.setTag(viewHolder); 
     } 

     TestItemListViewHolder holder = (TestItemListViewHolder)rowView.getTag(); 

     TestItem gottenItem = getItem(position); 
     holder.Name.setText(gottenItem.getName()); 
     //I have a few more things 
     //However, this will fire if not a ListFragment 
     rowView.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       Log.i("ListFragmentA", "RowView onClick at position " + position); 
      } 
     }); 
     return rowView; 
    } 
} 
} 

下面是一个例子我的“my_list_background”xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/Tab_Layout_A" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" 
android:padding="5dp" 
android:background="@color/white"> 

<!-- listview Title Layout --> 
<LinearLayout 
    android:id="@+id/ll_Table_Title" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:gravity="center_vertical" 
    android:layout_marginBottom="-15dp" 
    android:layout_marginTop="7dp" 
    android:layout_marginLeft="11dip" 
    android:layout_marginRight="11dip" 
    android:orientation="horizontal" 
    android:weightSum="100" 
    android:background="@color/black"> 

    <TextView 
     android:id="@+id/txt_TestItem_Name" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:text="@string/Name" 
     android:textColor="@color/white" 
     android:textStyle="bold" /> 
<!--I have omitted the other columns--> 
</LinearLayout> 

<LinearLayout 
    android:id="@+id/message_List_Layout" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="@color/white"> 
    <ListView 
     android:id="@android:id/list" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" > 
    </ListView>  
</LinearLayout> 
</LinearLayout> 

和我的 “single_item” XML

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/single_row" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:orientation="horizontal" 
android:gravity="center_vertical" 
android:weightSum="100"> 

<TextView 
    android:id="@+id/txt_TestItem_Name" 
    android:layout_width="0dip" 
    android:layout_height="wrap_content" 
    android:padding="2dip" 
    android:layout_weight="25" 
    android:textColor="@color/black"/> 
<ImageButton 
    android:id="@+id/btn_Next" 
    android:layout_width="0dip" 
    android:layout_height="wrap_content" 
    android:padding="2dip" 
    android:layout_weight="2" 
    android:background="@drawable/disclosure_button" 
    android:contentDescription="@string/next_Button"/> 
</LinearLayout> 

回答

0

确定的一个例子,让我找到了我的问题。在我的“single_item”xml文件中,我有一个偷走焦点的ImageButton。我把它换成ImageView,它工作得很好。

相关问题