1

いくつかのチュートリアル コードを使用して OnItemClick リスナーを追加しようとしていますが、リスナーにヒットしてアプリをクラッシュさせると例外がスローされ続けます。Android 環境で作業するのはこれが初めての試みなので、これらすべてがどのように相互に関連しているかを学ぼうとしています。

これが私が試したことです:

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

import org.json.JSONObject;

import android.app.AlertDialog;
import android.app.ListActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;


public class RssActivity extends ListActivity{

private RssListAdapter adapter;

private OnItemClickListener newsSelectListener = new OnItemClickListener()
    {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            AlertDialog.Builder alert=new AlertDialog.Builder(RssActivity.this);
            alert.setTitle("Clicked").setMessage("Item clicked").setNeutralButton("OK", null).show();

        }
    };

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

    List<JSONObject> jobs = new ArrayList<JSONObject>();
    try {
        jobs = RssReader.getLatestRssFeed();
    } catch (Exception e) {
        Log.e("RSS ERROR", "Error loading RSS Feed Stream >> " + e.getMessage() + " //" + e.toString());
    }   

    adapter = new RssListAdapter(this,jobs);
    setListAdapter(adapter);

    ListView lv = (ListView)findViewById(R.id.list);
    lv.setOnItemClickListener(newsSelectListener);

    }
}       

また、setListAdapter を lv.setListAdapter に変更しようとしましたが、有効なステートメントではないようです。

私は何が欠けていますか?

4

4 に答える 4

3

ListActivity では、リストのみsetContentView()を表示する場合はレイアウトを割り当てる必要はありませんが、別のビューを追加する場合は、ListView に以下の xml のように設定された属性を含める必要があります。android:id@android:id/list

<ListView
  android:id="@android:id/list"
  android:layout_width="match_parent"
  android:layout_height="wrap_content" >
</ListView>

コードを変更してみてください

ListView lv = (ListView)findViewById(R.id.list);

これに

ListView lv = getListView();
lv.setOnItemClickListener(newsSelectListener);
于 2012-06-01T02:43:01.383 に答える
1

レイアウトを初期化した場所がわかりません...だから:

Activityクラスは、UIを配置できるウィンドウの作成を処理しますsetContentView(View)

このonCreate(Bundle)メソッドは、を初期化しますActivitysetContentView(int)これは通常、xmlレイアウト(main.xmlまたはUIを定義するxml)で呼び出す場所です。後に配置super.onCreate(..)


この例外に関して:

java.lang.RuntimeException: Unable to start activity ComponentInfo{}:

AndroidManifest.xmlあなたActivityがすでにそこにいるかどうかを確認してください:

<activity android:name=".<ActivityName>" 
          android:label="@string/app_name">
</activity>

問題が解決されていない場合は、を利用しLogcatLog.dメソッドを入力し、クラッシュしている場所を確認してください。

于 2012-06-01T02:21:16.213 に答える
1

あなたのコードが機能するかどうかわかりません

private OnItemClickListener newsSelectListener = new OnItemClickListener()
{
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        AlertDialog.Builder alert=new AlertDialog.Builder(RssActivity.this);
        alert.setTitle("Clicked").setMessage("Item clicked").setNeutralButton("OK", null).show();

    }
};

しかし、私の意見では、クラスのメソッドでsetOnClickListener()convertView に追加することがよくありますgetViewAdapter

public View getView(final int position, View convertView, ViewGroup parent) {
......................
convertView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                //Do Somethings in here
                }
            }
        });
于 2012-05-31T22:12:50.430 に答える
0

編集

わかりました-そして、どこに設定していますsetContentView(...)か? のlv

ListView lv = (ListView) findViewById(R.id.list);

contentView を設定していないため、null です。


おそらくこれは、 inに設定OnClickListenerしていることが原因です。nullAlertDialog.BuildersetNeutralButton("OK", null)

したがって、[OK] をクリックすると、Android は (内部的に) 次のように呼び出します。

neutralButtonListener.onClick(...);

そして、neutralButtonListenerですnull。したがって、少なくとも空のリスナーを提供する必要があります。

于 2012-05-31T22:11:03.970 に答える