2016-07-07 7 views
-1

私を助けてください。私の家の断片は空白です。 JSON配列をホームフラグメントに印刷できません。私はAPIからJson配列からのリストビューのデータを表示したいのですが、断片を使ってJsonから配列データをどのように置くことができますか?私の英語のソーリー。配列とアダプタcantがVoidフラグメントで呼び出されました

public class HomeFragment extends Fragment implements OnFeedListener{ 
ListView listView; 
FeedAdapter adapter; 
ArrayList<Post> posts; 


View myView; 



@Override 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     myView = inflater.inflate(R.layout.home, container, false); 
     return myView; 
    } 
    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
    } 

@Override 
public void onFeed(JSONArray array) { 
    posts = new ArrayList<>(); 
    int lenght = array.length(); 
    for(int i = 0; i < lenght; i++) 
    { 
     JSONObject object = array.optJSONObject(i); 
     Post post = new Post(object.optString("title"), object.optString("excerpt"), object.optString("thumbnail")); 

     posts.addAll(posts); 
    } 
    adapter.addAll(posts); 
    adapter.notifyDataSetChanged(); 
    listView.setAdapter(adapter); 
    FeedTask task = new FeedTask(this); 
    task.execute("http://indo-coc.com/api/get_recent_posts/"); 

} 

public class FeedTask extends AsyncTask<String, Void, JSONArray> 
{ 
    private OnFeedListener listener; 
    public FeedTask(OnFeedListener listener) 
    { 
     this.listener = listener; 
    } 
    @Override 
    protected JSONArray doInBackground(String... params) 
    { 
     String url = params[0]; 
     OkHttpClient client = new OkHttpClient(); 
     Request.Builder builder = new Request.Builder(); 
     Request request = builder.url(url).build(); 
     try { 
      Response response = client.newCall(request).execute(); 
      String json = response.body().string(); 

      try 
      { 
       JSONObject object = new JSONObject(json); 
       JSONArray array = object.optJSONArray("posts"); 
       return array; 
      } 
      catch (JSONException e) 
      { 
       e.printStackTrace(); 
      } 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(JSONArray array) { 
     super.onPostExecute(array); 
     if(null == array) 
      return; 
     if(null != listener) 
      listener.onFeed(array); 
    } 
} 

public class FeedAdapter extends ArrayAdapter<Post> 
{ 
    private int resource; 

    public FeedAdapter(Context context, int resource) { 
     super(context, resource); 
     this.resource = resource; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // Convert View -> Reuse 
     if (null==convertView) 
     { 

      LayoutInflater inflater = LayoutInflater.from(getContext()); 
      convertView = inflater.inflate(resource, null); 
     } 
     // Binding Data 
     Post post = getItem(position); 
     TextView title = (TextView) convertView.findViewById(R.id.title); 
     TextView desc = (TextView) convertView.findViewById(R.id.description); 

     title.setText(post.title); 
     desc.setText(post.description); 



     return convertView; 
    } 
} 
public class Post 
{ 
    public String title; 
    public String description; 
    public String thumbnail; //URL 

    public Post(String title, String desc, String thumbnail) 
    { 
     this.title = title; 
     this.description = desc; 
     this.thumbnail = thumbnail; 
    } 
} 

}

答えて

0

があなたの公開クラスのグローバル変数としてFeedAdapter adapterArrayList<Post> postsを宣言します。

私はフラグメントを使用しています。彼らはここで何が起こっているのかpublic void onActivityCreated(Bundle savedInstanceState)

0

外に宣言する必要があります。

  • onActivityCreatedにあなたがそれらに値を割り当てずにローカル変数を宣言します。それらはローカルなので、メソッドが終了するとすぐに消えてしまいます。メソッドの上の変数をクラス変数として宣言して後でアクセスできるようにする
  • 変数listViewadapterに値を代入しないでください。私は別の場所を仮定します。一般的なプラクティスはonViewCreatedでこれを行い、フラグメントのメインビューを設定します。これを行う方法がわからない場合は、this questionを参照してください。次に、フラグメント内で展開したレイアウト内にlistViewがあると仮定して、findViewByIdを使用してlistViewをロードできます。次に、新しいFeedAdapterを作成して、それをリストビューに割り当てる必要があります。listView.setAdapter(adapter)

幸運を祈る!

0

これを試してみてください。

class MyFragment extends Fragment{ 
ListView listView; 
FeedAdapter adapter; 
ArrayList<Post> posts; 


public void onCreate(Bundle b){ 
    super.onCreate(b); 
    //My bad listview will only be assigned properly in onCreateView once the view is inflated 
    posts = new ArrayList<>(); 
    adapter=new FeedAdapter(getActivity(),R.id.yourresouceid,posts); // which ever way your adapter is defined 
    listView.setAdapter(adapter); 
} 


public void onActivityCreated(Bundle savedInstanceState) { 
super.onActivityCreated(savedInstanceState); 


} 
public void onFeed(JSONArray array) { 

int lenght = array.length(); 
for (int i = 0; i < lenght; i++) 
{ 
    JSONObject object = array.optJSONObject(i); 
    posts.add(post); 
} 
//adapter.addAll(posts); //you don't need to do this, already done when creating your adapter 
adapter.notifyDataSetChanged(); 

} 

} 

は説明:onActivityCreatedの範囲のみがその閉じ括弧までです。内部で宣言されたものは、外部関数からは見えません。この仕組みの詳細については、javaのスコープ解決を参照してください。

また、使用する前に初期化する必要があります。それを宣言してそれを使用しようとすると、NullPointerExceptionsが返されます

+0

残念ながら、Drawer Has Stopped –

関連する問題