自定义ArrayAdapter getView没有被调用 - 为什么不呢?

时间:2013-07-01 04:48:08

标签: android android-arrayadapter

我在另一个Activity类中使用了相同的模式,它完美无缺。但是在这个类(也是一个Activity)中,getView是从不调用的。我通过记录fbFriendMatchAdapter.getCount()确认适配器中有9个项目。我已经尝试将数据源更改为String []变量,但这对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 个答案:

答案 0 :(得分:6)

我建议不要试图为此内联一个ArrayAdapter子类,因为我相信ArrayAdapter会对您的布局和数据结构做出一些假设,这可能会让您失望。编写自己的自定义适配器非常简单,我几乎建议使用ArrayAdapter never (除了最简单的用例)。只需子类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;
    }
}