2016-08-27 7 views
0

私は、リストビューを含むタブ付きレイアウトのアンドロイドアプリを持っています。私は、サーバーから情報を取得した後にリストを更新しようとしています。ただし、画面がタッチされるまでリストは更新されません。すべての情報は正しいですが、どれくらい待っても、リストをタップするまでリストには表示されません。誰もがこれを修正する方法を知っていますか?Androidタブ付きビューが更新されないまで

Tab1.java

import android.os.AsyncTask; 
import android.os.Build; 
import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.v4.app.Fragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ListView; 
import android.widget.Toast; 

import java.util.ArrayList; 
import java.util.List; 

/** 
* Created by hp1 on 21-01-2015. 
*/ 

//NEW 
public class Tab1 extends Fragment { 
    MainActivity mainActivity; 
    List<Post> postList; 
    public static NewAdapter newAdapter; 

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

     return v; 
    } 

    @Override 
    public void onStart() { 
     super.onStart(); 
     postList = new ArrayList<Post>(); 

     try { 
      //get data from azure 
      mainActivity = (MainActivity) getActivity(); 

      //set lists 
      ListView newListView = (ListView) mainActivity.findViewById(R.id.newListView); 
      newAdapter = new NewAdapter(mainActivity, postList); 
      newListView.setAdapter(newAdapter); 
     }catch(Exception e){ 

     } 

     //get the posts loaded asynchronously 
     retrievePosts(); 
    } 

    public void retrievePosts(){ 
     AsyncTask<Void,Void,Void> task = new AsyncTask<Void,Void,Void>(){ 
      @Override 
      protected Void doInBackground(Void... params) { 
       try { 
        postList= mainActivity.postTable.execute().get(); 
        Log.e("TAG",postList.get(0).text); 
        newAdapter.updateList(postList); 
       } catch (final Exception e) { 
       } 
       return null; 
      } 
     }; 

     runAsyncTask(task); 
    } 

    private AsyncTask<Void, Void, Void> runAsyncTask(AsyncTask<Void, Void, Void> task) { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
      return task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
     } else { 
      return task.execute(); 
     } 
    } 
} 

NewAdapter.java

import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.util.List; 

public class NewAdapter extends BaseAdapter { 
    List<Post> postList; 
    Context context; 
    LayoutInflater inflater; 

    public NewAdapter(MainActivity mainActivity, List<Post> myPostList) { 
     postList=myPostList; 
     context=mainActivity; 
     inflater = LayoutInflater.from(context); 
    } 

    @Override 
    public int getCount() { 
     return postList.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return postList.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 

     PostCell postCell=new PostCell(); 
     View cellView = inflater.inflate(R.layout.post_cell, null); 

     postCell.textView=(TextView) cellView.findViewById(R.id.textView1); 
     postCell.textView.setText(postList.get(position).text); 

     cellView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Toast.makeText(context, "You Clicked "+postList.get(position).text, Toast.LENGTH_LONG).show(); 
      } 
     }); 

     return cellView; 
    } 

    public List<Post> updateList(List<Post> myPostList){ 
     postList = myPostList; 
     notifyDataSetChanged(); 
     return postList; 
    } 

    public List<Post> addToList(Post post){ 
     postList.add(post); 
     notifyDataSetChanged(); 
     return postList; 
    } 
} 

EDIT:最終的な答えは - ここで解決される問題で、私の最終的なコードです。 Bnydevはこの問題については正しかったが、私も同様に変更しなければならないことがいくつかあった。 Tab1.javaで

public void retrievePosts(){ 
     //NOTE: must have a return type for an async task to run onpostexecute, which 
     //is executed on the ui thread so the screen can be updated 

     AsyncTask<Void,Void,Boolean> task = new AsyncTask<Void,Void,Boolean>(){ 
      @Override 
      protected Boolean doInBackground(Void... params) { 
       try { 
        postList= mainActivity.postTable.execute().get(); 
       } catch (final Exception e) { 
        e.printStackTrace(); 
       } 
       return true; 
      } 
      protected void onPostExecute(Boolean reult) { 
       newAdapter.updateList(postList); 
      } 
     }; 

     task.execute(); 
    } 

答えて

1

、あなたはAsyncTaskが含まれている方法retrievePosts()を、持っています。このAsyncTaskのdoInBackground()内にはnewAdapter.updateList()と、updateList()にはnotifyDataSetChanged()と呼び出します。

ドキュメントhereによれば、notifyDataSetChanged()はUIを更新します。しかし、私が知る限り、UIをリフレッシュするのは、UIスレッドからのみ可能であり、バックグラウンドスレッドからは可能ではありません。 AsyncTask内のnewAdapter.updateList()onPostExecute()にコールすると、hereの例を参照してください。 doInBackground()がバックグラウンドスレッドで実行され、onPostExecute()がUIスレッドで実行されます。

public void retrievePosts(){ 
    AsyncTask<Void,Void,Void> task = new AsyncTask<Void,Void,Void>(){ 
     @Override 
     protected Void doInBackground(Void... params) { 
      try { 
       postList= mainActivity.postTable.execute().get(); 
       Log.e("TAG",postList.get(0).text); 
      } catch (final Exception e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     protected void onPostExecute() { 
      newAdapter.updateList(postList); 
     } 
    }; 

    runAsyncTask(task); 
} 

PS:私は

+0

などe.printStackTrace()のように、何もせずにすべての例外をキャッチするために良好であることをあなたの助けをありがとうそんなにないと思います!あなたの推論は正しかったです。あなたがしなければならないことがいくつかありました。私は自分の投稿を編集して、最終的なコードを持っていきます。 – Oblivionkey3

関連する問題