2013-07-01 74 views
3

我在另一个Activity类中使用了相同的模式,它完美地工作。但在这个类(也是一个Activity)中,getView是从不调用。我通过记录fbFriendMatchAdapter.getCount()来确认适配器中有9个项目。我试着将数据源更改为String []变量,但这对getView的(缺少)没有影响。自定义ArrayAdapter getView未被调用 - 为什么不?

我将不胜感激任何建议!我已经彻底研究过了。这个问题有各种各样的味道,但没有解决我的问题。这就是为什么我发布一个新问题。

//Here is the ArrayList data source definition. 
//It is loaded using a for loop with 9 values. 
private List<String> fbFriendMatchAdapter=new ArrayList<String>(); 


// Here is the Custom Array Adapter 
ArrayAdapter<String> fbFriendMatchAdapter = new ArrayAdapter<String>(this, 
     R.layout.row_left, R.id.ListViewName, fbFriendPotentialMatchArrayList) { 

    @Override 
    public View getView(final int dialogPosition, View convertView, ViewGroup listParent) { 
     LayoutInflater inflater = getLayoutInflater(); 
     View fbFriendMatchDialogViewRow = inflater.inflate(R.layout.row_left, listParent, false); 
     Log.d(BBTAG, String.format("BBSetup getView[%s] name=%s", dialogPosition, buddyDisplayName)); 

     return fbFriendMatchDialogViewRow; 
    } // [END getView] 

    @Override 
    public String getItem(int position) { 
     return fbFriendPotentialMatchArrayList.get(position); 
    } 

}; 

//Here is the dialog that includes the ArrayAdapter: 
AlertDialog fbFriendsMatchDialog = new AlertDialog.Builder(new ContextThemeWrapper(context, R.style.PetesSpinnerReplacement)) 
     .setTitle("Select Correct Facebook Friend") //FYI overridden by custom title 
     .setAdapter(fbFriendMatchAdapter, new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int selectedFBFriend) { 
       buddyFBUIDs[buddyNumber] = fbFriendUIDsList.get(selectedFBFriend); 
      } 
     }) 
     .setMessage("No matches found") 
     .setCancelable(true) 
     .setPositiveButton("Set as Facebook Friend", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int iFriend) { 
       dialog.dismiss(); 
      } 
     }) 
     .setNegativeButton("Friend Not Listed", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int id) { 
       dialog.dismiss(); 
       buddyFBUIDs[buddyNumber] = "n/a"; //record lack of FB uid 
      } 
     }) 
     .create(); //build dialog 
fbFriendsMatchDialog.show(); // now show dialog 
+1

你可以发布你的getCount方法吗? – user936414

+0

为了确保我得到正确的计数,我没有重写getCount(即,我正在使用默认方法)。 – PeteH

回答

6

我建议不要试图内联的ArrayAdapter子对于这一点,因为我相信ArrayAdapter让你的布局和数据的可能会扔你了结构的一些假设。编写自己的自定义适配器非常简单,我几乎建议使用从不使用使用ArrayAdapter(除了最简单的用例外)。只是子类BaseAdapter和四个必需的方法,并使用它。就像这样:

private class MatchAdapter extends BaseAdapter { 
    private List<String> mItems; 
    private LayoutInflater mInflater; 

    public MatchAdapter (Context c, List<String> items) { 
     mItems = items; 

     //Cache a reference to avoid looking it up on every getView() call 
     mInflater = LayoutInflater.from(c); 
    } 

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

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

    @Override 
    public Object getItem (int position) { 
     return mItems.get(position); 
    } 

    @Override 
    public View getView (int position, View convertView, ViewGroup parent) { 
     //If there's no recycled view, inflate one and tag each of the views 
     //you'll want to modify later 
     if (convertView == null) { 
      convertView = mInflater.inflate (R.layout.row_left, parent, false); 

      //This assumes layout/row_left.xml includes a TextView with an id of "textview" 
      convertView.setTag (R.id.textview, convertView.findViewById(R.id.textview)); 
     } 

     //Retrieve the tagged view, get the item for that position, and 
     //update the text 
     TextView textView = (TextView) convertView.getTag(R.id.textview); 
     String textItem = (String) getItem(position); 
     textView.setText(textItem); 

     return convertView; 
    } 
} 
+0

嘿,那看起来很开胃!我现在就试一试。我也喜欢你的想法来缓存布局充气机。好的提示。 – PeteH

+0

坏消息 - MatchAdapter对问题没有影响。 getView仍然没有被调用。仅供参考,我复制/粘贴你的课程并修改了ID名称。然后我将适配器实例化为MatchAdapter fbFriendMatchAdapter = new MatchAdapter(this,fbFriendPotentialMatchArrayList);'。你有没有其他的见解/想法? – PeteH

+0

我也应该注意到,这个布局上还有一个ListView,它有自己的独立ArrayAdapter。显示对话框时,它位于对话框下方。这可能会干扰MatchAdapter吗?如果是这样,是否有办法处理它? – PeteH

相关问题