2011-09-02 54 views
3

您好我的第一篇文章我的第一个Android应用程序的更高级的应用程序...我知道这个主题在这里提到,谷歌知道很多例子,但他们不是什么即时通讯形式;(从重载的ArrayAdapter getView不being从AsyncTask/onPostExecute调用

我承认我是一个n00000b ...在Android编码方面...我开始...前几天,请原谅我:)

问题是我的listview元素没有被填充。应用程序编译和运行没有错误,但它没有午餐getView。从我阅读网络上...我需要这与它的内容显示我心爱的ListView ...

请帮助:)

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

}

回答

5

返回rowgetView方法。也从MyAdapter构造函数中删除notifyDatasetChanged()

@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,你返回tabObj

+0

我按照你的建议更改了代码。 Iam现在返回行,我删除了所有notifyDatasetChanged(),但仍然没有。 getView方法不吃午餐。 Log.d(“dupa”,“!!!! getView”);不会输出任何内容到Log:/ – mentis

+3

您应该在适配器中重写'getCount'。 – Ronnie

+0

是的:D thx非常非常! – mentis

1

既然你设置适配器onPostExecute,没有必要在你调用它的任何地方设置notifyDataChanged。

使用notifyDataChanged的原因是通知已设置为列表视图的适配器数据已更改,您应更新它。希望这可以帮助!

+0

我怀疑,添加notifyDataChanged没有帮助...这是我的绝望行为:/ – mentis

+0

从onPostExecute和适配器的构造函数中删除这两个。如果它仍然没有工作,你会得到任何错误?列表的大小是否大于0? –

+0

删除所有'notifyDataChanged()'Log.d(“dupa”,tabObj [2] .toString())后仍然不起作用。在DDMS中显示正确的数据,所以是的,列表'输出'> 0和数组'tabObj'> 0. – mentis

0
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[]{}); 

size() arrayadapter我们必须使用任何

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); 将解决你的问题。

相关问题