-1

parse.com データベースから曲データを取得し、カスタム Listview で表示する Android アプリを作成しています。

Nitinが提案した方法で試しましたが、まだリストビューが表示されません。

新しいコードは次のとおりです。

package de.android;

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

import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

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


public class Lyrics extends ListActivity {



    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>();

    ProgressDialog dialog;



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

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




            initDataToView();


        }

    private void initDataToView() {


        new getData().execute();
        songList = (ListView)findViewById(android.R.id.list);

    }

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

        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();
            Log.d("Parse", "PreExecute");
        }

        @Override
        protected SongAdapter doInBackground(Void... params) {



            ParseQuery pq = new ParseQuery("SongDatenbank");
            pq.whereExists("Titel");
            pq.findInBackground(new FindCallback() {

                @Override
                public void done(List<ParseObject> liederListe,
                        com.parse.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"));
                        }
                        initDataToView(); 

                        x = liederListe.get(0);

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


                    }else{

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


            });



            return null;
        }

        protected void onPostExecute(SongAdapter result) {

            songList.setAdapter(result);

            dialog.dismiss();
            Log.d("Parse", "Postexecute");
        }


    }





    public class SongAdapter extends ArrayAdapter<String> {
         private final Context context;
         private final ArrayList<String> valuesTitel;
         private final ArrayList<String> valuesInterpret;
         private final ArrayList<String> valuesDauer;


          public SongAdapter(Context context, ArrayList<String> valuesTitel, ArrayList<String> valuesInterpret, ArrayList<String> valuesDauer) {
            super(context, R.layout.list_row);
            this.context = context;
            this.valuesTitel = valuesTitel;
            this.valuesInterpret = valuesInterpret;
            this.valuesDauer = valuesDauer;
          }



          public View getView(int position, View convertView, ViewGroup parent){
              LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

              View rowView = inflater.inflate(R.layout.list_row, parent, false);
              ImageView imageView = (ImageView)rowView.findViewById(R.id.list_image);
              TextView titelText = (TextView)rowView.findViewById(R.id.title);
              TextView artistText = (TextView)rowView.findViewById(R.id.artist);
              TextView duration = (TextView)rowView.findViewById(R.id.duration);



              titelText.setText(valuesTitel.get(position));
              artistText.setText(valuesInterpret.get(position));
              duration.setText(valuesDauer.get(position));
              Log.d("Parse", valuesTitel.get(position));
              return rowView;



          }












    }}

問題はデータの解析にあり、それらをパラメーターとしてアダプターに渡すことにあると思います。その方法はありますか?

誰かが私のコードを見て、問題を解決するのを手伝ってくれたら本当にありがたいです.

ありがとう、ポール

4

3 に答える 3

1

ユーザー インターフェイスを更新するためのハンドラを作成するか、Asynctask を使用することをお勧めします。

スレッドから UI を更新する

doInBackground メソッドでの長い操作について説明している最初の回答のリンクを確認してください。データを取得し、onPostExecute でアダプターを設定する必要があります。

次のコードのコメントを読んでください。

private class PrepareAdapter1 extends AsyncTask<Void,Void,ContactsListCursorAdapter > {
    ProgressDialog dialog;
    @Override
    protected void onPreExecute() {
        dialog = new ProgressDialog(viewContacts.this);
        dialog.setMessage(getString(R.string.please_wait_while_loading));
        dialog.setIndeterminate(true);
        dialog.setCancelable(false);
        dialog.show();
    }
    /* (non-Javadoc)
     * @see android.os.AsyncTask#doInBackground(Params[])
     */
    @Override
    protected ContactsListCursorAdapter doInBackground(Void... params) {

        //do here parsing   

        return adapter1;
    }



     protected void onPostExecute(ContactsListCursorAdapter result) {
           dialog.dismiss();
    //Set Adapter
            list.setAdapter(result);

        }
    }
于 2013-02-19T11:15:13.807 に答える
0

チェックしてくださいR.layout.list_row。それは適切に設計されているかどうか。つまり、レイアウトの高さと幅はfill_parentです。あなたのコードからはすべてがうまく見えるからです。

于 2013-02-19T11:18:41.587 に答える
-1

getCountAdapter クラスにメソッドがありません。次のコードを試してください。

    @Override
    public int getCount() 
    {
        return x.size();// number of datas in the list .
    }

このメソッドは、getView が自動的に設定される回数を指定します。

............もう1つの提案は、extend BaseAdapter代わりに使用することですArrayAdapter<String>

于 2013-02-19T11:13:07.553 に答える