1

私は、取り組んでいるプロジェクトを移植するために Android にジャンプする iOS 開発者ですが、Android のカスタム BaseAdapter に関するいくつかの概念を把握できていないようです。私は、サイトから XML を解析し、XML 要素のテキストを ListView に入力するアプリに取り組んでいます。XML 解析部分は問題なくダウンしています。私が遭遇する問題は、リスト ビューの各行にボタンを追加することです。OnClick リスナーを設定する概念と、BaseAdapter を実装する必要があることは理解していますが、メイン アクティビティから BaseAdapter を含むセットアップしたクラスにデータを取得できないようです。現在、アプリを起動してもデータが表示されません。いくつかのデバッグを実行し、menuItems ArrayList からのデータが BaseAdapter クラスに適切に送信されることを確認しました。ListView に表示する方法がわからないだけです。それはおそらく非常に小さなもので、私はそれを長い間見てきただけで、まだ見ていないと思います。どんな助けでも大歓迎です。コードとレイアウトの XML を以下に示します。

public class Podcasts extends ListActivity{

private static final String HASHMAP_ID = "_id";
private CustomAdapter adap;

static final String URL = "http://www.undignified.podbean.com/feed";

//XML Node Keys
static final String KEY_ITEM  = "item";
static final String KEY_TITLE = "title";
static final String KEY_DESCRIPTION = "itunes:subtitle";
static final String KEY_PODCASTURL = "enclosure";

public static final  ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>();

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.podcasts); 


    //Instance of XML parser
    UndigParser uparser = new UndigParser();

    String xml = uparser.getXmlFromURL(URL);        

    Document doc = uparser.getDomElement(xml);    

    NodeList nl = doc.getElementsByTagName(KEY_ITEM);

    for(int i = 0; i < nl.getLength(); i++){

        HashMap<String, String> map = new HashMap<String, String>();
        Element e = (Element) nl.item(i);


        map.put(KEY_TITLE, uparser.getValue(e, KEY_TITLE));
        map.put(KEY_DESCRIPTION, uparser.getValue(e, KEY_DESCRIPTION));
        map.put(KEY_PODCASTURL, uparser.getValue(e, KEY_PODCASTURL));



        menuItems.add(map);
    }

     adap = new CustomAdapter(this, menuItems, R.layout.list_item, new String[] {KEY_TITLE, KEY_DESCRIPTION, KEY_PODCASTURL}, new int[]{ R.id.title, R.id.description, R.id.podcasturl});
    //adap = new CustomAdapter(this, menuItems);

    setListAdapter(adap);


public static class CustomAdapter extends BaseAdapter implements Filterable{

    private LayoutInflater mInflater;
    private Context context;


    public CustomAdapter(Context context, ArrayList<HashMap<String, String>> menuItems, int listItem, String[] strings, int[] is){

        mInflater = LayoutInflater.from(context);
        this.context = context;
    }

    public View getView(final int position, View convertView, ViewGroup parent){
        ViewHolder holder;

        if(convertView==null){
            convertView = mInflater.inflate(R.layout.list_item, null);

            holder = new ViewHolder();
            holder.description=(TextView)convertView.findViewById(R.id.description);
            holder.podcasturl=(TextView)convertView.findViewById(R.id.podcasturl);
            holder.title=(TextView)convertView.findViewById(R.id.title);
            holder.downloadBTN=(Button)convertView.findViewById(R.id.btnStartDownload);

            convertView.setOnClickListener(new OnClickListener(){
                private int pos = position;

                @Override
                public void onClick(View v){
                    Toast.makeText(context, "Text-" + String.valueOf(pos), Toast.LENGTH_SHORT).show();
                }
            });

            holder.downloadBTN.setOnClickListener(new OnClickListener(){
                private int pos = position;

                @Override
                public void onClick(View v){
                    Toast.makeText(context, "Button-"+String.valueOf(pos), Toast.LENGTH_SHORT).show();
                }
            });
            convertView.setTag(holder);
        }else{
            holder = (ViewHolder)convertView.getTag();
        }

        return convertView;
    }

    static class ViewHolder{
        TextView description;
        TextView title;
        TextView podcasturl;
        Button downloadBTN;
    }

    @Override
    public int getCount() {
        // Currently set to zero. If I set it to menuItems.size() it will crash the app.
        return 0;
    }

    @Override
    public Object getItem(int position) {

        return null;
    }

    @Override
    public long getItemId(int position) {

        return 0;
    }

    @Override
    public Filter getFilter() {

        return null;
    }
}

XML レイアウト - list_item.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="wrap_content"
android:orientation="vertical"
android:padding="5dip">

<LinearLayout
android:id="@+id/LinearLayout01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
xmlns:android="http://schemas.android.com/apk/res/android">

<Button
    android:id="@+id/startPodcastDownload"
    android:layout_width="50dip"
    android:layout_height="50dip"
    android:focusable="false"
    android:text="Download Podcast"> 
</Button>        


</LinearLayout>    
    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/LinearLayout01"
        android:textColor="#acacac"
        android:paddingBottom="2dip">
    </TextView>
    <TextView
        android:id="@+id/description"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/LinearLayout01"
        android:layout_below="@id/title"
        android:textColor="#acacac"
        android:paddingBottom="2dip">
    </TextView>
    <TextView
        android:id="@+id/podcasturl"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/LinearLayout01"
        android:layout_below="@+id/description"
        android:textColor="#acacac"
        android:paddingBottom="2dip">
    </TextView>

</RelativeLayout> 
4

1 に答える 1

0
@Override
    public int getCount() {
        return menuItems.size();
    }

    @Override
    public Object getItem(int position) {

        return position;
    }

次の変更も行います。

adap = new CustomAdapter(this, menuItems, R.layout.list_item, new String[] {KEY_TITLE, KEY_DESCRIPTION, KEY_PODCASTURL}, new int[]{ R.id.title, R.id.description, R.id.podcasturl});

に:

adap = new CustomAdapter(YourActivityName.this, menuItems);

アダプタのコンストラクタを次のように作成します。

public CustomAdapter(Context context, ArrayList<HashMap<String, String>> menuItems)

アダプターのカウントを 0 として定義したので、どのようにしてリスト内の値を取得しLog'sますかそのためにはNullPointerException、別のエラーが発生している必要があります。

于 2012-07-27T04:06:57.790 に答える