2013-07-01 3 views
3

Я использовал этот же шаблон в другом классе Activity, и он отлично работает. Но в этом классе (также Activity) getView - это , а не. Я подтвердил, что в адаптере есть 9 элементов, запустив fbFriendMatchAdapter.getCount(). Я попытался изменить источник данных на переменную String [], но это не повлияло на (отсутствие) getView.Custom ArrayAdapter getView не называется - почему нет?

Буду признателен за любые предложения! Я уже тщательно изучил SO. Существует множество вариантов этого вопроса, но никто не решил мою проблему. Вот почему я публикую новый вопрос.

//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 все еще не вызван. FYI Я копировал/вставлял ваш класс и исправлял имена имен. Затем я создал экземпляр адаптера как «MatchAdapter fbFriendMatchAdapter = new MatchAdapter (это, fbFriendPotentialMatchArrayList);». У вас есть другие идеи/идеи? – PeteH

+0

Я также должен отметить, что есть также ListView на этом макете со своим независимым ArrayAdapter. Он отображается под диалогом при отображении диалога. Может ли это вмешательство в MatchAdapter? Если да, есть ли способ справиться с этим? – PeteH

Смежные вопросы