2016-03-24 5 views
2

In recyclerview, einige Zeit, es zeigt die Ausgabe bei der ersten Ausführung und manchmal zeigt es die Ausgabe auf dem zweiten oder dritten Mal ... und das Schlimmste ist, einige Zeit ist es nicht tut zeige überhaupt irgendwelche Daten an. Die Links, von denen ich Daten erhalte, funktionieren gut. Kann mir jemand sagen, wo ich Fehler mache? Ich habe die andere Antwort in Bezug auf dieses Problem gesehen, aber hat nicht für mich gearbeitet! HierRecyclerView Daten nicht richtig angezeigt, jedes Mal

ist der Adapter Code

private LayoutInflater inflater; 
    Context context; 
    List<Data> dataArray; 

    public RecyclerViewAdapter(Context context, List<Data> dataArray) { 
     this.dataArray = dataArray; 
     this.context = context; 
     inflater = LayoutInflater.from(context); 
    } 


    @Override 
    public RecyclerViewAdapter.CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview, null); 
     //View view = inflater.inflate(R.layout.cardview, parent, false); 
     CustomViewHolder holder = new CustomViewHolder(view); 
     return holder; 
    } 

    @Override 
    public void onBindViewHolder(CustomViewHolder holder, int position) { 
     Data current = dataArray.get(position); 
     //holder.image.setImageResource(current.Limage); 
     holder.textView1.setText(current.heading); 
     holder.textView2.setText(current.date); 
     holder.textView3.setText(current.brief); 

    } 

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

    public static class CustomViewHolder extends RecyclerView.ViewHolder { 
     //ImageView image; 
     TextView textView1, textView2, textView3; 

     public CustomViewHolder(View itemView) { 
      super(itemView); 
      // image = (ImageView)itemView.findViewById(R.id.Limage); 
      textView1 = (TextView) itemView.findViewById(R.id.heading); 
      textView2 = (TextView) itemView.findViewById(R.id.date); 
      textView3 = (TextView) itemView.findViewById(R.id.brief); 


     } 
    } 

Und hier ist meine JSON-Klasse

Context context; 
    public static List<Data> dataArray = new ArrayList<>(); 


    public JSONAsync(Context context) { 
     this.context = context; 
     dataArray.clear(); 

    } 

    @Override 
    protected Boolean doInBackground(String... params) { 

     try { 
      return downloadUrl(params[0]); 
     } catch (IOException e) { 
      return false; 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 

    public boolean downloadUrl(String myurl) throws IOException, JSONException { 
     InputStream is = null; 
     int response; 

     try { 
      URL url = new URL(myurl); 
      HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
      conn.connect(); 
      response = conn.getResponseCode(); 
      is = conn.getInputStream(); 
      if (response == 200) { 
       String responseBody = convertToString(conn.getInputStream()); 
       JSONArray jArray = new JSONArray(responseBody); 

       // JSONArray jArray = new JSONArray(is); 
       for (int i = 0; i < jArray.length(); i++) { 
        JSONObject jobj = jArray.getJSONObject(i); 
        Data data = new Data(); 
        data.setId(jobj.getInt("id")); 
        data.setHeading(jobj.getString("heading")); 
        data.setBrief(jobj.getString("brief")); 
        data.setDate(jobj.getString("date")); 
        dataArray.add(data); 
       } 
      recyclerViewAdapter.notifyDataSetChanged(); 
       return true; 
      } else return false; 

     } finally { 
      if (is != null) { 
       is.close(); 
      } 
     } 

    } 

    public String convertToString(InputStream is) { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
     StringBuilder sb = new StringBuilder(); 
     String line = null; 
     try { 
      while ((line = reader.readLine()) != null) { 
       sb.append(line).append("\n"); 
      } 
     } catch (IOException e) { 
     } finally { 
      try { 
       is.close(); 
      } catch (IOException e) { 
      } 
     } 

     return sb.toString(); 
    } 

    @Override 
    protected void onPostExecute(Boolean result) { 

     if (result == false) { 
      Toast.makeText(context, "Unable to fetch data from server", Toast.LENGTH_SHORT).show(); 
     } 
    } 

Und hier ist der Aktivitätscode, in dem ich Daten bin Anzeige

Toolbar toolbar; 
    public RecyclerView recyclerView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     //overridePendingTransition(R.anim.fadein, R.anim.fadeout); 
     setContentView(R.layout.activity_main_news); 
     toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     // Get Request 
     String url = "MY URL NOT SHOWING HERE INTENTIONALLY"; 
     new JSONAsync(getApplicationContext()).execute(url); 

     // Initializing the Recycler View and its layout 
     recyclerView = (RecyclerView) findViewById(R.id.recyclerView); 
     RecyclerViewAdapter recyclerViewAdapter = new RecyclerViewAdapter(MainNews.this, JSONAsync.dataArray); 
     LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false); 
     recyclerView.setLayoutManager(layoutManager); 
     recyclerView.setAdapter(recyclerViewAdapter); 
     recyclerView.setItemAnimator(new DefaultItemAnimator()); 
     recyclerViewAdapter.notifyDataSetChanged(); 
     //recyclerView.setHasFixedSize(true); 
    } 

Und hier ist das XML-Layout, das ich verwende

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/Relative" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#FFD4CBCB" 
    tools:context="admin.myproject.MainNews"> 

    <include layout="@layout/toolbar" /> 

    <LinearLayout 
     android:id="@+id/Linear1" 
     style="@style/AlertDialog.AppCompat.Light" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/toolbar" 
     android:orientation="vertical" 
     android:layout_centerHorizontal="true"> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:focusable="true" 
      android:text="Main Section" 
      android:textIsSelectable="true" 
      android:textSize="30dp" /> 
    </LinearLayout> 

    <View 
     android:id="@+id/view" 
     android:layout_width="match_parent" 
     android:layout_height="1dp" 
     android:layout_below="@id/Linear1" 
     android:background="@android:color/darker_gray" /> 

    <android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:id="@+id/recyclerView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_below="@+id/view" /> 

</RelativeLayout> 

Es gibt verschiedene Aktivitäten das gleiche Muster mit ... Manchmal zeigt es die Daten wie beschrieben und auf den anderen Zeiten, es funktioniert nicht. Jede Hilfe würde sehr geschätzt werden.

Bearbeitet: Nach der Verwendung der recyclerViewAdapter.notifyDataSetChanged(), bekomme ich die NPE. Irgendein Vorschlag, wie man diese Methode anwenden kann.

komplette LogCat nach Zugabe von notifyDataSetChanged() ist:

Schwerwiegende Ausnahme: AsyncTask # 1 Prozess: admin.myproject, PID: 27693 java.lang.RuntimeException: Fehler beim Ausführen doInBackground() bei android.os.AsyncTask $ 3.done (AsyncTask.java:309) bei java.util.concurrent.FutureTask.finishCompletion (FutureTask.java:354) bei java.util.concurrent.FutureTask.setException (FutureTask.java : 223) bei java.util .concurrent.FutureTask.run (FutureTask.java:242) bei android.os.AsyncTask $ SerialExecutor $ 1.run (AsyncTask.java:234) bei java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1113) bei java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:588) bei java.lang.Thread.run (Thread.java:818) verursacht durch: java.lang.NullPointerException: Versuch, virtuelle aufzurufen Methode 'void admin.myproject.RecyclerViewAdapter.notifyDataSetChanged()' für einen Nullobjektverweis unter admin.myproject.JSONAsync.downloadUrl (JSONAsync.java:76) unter admin.myproject.JSONAsync.doInBackground (JSONAsync.java:40) at admin.myproject.JSONAsync.doInBackground (JSONAsync.java:23) bei android.os.AsyncTask $ 2.call (AsyncTask.java:295) bei java.util.concurrent.FutureTask.run (FutureTask.java:237) bei android.os.AsyncTask $ SerialExecutor $ 1.run (AsyncTask.java:234) bei java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1113) bei java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:588) bei java.lang.Thread.run (Thread.java: 818)

Antwort

0

Sie Ihren Adapter in der PostExecute Ihrer AsyncTask einstellen müssen, wenn Sie Ihre Daten von Json geholt haben, damit es wie

And here is my JSON class 


Context context; 
public static List<Data> dataArray = new ArrayList<>(); 


public JSONAsync(Context context) { 
    this.context = context; 
    dataArray.clear(); 

} 

@Override 
protected Boolean doInBackground(String... params) { 

    try { 
     return downloadUrl(params[0]); 
    } catch (IOException e) { 
     return false; 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 

    return null; 
} 

public boolean downloadUrl(String myurl) throws IOException, JSONException { 
    InputStream is = null; 
    int response; 

    try { 
     URL url = new URL(myurl); 
     HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
     conn.connect(); 
     response = conn.getResponseCode(); 
     is = conn.getInputStream(); 
     if (response == 200) { 
      String responseBody = convertToString(conn.getInputStream()); 
      JSONArray jArray = new JSONArray(responseBody); 

      // JSONArray jArray = new JSONArray(is); 
      for (int i = 0; i < jArray.length(); i++) { 
       JSONObject jobj = jArray.getJSONObject(i); 
       Data data = new Data(); 
       data.setId(jobj.getInt("id")); 
       data.setHeading(jobj.getString("heading")); 
       data.setBrief(jobj.getString("brief")); 
       data.setDate(jobj.getString("date")); 
       dataArray.add(data); 
      } 
      return true; 
     } else return false; 

    } finally { 
     if (is != null) { 
      is.close(); 
     } 
    } 

} 

public String convertToString(InputStream is) { 
    BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
    StringBuilder sb = new StringBuilder(); 
    String line = null; 
    try { 
     while ((line = reader.readLine()) != null) { 
      sb.append(line).append("\n"); 
     } 
    } catch (IOException e) { 
    } finally { 
     try { 
      is.close(); 
     } catch (IOException e) { 
     } 
    } 

    return sb.toString(); 
} 

@Override 
protected void onPostExecute(Boolean result) { 

    if (result == false) { 
     Toast.makeText(context, "Unable to fetch data from server", Toast.LENGTH_SHORT).show(); 
    }else{ 
    recyclerViewAdapter = new RecyclerViewAdapter(MainNews.this,  JSONAsync.dataArray); 
    recyclerView.setAdapter(recyclerViewAdapter); 
     } 
} 
4

Setzen Sie den Adapter für Recycling-Ansicht aussehen wird.

LinearLayoutManager layoutManager = new LinearLayoutManager(getContext()); 
RecycleViewAdapter adapter = new RecycleViewAdapter(list); 
recycleView.setLayoutManager(layoutManager); 
recycleView.setHasFixedSize(true); 
recycleView.setAdapter(adapter); 

Dann in Ihrer Async Aufgabe ein Wert dataarray oder Liste jedes Mal, wenn

adapter.notifyItemInserted(list.size()); 

Setzen Sie den Adapter für die Recycling-Ansicht verwenden, hinzufügen, bevor die Asynchron-Aufgabe ausgeführt wird.