2014-10-07 2 views
0

Я пытаюсь добавить элементы во время выполнения в ListView, размещенные на вкладке. Но когда я это сделаю, я получаю сообщение об ошибке. Есть 3 вкладки и я не использую ListFragments, потому что у меня есть различное содержание во всех вкладкахДобавить элемент в ListView

мой код ниже

SwipeTabFragment.java

public class SwipeTabFragment extends Fragment { 

    private String tab; 
    private int color; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Bundle bundle = getArguments(); 
     tab = bundle.getString("tab"); 
     color = bundle.getInt("color"); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.bookshelf, null); 
     TextView tv = (TextView) view.findViewById(R.id.textView); 
     tv.setText(tab); 
     view.setBackgroundResource(color); 
     return view; 
    } 
} 

TabPagerAdapter.java

public class TabPagerAdapter extends FragmentPagerAdapter { 

    public TabPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int index) { 
     Bundle bundle = new Bundle(); 
     String tab = ""; 
     int colorResId = 0; 
     SwipeTabFragment swipeTabFragment = new SwipeTabFragment(); 
     switch (index) { 
      case 0: 
       tab = "BookShelf"; 
       bundle.putString("tab",tab); 
       swipeTabFragment.setArguments(bundle); 
       return swipeTabFragment; 


       // break; 
      case 1: 
       tab = "Now Listening"; 
       colorResId = R.color.color2; 
       BookFragment bookFragment = new BookFragment(); 
       return bookFragment; 
       //break; 
      case 2: 
       tab = "Library"; 
       colorResId = R.color.color3; 
       TabLibrary tabLibrary = new TabLibrary(); 
       return tabLibrary; 
       break; 
     } 

     return null; 
    } 

    @Override 
    public int getCount() { 
     return 3; 
    } 
} 

TabLibrary.java

public class TabLibrary extends Fragment { 

    final String LOG_TAG = "myLogs"; 
    ListView lvLibList; 
    ImageButton btAddItem; 
    ArrayList<String> list = new ArrayList<String>(); 
    ArrayAdapter<String> adapter; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.library, parent, false); 

     ListView lvLibList = (ListView)v.findViewById(R.id.lvLibList); 
     ImageButton btn = (ImageButton)v.findViewById(R.id.btAddItem); 
     adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, list); 
     View.OnClickListener listener = new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       EditText edit = (EditText)v.findViewById(R.id.eAddItem); 
       list.add(edit.getText().toString()); 
       edit.setText(""); 
       adapter.notifyDataSetChanged(); 
      } 
     }; 
     btn.setOnClickListener(listener); 
     lvLibList.setAdapter(adapter); 
     return v; 
    } 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 
} 
+2

Какая ошибка? Опубликовать logcat aswell –

+0

Просто угадайте - не могли бы вы попытаться использовать 'adapter.add (edit.getText(). ToString())' вместо 'list.add (...)' в 'TabLibrary.java'? Также это не приведет к ошибкам - поэтому публикация ошибки поможет нам дать вам лучшее решение, чем дикие догадки. –

+0

Выполнено в первом сообщении – RyndinV

ответ

0

@Gurusharan S является правильным, проблема заключается в именах ваших переменных. Чтобы избежать путаницы, я хотел бы предложить, чтобы изменить код следующим образом:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.library, parent, false); //Change the name from v to view 

    ListView lvLibList = (ListView)view.findViewById(R.id.lvLibList); 
    ImageButton btn = (ImageButton)view.findViewById(R.id.btAddItem); 
    EditText edit = (EditText)view.findViewById(R.id.eAddItem); //Initialize the EditText outside of the click method 

    adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, list); 

    View.OnClickListener listener = new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      list.add(edit.getText().toString()); 
      edit.setText(""); 
      adapter.notifyDataSetChanged(); 
     } 
    }; 
    btn.setOnClickListener(listener); 
    lvLibList.setAdapter(adapter); 
    return view; 
} 

И в будущем я бы посоветовал дать переменные более осмысленные имена, иногда это занимает у вас немного больше кодирования, но оно того стоит ,

+0

// Ошибка: (47, 26) ошибка: доступ к локальной переменной осуществляется изнутри внутреннего класса; должен быть объявлен final // Я пытаюсь декларировать, но я не понимаю. – RyndinV

+0

'final EditText edit = (EditText) view.findViewById (R.id.eAddItem);' Это должно сделать это –

+0

Great THX! Это работает! – RyndinV

0

Опубликовать комментарий в качестве ответа, так как я уверен, что это проблема:

Переменная edit кажется нулевой. Это связано с тем, что когда вы вызываете v.findViewById, вы на самом деле вызываете его на клике, который был нажат, а не на фрагменте.

Таким образом, вы получили два варианта:

  1. Изменение имени зрения фрагмента. например. View v1 = inflater.inflate(R.layout.library, parent, false);, а затем измените строку на v1.findViewById
  2. Измените имя аргумента onClick. например. public void onClick(View v1) {.

Надеюсь, что это поможет.

+0

View.OnClickListener listener = new View.OnClickListener() { @Override public void onClick (View v1) { EditText eAddItem = (EditText) v1.findViewById (R.id.eAddItem); list.add (eAddItem.getText(). ToString()); adapter.notifyDataSetChanged(); } }; – RyndinV

+0

это не работает, но когда я просто добавляю list.add («123») вместо list.add (eAddItem.getText(). ToString()) работает – RyndinV

+0

Что вы думаете о list.add (eAddItem.getText() .нанизывать()) ? – RyndinV

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