Это может быть дублирующий вопрос, но я просмотрел много вопросов SO, но не нашел ничего, что помогло.ActionBar 2 вкладки, списки на каждой вкладке, строка onClick не всегда срабатывает
У меня есть приложение, которое имеет 2 вкладки с помощью ActionBar. Каждый из них является ListFragment, и я не могу выбрать любой из них. Они будут заполняться просто отлично, но onListItemClick просто не срабатывает. Он также не срабатывает, если я использую setOnItemClickListener непосредственно в моем ListView. Однако, если я просто расширяю фрагмент, а не 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>