2014-02-09 3 views
0

Я работаю над приложением для Android, которое реализует навигационный ящик в качестве основного меню, а затем в зависимости от выбора, который я выполняю. Теперь одной из задач является заполнение списка из онлайн-узла базы данных mysql с использованием jdbc. Я могу заполнить список в обычной деятельности, но тот же код не работает в фрагменте. Это как мой фрагмент выглядит:Как заполнить список в фрагменте?

public class HomeFragment extends Fragment 
{ 
private ProgressDialog pDialog; 
    ListView listView ; 
Connection conn=null; 
ResultSet rs=null; 
PreparedStatement st=null; 

List<Map<String,String>> list = new ArrayList<Map<String,String>>(); 



public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) 
{ 
    View rootView = inflater.inflate(R.layout.main_list, container, false); 

    try 
    { 
     initList(); 
    } catch (SQLException e) 
    { 
     e.printStackTrace(); 
    } 

    String[] from = { "sender", "subject" ,"file_name"}; 
    int[] to = {R.id.sender,R.id.subject,R.id.file_name}; 

    SimpleAdapter adapter = new SimpleAdapter(getActivity(),list,R.layout.list_item,from,to); 

    //ListView lv=(ListView) rootView.findViewById(R.id.list); 
      //getListView(); 
    ListView lv= (ListView) getActivity().findViewById(R.id.list); 
    lv.setAdapter(adapter); 


    lv.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, 
        int position, long id) { 

       String sender = ((TextView) view.findViewById(R.id.sender)).getText() .toString(); 
       String subject = ((TextView) view.findViewById(R.id.subject)).getText() .toString(); 
       String fname = ((TextView) view.findViewById(R.id.file_name)).getText() .toString(); 

      } 
     }); 




    return rootView; 
} 



public void initList() throws SQLException 
{ 

    String username="sql428447"; 
    String pass="************"; 

    String sender,subject,file_name; 
    try 
    { 
     Class.forName("com.mysql.jdbc.Driver");   
     conn = DriverManager.getConnection("jdbc:mysql://sql4.freesqldatabase.com:3306/sql428447",username,pass); 
    } 
    catch(Exception x) 
    { 
     x.printStackTrace(); 
    } 

    try 
    { 

     String sql="select sender,subject,file_name from files"; 
     st=conn.prepareStatement(sql); 

     rs=st.executeQuery(); 

     while(rs.next()) 
     { 
      sender=rs.getString(1); 
      subject=rs.getString(2); 
      file_name=rs.getString(3); 
      list.add(createRecord(sender, subject,file_name)); 
     } 
    } 
    catch(Exception z) 
    { 
     z.printStackTrace(); 
    } 
    finally 
    { 
     st.close(); 
     rs.close(); 
    } 


} 
public HashMap<String, String> createRecord(String key, String name,String file_name) 
    { 
     HashMap<String, String> record = new HashMap<String, String>(); 
     record.put("sender", key); 
     record.put("subject", name); 
     record.put("file_name",file_name); 
     return record; 
    } 

}

и я называю этот фрагмент из навигации ящика выберите пункт так:

 case 1: 


     newFragment = new HomeFragment(); 
     transaction.replace(R.id.content_frame, newFragment); 
     transaction.addToBackStack(null); 
     transaction.commit(); 

     break; 

Но во время выполнения в журнале его метания исключение на линии initlist() и st.close(), которые я не могу понять. Я предполагаю, что мой подход почти правильный, что обсуждается в большинстве учебных пособий, но я не понимаю ошибки в моем коде, потому что он работает в обычной деятельности. Любая помощь будет оценена по достоинству. Благодаря Это скриншот исключения enter image description here

+0

Пожалуйста, дополнительные сведения о точном Exception вы получаете, в том числе типа Exception, сообщения исключения и точное местоположение в коде, где оно происходит. –

+0

Я включил его снимок экрана –

+0

использовать ListView lv = (ListView) rootView.findViewById (R.id.list); вместо getActivity для всего, что вы реализуете во Фрагменте – Rudi

ответ

2

Вы, вероятно, выиграют от использования ListFragment, я видел много руководств в Интернете, что вы используете один, так что он может получить очень запутанным.

Что касается вашей текущей ошибки, вы разыскиваете st в finally, не проверяя, что это не первый балл. Если conn выдает сообщение об ошибке, это произойдет.

try 
    { 

     String sql="select sender,subject,file_name from files"; 
     st=conn.prepareStatement(sql); 

     rs=st.executeQuery(); 

     while(rs.next()) 
     { 
      sender=rs.getString(1); 
      subject=rs.getString(2); 
      file_name=rs.getString(3); 
      list.add(createRecord(sender, subject,file_name)); 
     } 
    } 
    catch(Exception z) 
    { 
     z.printStackTrace(); 
    } 
    finally 
    { 
     if (st != null) { 
      st.close(); 
      if (rs != null) { 
       rs.close(); 
      } 
     } 
    } 
+0

После того, как предложенная модификация ur теперь выбрала исключение для lv.setadapter (адаптер), –

+0

onCreateView должен генерировать представление фрагмента и возвращать его для действия, которое будет использоваться. Вы не можете использовать findFragmentId против активности там, потому что вы еще не дали ему представление. – Jon

+0

Верните пустой список в 'onCreateView' и' onActivityCreated' у него будет все готовое к использованию. – Jon

1

Вы должны использовать ListView lv= (ListView) rootView.findViewById(R.id.list); вместо ListView lv= (ListView) getActivity().findViewById(R.id.list); ... rootView вместо getActivity()

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