2016-11-09 2 views
-1

Ich habe innere Klassen ViewHolder und StringHolder in meiner custon AdapterklasseWie Daten in einem Adapter auf einem separaten Thread binden

private class StringHolder { 
    String awards; String countries; String directors; String fullPlot; String genres; String ID; 
    String imdbRating; String imdbVotes; String lastUpdated; String languages; String metacritic; 
    String posterUrl; String shortPlot; String rating; String releaseDate; String runtime; String writers; 
    String title; String imdbId; String cast; 
    public StringHolder(Cursor cursor){ 
     awards = cursor.getString(cursor.getColumnIndexOrThrow("Awards")); 
     countries = cursor.getString(cursor.getColumnIndexOrThrow("Country")); 
     directors = cursor.getString(cursor.getColumnIndexOrThrow("Director")); 
     fullPlot = cursor.getString(cursor.getColumnIndexOrThrow("FullPlot")); 
     genres = cursor.getString(cursor.getColumnIndexOrThrow("Genre")); 
     ID = cursor.getString(cursor.getColumnIndexOrThrow("ID")); 
     imdbRating = cursor.getString(cursor.getColumnIndexOrThrow("imdbRating")); 
     imdbVotes = cursor.getString(cursor.getColumnIndexOrThrow("imdbVotes")); 
     lastUpdated = cursor.getString(cursor.getColumnIndexOrThrow("lastUpdated")); 
     languages = cursor.getString(cursor.getColumnIndexOrThrow("Language")); 
     metacritic = cursor.getString(cursor.getColumnIndexOrThrow("Metacritic")); 
     posterUrl = cursor.getString(cursor.getColumnIndexOrThrow("Poster")); 
     shortPlot = cursor.getString(cursor.getColumnIndexOrThrow("Plot")); 
     rating = cursor.getString(cursor.getColumnIndexOrThrow("Rating")); 
     releaseDate = cursor.getString(cursor.getColumnIndexOrThrow("Released")); 
     runtime = cursor.getString(cursor.getColumnIndexOrThrow("Runtime")); 
     writers = cursor.getString(cursor.getColumnIndexOrThrow("Writer")); 
     title = cursor.getString(cursor.getColumnIndexOrThrow("Title")); 
     imdbId = cursor.getString(cursor.getColumnIndexOrThrow("imdbID")); 
     cast = cursor.getString(cursor.getColumnIndexOrThrow("Actors")); 

    } 
} 

private class ViewHolder { 
    TextView cast; TextView title; TextView plot; TextView imdbratings; TextView votes; 
    ImageView bookmark; ImageView share; ImageView IMDBProfile; FlowLayout flowLayout; 
    TextView releaseDate; TextView directors; TextView countries; TextView genres; 
    public ViewHolder(View view){ 
     genres = (TextView) view.findViewById(R.id.genres); 
     countries = (TextView) view.findViewById(R.id.countries); 
     directors = (TextView) view.findViewById(R.id.directors); 
     releaseDate = (TextView) view.findViewById(R.id.releaseDate); 
     title = (TextView) view.findViewById(R.id.Title); 
     plot = (TextView) view.findViewById(R.id.plot); 
     imdbratings = (TextView) view.findViewById(R.id.rating); 
     votes = (TextView) view.findViewById(R.id.votes); 
     flowLayout = (FlowLayout) view.findViewById(R.id.hash_tag_layout); 
     bookmark = (ImageView)view.findViewById(R.id.bookmark); 
     share = (ImageView)view.findViewById(R.id.share); 
     IMDBProfile = (ImageView)view.findViewById(R.id.IMDBProfile); 
     cast = (TextView) view.findViewById(R.id.cast); 
    } 
} 

ich die Saiten von StringHolder gesetzt (abgefragt aus meiner Datenbank) auf die Textansichten ViewHolder im bindView Methode meiner cusotm Adapter

public void bindView(final View view, final Context context, final Cursor cursor) { 

    // Get recycled viewHolder 
    final ViewHolder viewHolder = (ViewHolder) view.getTag(); 

    // Bind strings to views in viewHolder 
    StringHolder stringHolder = new StringHolder(cursor); 
    viewHolder.title.setText(stringHolder.title); 
    viewHolder.plot.setText(parsePlot(stringHolder.shortPlot, stringHolder.fullPlot)); 
    viewHolder.imdbratings.setText(stringHolder.imdbRating + "/10"); 
    viewHolder.votes.setText(formatNumbers(stringHolder.imdbVotes)); 
    viewHolder.countries.setText(stringHolder.countries); 
    viewHolder.directors.setText(stringHolder.directors); 
    viewHolder.releaseDate.setText(parseDate(stringHolder.releaseDate)); 
    viewHolder.genres.setText(stringHolder.genres); 
    viewHolder.cast.setText(stringHolder.cast); 

} 

Das Problem ist mein Haupt-Thread eine riesige amound Arbeit und das Überspringen Frames tut. Ich habe versucht, die Ansichten in einem neuen Thread Bindung wie so

public void bindView(final View view, final Context context, final Cursor cursor) { 

    // Get recycled viewHolder 
    final ViewHolder viewHolder = (ViewHolder) view.getTag(); 

    // Bind strings to views in viewHolder 
    new Thread() { 
     @Override 
     public void run() { 

      StringHolder stringHolder = new StringHolder(cursor); 
      viewHolder.title.setText(stringHolder.title); 
      viewHolder.plot.setText(parsePlot(stringHolder.shortPlot, stringHolder.fullPlot)); 
      viewHolder.imdbratings.setText(stringHolder.imdbRating + "/10"); 
      viewHolder.votes.setText(formatNumbers(stringHolder.imdbVotes)); 
      viewHolder.countries.setText(stringHolder.countries); 
      viewHolder.directors.setText(stringHolder.directors); 
      viewHolder.releaseDate.setText(parseDate(stringHolder.releaseDate)); 
      viewHolder.genres.setText(stringHolder.genres); 
      viewHolder.cast.setText(stringHolder.cast); 

     } 
    }.start(); 

} 

Jetzt bekomme ich diesen Fehler

Nur das Original-Thread, das eine Ansicht Hierarchie erstellt wurden, können ihren Standpunkt berühren.

Haben Sie eine Idee, wie Sie den Fehler beheben können, während Sie die zusätzliche Arbeit in einem separaten Thread warten?

edit:

Hier ist meine newView Methode

// Apply recycling to a view container 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 

    View view = LayoutInflater.from(context).inflate(R.layout.list_item, parent, false); 
    ViewHolder viewHolder = new ViewHolder(view); 
    view.setTag(viewHolder); 

    return view; 
} 
+0

beiseite: Ihr Datenbank-Cursor-Schema scheint sehr, sehr "flach" ... Hast du dich mit ein paar Säulen zusammen getan? Sicher wäre eine "relationale, verschachtelte" Architektur besser. –

Antwort

0

Verwendung runOnUiThread()

runOnUiThread(new Runnable() { 

    @Override 
    public void run() { 
     StringHolder stringHolder = new StringHolder(cursor); 
     viewHolder.title.setText(stringHolder.title); 
     viewHolder.plot.setText(parsePlot(stringHolder.shortPlot,stringHolder.fullPlot)); 
     viewHolder.imdbratings.setText(stringHolder.imdbRating + "/10"); 
     viewHolder.votes.setText(formatNumbers(stringHolder.imdbVotes)); 
     viewHolder.countries.setText(stringHolder.countries); 
     viewHolder.directors.setText(stringHolder.directors); 
     viewHolder.releaseDate.setText(parseDate(stringHolder.releaseDate)); 
     viewHolder.genres.setText(stringHolder.genres); 
     viewHolder.cast.setText(stringHolder.cast);    
    } 
}); 
+0

kann Methode 'runOnUiThread' nicht beheben –

+0

Wahrscheinlich muss [tun es hier] (http://stackoverflow.com/questions/15152355/runonuithreadnew-runnable-is-undefined-for-the-type-new-thread) –

+0

Was? ist der Punkt, zu einem anderen Thread zu gehen, nur um die Aufgabe auf dem UI-Thread erneut auszuführen? – X3Btel

0

Es ist nicht sinnvoll, die ganze Sicht Bindung auf anderen Thread zu bewegen. Text zu sehen ist nicht teuer Operation die Erstellung der StringHolder ist. Sie können AsyncTask lesen den Cursor in der doInBackground-Methode, dann onPostExecute, die auf UI-Thread ausgeführt wird, können Sie Werte für Ihre Ansichten

Verwandte Themen