getView из перегруженного ArrayAdapter не вызывается из AsyncTask / onPostExecute - PullRequest
3 голосов
/ 02 сентября 2011

Привет, это мой первый пост здесь, и мое первое немного более продвинутое приложение для моего телефона на Android ... Я знаю, что эта тема упоминалась здесь, Google знает много примеров, однако они не совсем соответствуют моей форме; (

Я признаю, что я n00000b ... с точки зрения кодирования Android ... Я начал ... всего несколько дней назад, пожалуйста, прости меня:)

Проблема в том, что мойЭлемент listview не заполняется.Приложение компилируется и работает без ошибок, НО оно не запускает getView.Из того, что я прочитал в Интернете ... Мне нужно это, чтобы отобразить мой любимый просмотр списка с его содержанием ...

Пожалуйста, помогите :)

    package com.test.stackParser;

    public class StackParserActivity extends Activity {
/** Called when the activity is first created. */
private ProgressDialog pd;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    //final TextView tv = (TextView) findViewById(R.id.textView1);
    //tv.setMovementMethod(new ScrollingMovementMethod());

    Button button = (Button)findViewById(R.id.button1);
    button.setOnClickListener(myListener);
}

private OnClickListener myListener = new OnClickListener() {
    public void onClick(View v) {
        pd = ProgressDialog.show(StackParserActivity.this, "Working...", "request to server", true, false);
        new ParseSite().execute("http://multikino.pl/pl/repertuar/warszawa-ursynow/2011-09-02/");
    }
};

private class ParseSite extends AsyncTask<String, Void, List<String>> {

    protected List<String> doInBackground(String... arg) {
        List<String> output = new ArrayList<String>();

        try
        {
            HtmlHelper hh = new HtmlHelper(new URL(arg[0]));
            List<TagNode> links = hh.getLinksByClass("title");

            for (Iterator<TagNode> iterator = links.iterator(); iterator.hasNext();)
            {
                TagNode divElement = (TagNode) iterator.next();
                output.add(divElement.getText().toString());
            }
            Log.d("dupa", "siteParsed");
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

        return output;
    }

    protected void onPostExecute(List<String> output) {

        pd.dismiss();
        Log.d("dupa", "postExecute");
        ListView listview = (ListView) findViewById(R.id.listViewData);
        //listview.setAdapter(new ArrayAdapter<String>(StackParserActivity.this, android.R.layout.simple_list_item_1 , output));
        MyAdapter dupa = new MyAdapter(StackParserActivity.this, android.R.layout.simple_list_item_1, R.id.movieTitle, output); 
        dupa.notifyDataSetChanged();
        listview.setAdapter(dupa);
        dupa.notifyDataSetChanged();

    }
}

private class MyAdapter extends ArrayAdapter<string> {

    String[] tabObj;

    public MyAdapter(Context context, int resource, int textViewResourceId, List<String> output) {
        super(context, resource, textViewResourceId);
        tabObj = output.toArray(new String[]{});

        Log.d("dupa", tabObj[2].toString());
        notifyDataSetChanged();
        // TODO Auto-generated constructor stub
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        Log.d("dupa", "!!!!getView");

        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View row = inflater.inflate(R.layout.row_layout,parent,false);
        TextView tv = (TextView) row.findViewById(R.id.movieTitle);         

        tv.setText(tabObj[position]);

        //Button buton1 = (Button) row.findViewById(R.id.buttonInfo);
        //Button button2 = (Button) row.findViewById(R.id.buttonReserve);

        return super.getView(position, convertView, parent);
    }
};

}

Ответы [ 3 ]

5 голосов
/ 02 сентября 2011

Возврат row из getView метода.Также удалите notifyDatasetChanged() из конструктора MyAdapter.

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    Log.d("dupa", "!!!!getView");

    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View row = inflater.inflate(R.layout.row_layout,parent,false);
    TextView tv = (TextView) row.findViewById(R.id.movieTitle);         

    tv.setText(tabObj[position]);

    //Button buton1 = (Button) row.findViewById(R.id.buttonInfo);
    //Button button2 = (Button) row.findViewById(R.id.buttonReserve);

    return row;
}

РЕДАКТИРОВАТЬ: Попробуйте переопределить getCount в адаптере, где вы возвращаете size() из tabObj

1 голос
/ 02 сентября 2011

Поскольку вы устанавливаете адаптер на PostExecute, нет необходимости устанавливать notifyDataChanged в любом месте, где вы его вызываете.

Причина, по которой используется notifyDataChanged, заключается в том, чтобы уведомить адаптер, для которого был задан просмотр списка, об изменении данных, и вы должны обновить их. Надеюсь, это поможет!

0 голосов
/ 13 августа 2012
private class MyAdapter extends ArrayAdapter<string> {

    String[] tabObj;

    public MyAdapter(Context context, int resource, int textViewResourceId, List<String> output) {
        super(context, resource, textViewResourceId);
        tabObj = output.toArray(new String[]{});

Когда мы создаем собственный адаптер массива, мы должны использовать либо

public ArrayAdapter (Context context, int textViewResourceId, T[] objects)

public ArrayAdapter (Context context, int resource, int textViewResourceId, T[] objects)

public ArrayAdapter (Context context, int textViewResourceId, List<T> objects)

public ArrayAdapter (Context context, int resource, int textViewResourceId, List<T> objects)

если мы не используем упомянутый выше адаптер, нам нужно переопределить метод getCount().

В вашем случае super(context, resource, textViewResourceId,output); решит вашу проблему.

...