2016-03-22 2 views
0

Фактически название описывает мою проблему. Я устанавливаю адаптер в recyclerView, но проблема все еще появляется. Я думаю, что место, которое я вызываю для метода из набора адаптера, - это не проблема, а факты ... (или, может быть, это не проблема).Не прилагается адаптер; пропуская макет с RecyclerView

Способ, которым был установлен адаптер: showData();

Edit: Там нет ошибки больше (THX Рохит Arya), но я до сих пор не могу видеть фотографии (есть пустая страница).

Код:

MainFragment Класс:

package com.sarusi.amit.smarts; 

import android.support.v4.app.Fragment; 
import android.app.ProgressDialog; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.util.Base64; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.URL; 

/** 
* A simple {@link Fragment} subclass. 
*/ 
public class MainFragment extends Fragment { 

    private RecyclerView recyclerView; 
    private RecyclerView.LayoutManager manager; 
    private RecyclerView.Adapter adapter; 
    private APIConfig apiConfig; 

    public MainFragment() { 
     // Required empty public constructor 
    } 

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

     APIConfig.names = new String[1]; 
     APIConfig.bitmaps = new Bitmap[1]; 

     recyclerView = (RecyclerView) view.findViewById(R.id.fragment_main_recyclerView); 
     recyclerView.setHasFixedSize(true); 

     manager = new LinearLayoutManager(getContext()); 

     recyclerView.setLayoutManager(manager); 

     adapter = new BoardAdapter(APIConfig.names, APIConfig.bitmaps); 
     recyclerView.setAdapter(adapter); 

     getBoardsData(); 

     return view; 
    } 

    private void getBoardsData() { 

     class ConnectionTask extends AsyncTask<String, Void, String> { 
      ProgressDialog progressDialog; 

      @Override 
      protected void onPreExecute() { 
       progressDialog = ProgressDialog.show(getContext(), "Fetching Data...", "A Trap", false, false); 
       super.onPreExecute(); 
      } 

      @Override 
      protected void onPostExecute(String s) { 
       super.onPostExecute(s); 
       progressDialog.dismiss(); 
       parseJSON(s); 
       showData(); 
       adapter.notifyDataSetChanged(); 

      } 

      @Override 
      protected String doInBackground(String... params) { 
       BufferedReader bufferedReader; 
       try { 
        URL url = new URL(apiConfig.IMAGES_URL); 
        HttpURLConnection con = (HttpURLConnection) url.openConnection(); 
        StringBuilder sb = new StringBuilder(); 

        bufferedReader = new BufferedReader(new InputStreamReader(con.getInputStream())); 

        String json; 
        while ((json = bufferedReader.readLine()) != null) { 
         sb.append(json + "\n"); 
        } 

        return sb.toString().trim(); 

       } catch (Exception e) { 
        return null; 
       } 
      } 
     } 

     ConnectionTask connectionTask = new ConnectionTask(); 
     connectionTask.execute(); 

    } 

    public void showData() { 
     adapter = new BoardAdapter(APIConfig.names, APIConfig.bitmaps); 
     recyclerView.setAdapter(adapter); 
    } 


    private void parseJSON(String json) { 
     try { 
      JSONObject jsonObject = new JSONObject(json); 
      JSONArray jsonArray = jsonObject.getJSONArray(apiConfig.TAG_JSON_ARRAY); 

      apiConfig = new APIConfig(jsonArray.length()); 

      for (int i = 0; i < jsonArray.length(); i++) { 
       JSONObject JSO = jsonArray.getJSONObject(i); 
       APIConfig.names[i] = JSO.getString(apiConfig.TAG_NAME); 
       APIConfig.bitmaps[i] = base64ToBitmap(JSO.getString(apiConfig.TAG_IMAGE)); 
      } 

     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

    } 

    private Bitmap base64ToBitmap(String b64) { 
     byte[] imageAsBytes = Base64.decode(b64.getBytes(), Base64.DEFAULT); 
     return BitmapFactory.decodeByteArray(imageAsBytes, 0, imageAsBytes.length); 
    } 
} 

BoardAdapter Класс:

package com.sarusi.amit.smarts; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

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

/** 
* Created by amit on 3/21/16. 
*/ 
public class BoardAdapter extends RecyclerView.Adapter<BoardAdapter.ViewHolder> { 

    List<Board> boards; 

    public BoardAdapter(String[] names, Bitmap[] images) { 
     super(); 
     boards = new ArrayList<>(); 
     for (int i = 0; i < names.length; i++) { 
      Board board = new Board(); 
      board.setImage(images[i]); 
      board.setName(names[i]); 
      boards.add(board); 
     } 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.board_row, parent, false); 
     ViewHolder viewHolder = new ViewHolder(view); 
     return viewHolder; 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     Board board = boards.get(position); 
     holder.imageView.setImageBitmap(board.getImage()); 
     holder.name.setText(board.getName()); 
    } 

    @Override 
    public int getItemCount() { 
     return boards.size(); 
    } 


    //The class for the viewHolder 
    class ViewHolder extends RecyclerView.ViewHolder { 

     public ImageView imageView; 
     public TextView name; 

     public ViewHolder(View itemView) { 
      super(itemView); 
      this.imageView = (ImageView) itemView.findViewById(R.id.board_row_image); 
      this.name = (TextView) itemView.findViewById(R.id.board_row_name); 
     } 
    } 
} 

fragment_main:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    tools:context="com.sarusi.amit.smarts.MainFragment"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/fragment_main_recyclerView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 

    </android.support.v7.widget.RecyclerView> 

</LinearLayout> 

board_row:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical"> 

    <android.support.v7.widget.CardView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 

     <LinearLayout 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:orientation="vertical"> 

      <ImageView 
       android:id="@+id/board_row_image" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:layout_gravity="center" 
       android:src="@drawable/photo" /> 

      <TextView 
       android:id="@+id/board_row_name" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:text="Trap" /> 


     </LinearLayout> 


    </android.support.v7.widget.CardView> 


</LinearLayout> 
+0

Можете ли вы показать файл фрагмента_main_layout.xml, пожалуйста, – z3n105

+0

ОК, сообщение отредактировано. –

ответ

0

Существует определенное время, когда RecyclerView не имеет адаптера. Вы можете установить адаптер при инициализации RecyclerView с пустым списком, а затем после получения данных обновите список и вызовите notifyDataSetChanged адаптера.

0

В onCreateView:

manager = new LinearLayoutManager(getContext()); 

recyclerView.setLayoutManager(manager); 

adapter = new BoardAdapter(APIConfig.names, APIConfig.bitmaps); 
recyclerView.setAdapter(adapter); 

Здесь APIConfig.names и APIConfig.bitmaps будет пустым (неnull).

Обновить эти значения onPostExecute от AsyncTask и позвонить по телефону notifyDataSetChanged на адаптере.

+0

Я получаю сообщение об ошибке: java.lang.RuntimeException: не удалось запустить Activity ComponentInfo {com.sarusi.amit.testa/com.sarusi.amit.smarts.MainActivity}: java.lang.NullPointerException: попытаться получить длину null array –

+0

сначала инициализируйте эти два массива 'APIConfig.names, APIConfig.bitmaps'. –

+0

Ошибка уже отсутствует, но изображения не отображаются. Считаете ли вы, что это из-за адаптера? –

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