2013-02-25 101 views
1

我想使用custom ListView Adapter中的多個元素填充ListView。我試過this tutorial使用自定義適配器填充ListView

不會拋出異常,但它不會在我的ListView中顯示任何內容。

下面的代碼:

Lyrics.java:

package de.lichtenberger.gottschalk.android; 

import static de.lichtenberger.gottschalk.android.Constant.DAUER; 
import static de.lichtenberger.gottschalk.android.Constant.INTERPRET; 
import static de.lichtenberger.gottschalk.android.Constant.TITEL; 

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

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.ArrayAdapter; 
import android.widget.ImageButton; 
import android.widget.ListView; 
import android.widget.TextView; 

import com.parse.FindCallback; 
import com.parse.Parse; 
import com.parse.ParseException; 
import com.parse.ParseObject; 
import com.parse.ParseQuery; 

public class Lyrics extends Activity { 



    ImageButton back; 
    ListView songList; 
    TextView textAnzeige; 
    private ArrayList<String> Titelliste = new ArrayList<String>(); 
    private ArrayList<String> Interpretliste = new ArrayList<String>(); 
    private ArrayList<String> Dauerliste = new ArrayList<String>(); 
    private ArrayAdapter<String> aa; 
    private SAdapter sA; 
    ProgressDialog dialog; 
    private ArrayList<HashMap> list; 



    @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_lyrics); 

      Parse.initialize(this, "hGxasGU6e0WQAOh5JIOGDfvFBKrYyBJKXIzxBfAG", "WsOPsXerpsFjsjekKKbZnnjAHvXy5PQHVQEB8Cqu"); 

      setupUI(); 
      setupOnClickListeners(); 
      new getData().execute(); 

      populateList(); 
      sA = new SAdapter(this, list); 
      songList.setAdapter(sA); 
      sA.notifyDataSetChanged(); 

     } 


    private void populateList() { 

     list = new ArrayList<HashMap>(); 
     HashMap temp = new HashMap(); 


     for(int i=1; i<= Titelliste.size(); i++){ 

      temp.put(TITEL, Titelliste.get(i).toString()); 
      temp.put(INTERPRET, Interpretliste.get(i).toString()); 
      temp.put(DAUER, Dauerliste.get(i).toString()); 
      list.add(temp);   

     } 



    } 


    private class getData extends AsyncTask<Void, Void, SAdapter>{ 

     ProgressDialog dialog; 
     @Override 
     protected void onPreExecute() { 
      dialog = new ProgressDialog(Lyrics.this); 
      dialog.setMessage("Please wait, while loading!"); 
      dialog.setIndeterminate(true); 
      dialog.setCancelable(false); 
      dialog.show(); 
     } 

     @Override 
     protected SAdapter doInBackground(Void... params) { 
      ParseQuery pq = new ParseQuery("SongDatenbank"); 
      pq.whereExists("Titel"); 
      pq.findInBackground(new FindCallback() { 

       @Override 
       public void done(List<ParseObject> liederListe, ParseException e) { 
        if(e==null){ 
         Log.d("Parse", "Objektliste empfangen"); 

          ParseObject x; 

         for(int i=0;i<liederListe.size();i++){ 
          x = liederListe.get(i); 
          Titelliste.add(x.getString("Titel")); 
          Dauerliste.add(x.getString("Dauer")); 
          Interpretliste.add(x.getString("Interpret")); 
         } 


         x = liederListe.get(0); 

         Log.d("Parse", x.getString("Titel")); 


        }else{ 

         Log.d("Parse", "Objektliste nicht empfangen"); 
        } 
       } 
      }); 
      return null; 
     } 

     protected void onPostExecute(SAdapter result) { 

        dialog.dismiss(); 
        populateList(); 
        sA = new SAdapter(Lyrics.this, list); 
        songList.setAdapter(sA); 
        sA.notifyDataSetChanged(); 
     } 


    } 



    private void setupOnClickListeners() { 

     back.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       Intent back = new Intent(Lyrics.this, Lagerfeuer_Lieder.class); 
       startActivity(back); 

      } 
     }); 
    } 

    private void setupUI() { 


     back = (ImageButton)findViewById(R.id.back); 
     songList = (ListView)findViewById(R.id.list); 
     textAnzeige = (TextView)findViewById(R.id.lyricsView); 

    } 

} 

我的適配器:

package de.lichtenberger.gottschalk.android; 

import java.util.ArrayList; 
import java.util.HashMap; 

import android.app.Activity; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.TextView; 

import static de.lichtenberger.gottschalk.android.Constant.DAUER; 
import static de.lichtenberger.gottschalk.android.Constant.TITEL; 
import static de.lichtenberger.gottschalk.android.Constant.INTERPRET; 







public class SAdapter extends BaseAdapter 
{ 
    public ArrayList<HashMap> list; 
    Activity activity; 

    public SAdapter(Activity activity, ArrayList<HashMap> list) { 
     super(); 
     this.activity = activity; 
     this.list = list; 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return list.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return list.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    private class ViewHolder { 
      TextView titel; 
      TextView artist; 
      TextView duration; 

     } 

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

       ViewHolder holder; 
       LayoutInflater inflater = activity.getLayoutInflater(); 

       if (convertView == null) 
       { 
        convertView = inflater.inflate(R.layout.list_row, null); 
        holder = new ViewHolder(); 
        holder.titel = (TextView) convertView.findViewById(R.id.title); 
        holder.artist = (TextView) convertView.findViewById(R.id.artist); 
        holder.duration = (TextView) convertView.findViewById(R.id.duration); 
        convertView.setTag(holder); 
       } 
       else 
       { 
        holder = (ViewHolder) convertView.getTag(); 
       } 

       HashMap map = list.get(position); 
       holder.titel.setText(map.get(TITEL).toString()); 
       holder.artist.setText(map.get(INTERPRET).toString()); 
       holder.duration.setText(map.get(DAUER).toString()); 


      return convertView; 
    } 

} 

這裏我activity_lyrics.xml:

<RelativeLayout 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:background="@drawable/background" > 

    <ImageButton 
     android:layout_width="150dp" 
     android:layout_height="40dp" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentLeft="true" 
     android:layout_marginRight="0dp" 
     android:contentDescription="back" 
     android:id="@+id/back" 
     android:background="@drawable/back" 
     android:text="@string/Lagerfeuer"/> 

    <ImageView 
     android:layout_width="fill_parent" 
     android:layout_height="40dp" 
     android:layout_alignTop="@id/back" 
     android:layout_toRightOf="@id/back" 
     android:background="@drawable/back2" 

     android:contentDescription="back2"/> 



    <ListView 
     android:layout_below="@id/back" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:divider="#b5b5b5" 
     android:dividerHeight="1dp" 
     android:listSelector="@drawable/list_selector" 
     android:id="@+id/list" 
     /> 
</RelativeLayout> 

我的list_row.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="@drawable/list_selector" 
    android:orientation="horizontal" 
    android:padding="5dip" > 

    <!-- ListRow Left sied Thumbnail image --> 
    <LinearLayout android:id="@+id/thumbnail" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:padding="3dip" 
     android:layout_alignParentLeft="true" 
     android:background="@drawable/image_bg" 
     android:layout_marginRight="5dip"> 

     <ImageView 
      android:id="@+id/list_image" 
      android:layout_width="50dip" 
      android:layout_height="50dip" 
      android:src="@drawable/guitar_1"/> 

    </LinearLayout> 

    <!-- Title Of Song--> 
    <TextView 
     android:id="@+id/title" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignTop="@+id/thumbnail" 
     android:layout_toRightOf="@+id/thumbnail" 
     android:text="Rihanna Love the way lie" 
     android:textColor="#040404" 
     android:typeface="sans" 
     android:textSize="15sp" 
     android:textStyle="bold"/> 

    <!-- Artist Name --> 
    <TextView 
     android:id="@+id/artist" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/title" 
     android:textColor="#343434" 
     android:textSize="10sp" 
     android:layout_marginTop="1dip" 
     android:layout_toRightOf="@+id/thumbnail" 
     android:text="Just gona stand there and ..." /> 

    <!-- Rightend Duration --> 
    <TextView 
     android:id="@+id/duration" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_alignTop="@id/title" 
     android:gravity="right" 
     android:text="5:45" 
     android:layout_marginRight="5dip" 
     android:textSize="10sp" 
     android:textColor="#10bcc9" 
     android:textStyle="bold"/> 


    </RelativeLayout> 

我真的很感激,如果任何人都可以瀏覽這些代碼,可以給我一些建議如何解決我的問題。

+0

添加xml以及 – 2013-02-25 10:10:22

回答

2

使用onPostExecute爲的AsyncTask的doInBackground方法執行完畢後設置適配器的ListView,而不是僅僅執行的AsyncTask作爲後調用它:

@Override 
protected void onPostExecute(SAdapter result) { 

      dialog.dismiss(); 

      // populate Listview here... 
      populateList(); 
      sA = new SAdapter(Lyrics.this, list); 
      songList.setAdapter(sA); 
      sA.notifyDataSetChanged(); 
     } 
+0

偉大的觀察。 – 2013-02-25 10:14:57

+0

不起作用...也許它的東西與我的XML文件...我把它們添加到我的問題 – 2013-02-25 17:08:07

+0

@PaulLich:也添加最新的代碼的歌詞類 – 2013-02-25 17:11:25

0
listview= (ListView)findViewById(R.id.listview); 
listview.setOnItemSelectedListener(this); 
String days[] = {"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}; 
ArrayAdapter<String> newAdpt= new ArrayAdapter<String>(this,android.R.layout.simple_listview_item,days); 
newAdpt.setDropDownViewResource(android.R.layout.select_dialog_singlechoice); 
listview.setAdapter(newAdpt); 
0

你可以使用這樣的事情:

@Override 
protected void onPostExecute(List<Contact> result) {    
    super.onPostExecute(result); 
    dialog.dismiss(); 
    adpt.setItemList(result); 
    adpt.notifyDataSetChanged(); 
} 

@Override 
protected void onPreExecute() {   
    super.onPreExecute(); 
    dialog.setMessage("Downloading contacts..."); 
    dialog.show();    
} 

你可以看看here(Android Async ListView -JEE和RestFul)

0

可能是一個愚蠢的答案,但

HashMap的是原始類型。引用泛型類型HashMap的應該是參數

嘗試:

HashMap <String, String> map 

改變它在適配器和主類機構。 同樣的問題發生在我身上,但不知道爲什麼,唯一不同的是我看到的是hashmap引用。

相關問題