0

Android フォンのすべての連絡先を表示するアクティビティを開発しました。取得した連絡先を表示するために ListView を使用しています。問題は、リスト項目をクリックするたびに ListView をスクロールしないときまでです。特定の連絡先レコードの詳細が表示されます。しかし、スクロールしてリスト内の項目をクリックすると、アプリケーションがクラッシュし、NullPointerException がスローされます。どこが間違っているのか、どのように結果を達成するのかを誰かが教えてくれますか? これは重複した質問かもしれませんが、ネット全体を検索してみましたが、成功しませんでした。以下は、連絡先を表示するアクティビティのコード スニペットです。

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

    filterText = (EditText) findViewById(R.id.search_box);     
    filterText.addTextChangedListener(filterTextWatcher); 

    mContactList = (ListView) findViewById(R.id.contactList);
    populateContactList();      

}

private void populateContactList()
{
    // Another class used to retrieve contacts
              ContactAPI contactAPI = ContactAPI.getAPI();
    ContentResolver cr = getContentResolver();
    contactAPI.setCr(cr);

    ArrayList<Contact> a = new ArrayList<Contact>();
    a = contactAPI.newContactList(this).getContacts();

    contactsAL = new ArrayList<Contact>(a);     

    adapter = new CustomAdapter(this, R.layout.contact_entry, a);       

    mContactList.setAdapter(adapter);   

    mContactList.setOnItemClickListener(new OnItemClickListener(){
    public void onItemClick(AdapterView<?> parent, View view, int position, long id)
    {               

               ***// The below is the line where I am getting NullPointerException***
        LinearLayout l = (LinearLayout) parent.getChildAt(position);
        TextView tv = (TextView) l.getChildAt(1);

        Intent myIntent = new Intent(view.getContext(), ContactDetailsActivity.class);

        Bundle b = new Bundle();
        b.putString("ContactID", tv.getText().toString());
        myIntent.putExtras(b);

        startActivityForResult(myIntent, 0);
    }
    });



private TextWatcher filterTextWatcher = new TextWatcher() 
{      
    public void afterTextChanged(Editable s) 
    {     

    }      
    public void beforeTextChanged(CharSequence s, int start, int count, int after) 
    {     

    }      
    public void onTextChanged(CharSequence s, int start, int before, int count) 
    {         
        adapter.getFilter().filter(s);
    }  
};

protected void onDestroy() 
{     
    super.onDestroy();     
    filterText.removeTextChangedListener(filterTextWatcher); 
}   

以下は、私のカスタム アダプター クラスのコード スニペットです。

private ArrayList<Contact> original; 
private ArrayList<Contact> fitems;
private Filter filter;

private LayoutInflater mInflater;

public CustomAdapter(Context context, int layoutResourceId, ArrayList<Contact> data) 
{
    super(context, layoutResourceId, data);
    this.layoutResourceId = layoutResourceId;
    this.context = context;
    this.original = new ArrayList<Contact>(data);         
    this.fitems = new ArrayList<Contact>(data);
}   

public long getItemId(int position) {
    return position;
}

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

    if (convertView == null) 
    {
        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);         
        convertView = mInflater.inflate(R.layout.contact_entry, null);
        holder = new ViewHolder();          
        holder.txtName = (TextView) convertView.findViewById(R.id.contactEntryText);
        holder.txtID = (TextView) convertView.findViewById(R.id.contactID);

        convertView.setTag(holder);         
    } 
    else 
    {           
        holder = (ViewHolder) convertView.getTag();         
    }

    if(fitems != null)
    {
        Contact ct = fitems.get(position);
        if(ct != null)
        {
            holder.txtName.setText((String)ct.getDisplayName());
            holder.txtID.setText((String)ct.getId());
        }
    }

    //this.notifyDataSetChanged();

    return convertView;
}

@Override
public Filter getFilter() {
    // TODO Auto-generated method stub
    // return super.getFilter();

    if (filter == null)         
        filter = new ContactFilter();      

    return filter;
}


private class ContactFilter extends Filter 
{ 
    @Override 
    protected FilterResults performFiltering(CharSequence constraint) 
    { 
        FilterResults results = new FilterResults(); 
        String prefix = constraint.toString().toLowerCase(); 

        if (prefix == null || prefix.length() == 0) 
        { 
            ArrayList<Contact> list = new ArrayList<Contact>(original); 
            results.values = list; 
            results.count = list.size(); 
        } 
        else 
        { 
            final ArrayList<Contact> list = new ArrayList<Contact>(original); 
            final ArrayList<Contact> nlist = new ArrayList<Contact>(); 
            int count = list.size(); 

            for (int i=0; i<count; i++) 
            { 
                final Contact cont = list.get(i); 
                final String value = cont.getDisplayName().toLowerCase(); 

                if (value.contains(prefix)) 
                { 
                    nlist.add(cont); 
                } 
            } 
            results.values = nlist; 
            results.count = nlist.size(); 
        } 
        return results; 
    } 

    @SuppressWarnings("unchecked") 
    @Override 
    protected void publishResults(CharSequence constraint, FilterResults results) 
    { 
        fitems = (ArrayList<Contact>)results.values; 

        clear(); 
        int count = fitems.size(); 
        for (int i=0; i<count; i++) 
        { 
            Contact cont = (Contact)fitems.get(i); 
            add(cont); 
        } 
    } 
}

static class ViewHolder {
    TextView txtName;
    TextView txtID;
}

誰かが私がどこで間違っているのか教えてもらえますか?

4

2 に答える 2

0

メイン アクティビティの設定 onitemclicklistener を削除します。

CustomAdapter では、getView メソッド内で、clicklistener を textview に追加するだけです

holder.txtName.setOnclickListener(new OnClickListener() {

   @Override
  public void onClick() {
  Intent myIntent = new Intent(view.getContext(), ContactDetailsActivity.class);

    Bundle b = new Bundle();
    b.putString("ContactID", holder.txtName.getText().toString());
    myIntent.putExtras(b);

    startActivityForResult(myIntent, 0);

   }
})
于 2012-04-19T14:31:01.290 に答える
0

onItemClick呼び出し CustomAdapter をint します。getItem(int)Contact使用して位置のオブジェクトを取得し、連絡先を使用して新しいアクティビティを開始するために必要な情報を取得します。

于 2012-04-19T13:53:41.483 に答える