2015-07-02 1 views
0

Я искал аналогичную проблему для моего, чтобы найти решение, но я серьезно не мог найти ничего подобного.Попытка вызвать виртуальный метод 'android.view.View android.view.View.findViewById (int)' на ссылке нулевого объекта

Я пытался загрузить из синтаксиса массив сообщений с классом asynctask, и после того, как он получит сообщения, он предположим, чтобы установить массив posts на моей странице и выполнить функцию setAdapter, чтобы установить мои новые сообщения массив.

Проблема заключается в том, что после инициализации listView и listAdapter в моем домашнем фрагменте, а затем я выполняю функцию postArray из функции синтаксического анализа, после того, как он заканчивает прием массива сообщений из синтаксического анализа, он не может обновить listAdapter, поскольку он говорит, что listAdapter и мой списокView «еще не инициализированы», хотя они и есть.

p.s. Извините, что вы не отправляете мой код в удобном виде, я не часто публикую свои проблемы с кодом.

вот мой код:

мой дом фрагмент:

public class HomeFragment extends Fragment { 
View root; 
ArrayList<PostClass> postsArrayList = new ArrayList<>(); 

static boolean isPostsArrayUpdated = false; 

ListAdapter listAdapter; 
PullToRefreshListView listView; 

public void updatePostsArrayList(ArrayList<PostClass> postsArrayList){ 
    if(!isPostsArrayUpdated){ 
     // First time updating posts array list 
     listAdapter = new ListAdapter(getActivity(), root); 
     listView = (PullToRefreshListView) root.findViewById(R.id.list_container); 

     this.postsArrayList = postsArrayList; 
     listView.setAdapter(listAdapter); 
     isPostsArrayUpdated = true; 
     root.findViewById(R.id.homeFragmentLoadingPanel).setVisibility(View.GONE); 
    }else{ 
     // Have updated posts before 
     this.postsArrayList = postsArrayList; 
     listAdapter.notifyDataSetChanged(); 
    } 
} 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    root = inflater.inflate(R.layout.fragment_home, container, false); 
    listView = (PullToRefreshListView) root.findViewById(R.id.list_container); 
    listAdapter = new ListAdapter(getActivity(), root); 

    Home_Model.getInstance().setPostsArrayList(); 

    return root; 
} 

public class ListAdapter extends BaseAdapter implements View.OnClickListener{//....} 

мой дом модель:

public class Home_Model { 

Home_Model(){} 

static final Home_Model instance = new Home_Model(); 

public static Home_Model getInstance() { 
    return instance; 
} 

public void setPostsArrayList(){ 
    new setHomePostsArray().execute(); 
} 

public class setHomePostsArray extends AsyncTask<Void, ArrayList<PostClass>, Void>{ 

    ArrayList<String> followersList; 
    ArrayList<PostClass> postsArrayList; 

    @Override 
    protected Void doInBackground(Void... params) { 

     // Getting posts from parse 
     String userName = Parse_model.getInstance().getUserClass().get_userName(); 
     followersList = Parse_model.getInstance().getFollowersByUserNameToString(userName); 
     followersList.add(userName); 


     postsArrayList = Parse_model.getInstance().getAllUsersPostsByFollowings(followersList); 

     for (PostClass currPost : postsArrayList) { 
      for (PostClass currLocalDBPost : LocalDBPostsArray) { 
       if (currPost.getObjectID().equals(currLocalDBPost.getObjectID())) { 
        currPost.set_postPicture(currLocalDBPost.get_postPicture()); 

       } 
      } 
     } 
     //Updating home page 
     onProgressUpdate(postsArrayList); 


     // Updating local data base in new posts 
     //checking in local DB if there are any new posts from parse and update them 
     for (PostClass currPost : postsArrayList) { 
      boolean isPostExists = false; 
      for (PostClass currLocalPost : LocalDBPostsArray) { 
       if (currPost.getObjectID().equals(currLocalPost.getObjectID())) { 
        isPostExists = true; 
       } 
      } 
      if (!isPostExists) { 
       ModelSql.getInstance().addPost(currPost); 
       Log.e("post not exist", "adding local DB"); 
      } 
     } 

     //updating followers list in local DB 
     Parse_model.getInstance().getUserClass().setFollowersArray(followersList); 
     ModelSql.getInstance().updateFollowersArray(currUser); 

     return null; 
    } 

    @Override 
    protected void onProgressUpdate(ArrayList<PostClass>... values) { 
     //pass the updated postsArrayList to home fragment 
     if(setPostsInHomePageDelegate!= null){ 
      setPostsInHomePageDelegate.setPosts(values[0]); 
     } 
    } 
} 


public interface SetPostsInHomePage { 
    public void setPosts(ArrayList<PostClass> postsArrayList); 
} 

SetPostsInHomePage setPostsInHomePageDelegate; 

public void setSetPostsInHomePageDelegate(SetPostsInHomePage setPostsInHomePageDelegate) { 
    this.setPostsInHomePageDelegate = setPostsInHomePageDelegate; 
} 

Основная деятельность:

public class MainActivity extends Activity { 

static HomeFragment homeFragment = new HomeFragment(); 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

// the home fragment has already been opened during the app opening 

//... 

setPostsImHomePage(); 
} 

//... 

public void setPostsImHomePage(){ 
    Home_Model.getInstance().setSetPostsInHomePageDelegate(new Home_Model.SetPostsInHomePage() { 
     @Override 
     public void setPosts(ArrayList<PostClass> postsArrayList) { 
      homeFragment.updatePostsArrayList(postsArrayList); 
     } 
    }); 
} 

}

ответ

1

Попробуйте переместить ваш метод setPostsImHomePage(...) от MainActivity до HomeFragment и назвать его в OnCreateView перед тем return root;.

+0

благодарю вас за блестящую идею мой друг. Я сделал эту точную вещь, но, к сожалению, это дает мне другое исключение ошибки (что является прогрессом в его самолюбии). он говорит: «android.view.ViewRootImpl $ CalledFromWrongThreadException: только исходный поток, создавший иерархию представлений, может коснуться его представлений». в спискеView.setAdapter (listAdapter); line – liranahum

+0

, так как это кажется странным, потому что этот пост-массив, передаваемый в домашний фрагмент, работает над частью onProgress в потоке asyncTask, что означает, что он работает в основном потоке, который не должен быть проблемой – liranahum

+0

Как его запустить Пользовательский интерфейс? –

0

Попробуйте инициализировать homeFragment в onCreate перед вызовом метода. Также полезно знать, какая строка (ы) дает вам ошибки.

+0

не работает. все еще получая сообщение NullPointerException. – liranahum

+0

Какие номера строк выбрасывают исключение? –

+0

в моем HomeFragment, в функции updatePostsArrayList, сначала он выбрасывал исключение в: listView.setAdapter (listAdapter); но затем я попробовал инициализировать его снова, а затем он выдает исключение в инициализации listAdapter, и он сказал, что даже не знает root (вид фрагмента), хотя я уже инициализировал его – liranahum

0

Очевидно, что ваш фрагмент не имеет вида, когда результат будет получен.

Вы должны правильно добавить фрагмент в действие с помощью FragmentManager, а затем в обратном вызове Fragment onActivityCreated(), который вызывается системой после правильного отображения фрагмента), запустите свой AsyncTask.

+0

Мне жаль, что я полностью забыл упомянуть, что домашний фрагмент уже был открыт во время выполнения приложения. – liranahum

+0

Если root имеет значение null, представление еще не создано, что означает, что результаты слишком быстро появляются (до того, как представление имеет возможность создать), или фрагмент не создан должным образом. Кроме того, у вас есть утечка памяти, потому что ваша модель статична и имеет косвенную ссылку на вашу активность. – BladeCoder

+0

Я отлаживал его и видел, что корень был инициализирован до функции импорта массива сообщений, и фрагмент создал просто отлично. Я заменил функцию setPostsImHomePage() на onCreate домашнего фрагмента, как предложил кто-то другой. – liranahum