Фильтрация ListView с помощью Baseadapter фильтрует текст, а не изображения

Был достигнут некоторый прогресс в решении более ранней проблемы. Теперь появилась новая проблема. Текст в GridView показывает правильный результат. Тем не менее, изображения такие же, как в начале списка.

Например: если я ищу & quot;Sidd& Quot; он отображает три результата, но фотографии по-прежнему начинаются как для пользователей, начинающихся с & quot;A& Quot ;. Прилагается скриншот для наглядности.

Это код BaseAdapter:

public class TagFriendsAdapter extends BaseAdapter implements Filterable {

    List<String> arrayListNames;
    List<String> mOriginalNames;

    List<String> arrayPictures;
    List<String> mOriginalPictures;

    Activity activity;
    String[] fetFriendID;
    String[] fetFriendName;
    String[] fetFriendPicture;

    LayoutInflater inflater = null;
    ImageLoader imageLoader;

    TagFriendsAdapter(Activity a, String[] stringUID, String[] stringName, String[] stringPicture,
            ArrayList<String> arrayName, ArrayList<String> arrayPicture) {

        activity = a;
        fetFriendID = stringUID;
        fetFriendName = stringName;
        fetFriendPicture = stringPicture;

        this.arrayListNames = arrayName;
        this.arrayPictures = arrayPicture;

        inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        imageLoader = new ImageLoader(activity.getApplicationContext());
    }

    public int getCount() {
        return arrayListNames.size();
    }

    public Object getItem(int position) {
        return position;
    }

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

    @Override
    public void notifyDataSetChanged() {
        super.notifyDataSetChanged();
    }

    public View getView(final int position, View convertView, ViewGroup parent) {
        View vi = convertView;
        if(convertView == null)
            vi = inflater.inflate(R.layout.friends_grid_items, null);

        ImageView imgProfilePicture = (ImageView)vi.findViewById(R.id.imgProfilePicture);
        TextView txtUserName = (TextView)vi.findViewById(R.id.txtUserName);

        txtUserName.setText(arrayListNames.get(position));

        if (arrayPictures.get(position) != null){
            imageLoader.DisplayImage(arrayPictures.get(position), imgProfilePicture);
        }
        else if (arrayPictures.get(position) == null) {
            imgProfilePicture.setVisibility(View.GONE);
        }

        return vi;
    }

    @Override
    public Filter getFilter() {

        Filter filter = new Filter() {

            @SuppressWarnings("unchecked")
            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {

                arrayListNames = (List<String>) results.values;
                notifyDataSetChanged();
            }

            @Override
            protected FilterResults performFiltering(CharSequence constraint) {

                FilterResults results = new FilterResults();
                ArrayList<String> FilteredArrayNames = new ArrayList<String>();

                if (mOriginalNames == null && mOriginalPictures == null)    {
                    mOriginalNames = new ArrayList<String>(arrayListNames);
                    mOriginalPictures = new ArrayList<String>(arrayPictures);
                }
                if (constraint == null || constraint.length() == 0) {
                    results.count = mOriginalNames.size();
                    results.values = mOriginalNames;
                } else {
                    constraint = constraint.toString().toLowerCase();
                    for (int i = 0; i < mOriginalNames.size(); i++) {
                        String dataNames = mOriginalNames.get(i);
                        if (dataNames.toLowerCase().startsWith(constraint.toString()))  {
                            FilteredArrayNames.add(dataNames);
                        }
                    }

                    results.count = FilteredArrayNames.size();
                    System.out.println(results.count);

                    results.values = FilteredArrayNames;
                    Log.e("VALUES", results.values.toString());
                }

                return results;
            }
        };

        return filter;
    }

}

И скриншот:

enter image description here

 Siddharth Lele31 мая 2012 г., 09:57
Забыл +1 ответить другим пользователям за то, что они пытались предложить решение и попытались прочитать мой беспорядок. ;-)

Ответы на вопрос(4)

public class TagFriendsAdapter extends BaseAdapter implements Filterable
{

    List<String> arrayListNames;
    List<String> mOriginalNames;

    List<String> arrayPictures;
    List<String> mOriginalPictures;

    Activity activity;
    String[] fetFriendID;
    String[] fetFriendName;
    String[] fetFriendPicture;

    LayoutInflater inflater = null;
    ImageLoader imageLoader;

    private Hashtable<String, String> picturesMap = new Hashtable<String, String>();

    public void setNamesAndPictures(List<String> arrayListNames, List<String> arrayPictures) {
        for(int i = 0; i < arrayListNames.size(); i++){
            picturesMap.put(arrayListNames.get(i), arrayPictures.get(i));
        }

        this.arrayListNames = arrayListNames;
    }

    TagFriendsAdapter(Activity a, String[] stringUID, String[] stringName, String[] stringPicture,
            ArrayList<String> arrayName, ArrayList<String> arrayPicture) {

        activity = a;
        fetFriendID = stringUID;
        fetFriendName = stringName;
        fetFriendPicture = stringPicture;

        this.arrayListNames = arrayName;
        this.arrayPictures = arrayPicture;

        inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        imageLoader = new ImageLoader(activity.getApplicationContext());
    }

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

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

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

    @Override
    public void notifyDataSetChanged() {
        super.notifyDataSetChanged();
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup p,arent) {
        View vi = convertView;
        if(convertView == null)
            vi = inflater.inflate(R.layout.friends_grid_items, null);

        ImageView imgProfilePicture = (ImageView) vi.findViewById(R.id.imgProfilePicture);
        TextView txtUserName = (TextView) vi.findViewById(R.id.txtUserName);

        txtUserName.setText(arrayListNames.get(position));

        String url = picturesMap.get(arrayListNames.get(position));
        if(url != null){
            imageLoader.DisplayImage(url, imgProfilePicture);
        }
        else if(arrayPictures.get(position) == null){
            imgProfilePicture.setVisibility(View.GONE);
        }

        return vi;
    }

    @Override
    public Filter getFilter() {

        Filter filter = new Filter() {

            @SuppressWarnings("unchecked")
            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {

                arrayListNames = (List<String>) results.values;
                notifyDataSetChanged();
            }

            @Override
            protected FilterResults performFiltering(CharSequence constraint) {

                FilterResults results = new FilterResults();
                ArrayList<String> FilteredArrayNames = new ArrayList<String>();

                if(mOriginalNames == null && mOriginalPictures == null){
                    mOriginalNames = new ArrayList<String>(arrayListNames);
                    mOriginalPictures = new ArrayList<String>(arrayPictures);
                }
                if(constraint == null || constraint.length() == 0){
                    results.count = mOriginalNames.size();
                    results.values = mOriginalNames;
                }
                else{
                    constraint = constraint.toString().toLowerCase();
                    for(int i = 0; i < mOriginalNames.size(); i++){
                        String dataNames = mOriginalNames.get(i);
          ,              if(dataNames.toLowerCase().startsWith(constraint.toString())){
                            FilteredArrayNames.add(dataNames);
                        }
                    }

                    results.count = FilteredArrayNames.size();
                    System.out.println(results.count);

                    results.values = FilteredArrayNames;
                    Log.e("VALUES", results.values.toString());
                }

                return results;
            }
        };

        return filter;
    }

}
 28 мая 2012 г., 11:28
@SiddharthLele да! Если у вас есть менее 10000 записей, это сделает работу, если вы получили больше, то используйте базу данных
 Siddharth Lele28 мая 2012 г., 11:26
Вы имеете в виду HashMap?
 Siddharth Lele28 мая 2012 г., 11:18
И тот факт, что мои 'arrayPictures' apos; никогда не меняется, это источник проблемы. Моя фильтрация выполняется по имени пользователя. Как связать имя с положением картинки - это проблема, которую я подозреваю.
 Siddharth Lele28 мая 2012 г., 11:10
Прошу прощения, но какой класс FilterResults? Вы имеете в виду источник, который отправляется на этот адаптер?
 28 мая 2012 г., 11:24
@SiddharthLele Создайте хеш, в котором хранится URL с именем пользователя. Затем, когда вы примените имя, у вас будет доступ к URL-адресу изображения

Declare a temporary List of objects at the beginning of the class that reflect the incoming data used for each item (1 object per item). In the performFiltering()set the condition for nulls and empty strings, and also if the constraint matches the string value of the corresponding object, then add the object to the temp List. That way you have only a "filtered" list of objects. Use data from your temp list, rather than your data source (as you normally would), for methods such as getCount(), getItem(), and getView(). Otherwise, you'll just be loading ALL the items everytime, since untimately notifyDataSetChanged() will be called after each filtering.

что вы не обновляете список имен изображений, пока фильтруете массив на основе ввода текста редактирования, вам также необходимо обновить их

Я пытался изменить ваш код, проверьте это

    public static List<String> temparrayPictures; 
    public static List<String> temparrayListNames; 
    public class TagFriendsAdapter extends BaseAdapter implements Filterable { 

        List<String> arrayListNames; 
        List<String> arrayPictures; 

        Activity activity; 
        String[] fetFriendID; 
        String[] fetFriendName; 
        String[] fetFriendPicture; 

        LayoutInflater inflater = null; 
        ImageLoader imageLoader; 

        TagFriendsAdapter(Activity a, String[] stringUID, String[] stringName, String[] stringPicture, 
                ArrayList<String> arrayName, ArrayList<String> arrayPicture) { 

            activity = a; 
            fetFriendID = stringUID; 
            fetFriendName = stringName; 
            fetFriendPicture = stringPicture; 

            this.arrayListNames = arrayName; 
            this.arrayPictures = arrayPicture; 
            temparrayPictures = arrayPicture;
            temparrayListNames = arrayName;

            inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
            imageLoader = new ImageLoader(activity.getApplicationContext()); 
        } 

        public int getCount() { 
            return temparrayListNames.size(); 
        } 

        public Object getItem(int position) { 
            return position; 
        } 

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

        @Override 
        public void notifyDataSetChanged() { 
            super.notifyDataSetChanged(); 
        } 

        public View getView(final int position, View convertView, ViewGroup parent) { 
            View vi = convertView; 
            if(convertView == null) 
                vi = inflater.inflate(R.layout.friends_grid_items, null); 

            ImageView imgProfilePicture = (ImageView)vi.findViewById(R.id.imgProfilePicture); 
            TextView txtUserName = (TextView)vi.findViewById(R.id.txtUserName); 

            txtUserName.setText(temparrayListNames.get(position)); 

            if (temparrayPictures.get(position) != null){ 
                imageLoader.DisplayImage(temparrayPictures.get(position), imgProfilePicture); 
            } 
            else if (temparrayPictures.get(position) == null) { 
                imgProfilePicture.setVisibility(View.GONE); 
            } 

            return vi; 
        } 

        @Override 
        public Filter getFilter() { 

            Filter filter = new Filter() { 

                @SuppressWarnings("unchecked") 
                @Override 
                protected void publishResults(CharSequence constraint, FilterResults results) { 

                    notifyDataSetChanged(); 
                } 

                @Override 
                protected FilterResults performFiltering(CharSequence constraint) { 

                    FilterResults results = new FilterResults();
                    temparrayPictures.clear();
                    temparrayListNames.clear();

                    if (temparrayListNames == null && temparrayPictures == null)    { 
                        temparrayListNames = new ArrayList<String>(arrayListNames); 
                        temparrayPictures = new ArrayList<String>(arrayPictures); 
                    } 
                    if (constraint == null || constraint.length() == 0) { 
                        results.count = arrayListNames.size(); 
                        results.values = arrayListNames; 

                        temparrayPictures = arrayPictures;
                        temparrayListNames = arrayListNames;
                    } else { 
                        constraint = constraint.toString().toLowerCase(); 
                        for (int i = 0; i < mOriginalNames.size(); i++) { 
                            String dataNames = arrayName.get(i); 
                            String picNames =  arrayPicture.get(i);
                            if (dataNames.toLowerCase().startsWith(constraint.toString()))  { 
                                temparrayPictures.add(picNames);
                                temparrayListNames.add(dataNames);
                            } 
                        } 

                        results.count = temparrayListNames.size(); 
                        System.out.println(results.count); 

                        results.values = temparrayListNames; 
                        Log.e("VALUES", results.values.toString()); 
                    } 

                    return results; 
                } 
            }; 

            return filter; 
        } 

    } 
 14 сент. 2013 г., 20:55
Хотя для временных списков требуется больше памяти, но в любом случае это хорошо для нескольких требований. mOriginalNames должно быть arrayName
Решение Вопроса

содержащий имена, изображения и другие данные о друзьях.

class Friend {
    public String name;
    public String picture;
    ... /* more members and access methods*/
};

Затем измените ваш адаптер и фильтруйте код соответствующим образом.

FilterResults should contain the ArrayList<Friend>, i.e. a list of Friend objects and not just the names.

In Adapter, replace

List<String> arrayListNames;
List<String> arrayPictures;

with

List<Friend> friendsList;

Change the getView method to access data from the friendsList object list.

После этих изменений код будет выглядеть лучше и работать лучше.

Update:

Убедитесь, что ваш адаптерgetItem метод возвращаетFriend объект

public Object getItem(int position) {
    return mFriendsList.get(position);
}
 29 мая 2012 г., 08:55
Я думаю, что нет другого подхода, который будет работать для фильтрации в вашем случае. Поскольку у вас есть 2 разных списка для ваших данных ... и вы можете вернуть только 1 список результатов в вашемperformFiltering метод. Таким образом, вы должны сделать один объект (содержащий имя и изображение) для его работы.
 28 мая 2012 г., 13:27
создать списокFriend объекты из данных JSON. В цикле создайте новыйFriend объект и добавить его кArrayList, каждыйFriend Объект будет представлять одну информацию о друге.
 Siddharth Lele29 мая 2012 г., 06:34
Есть ли рабочий пример, из которого я могу позаимствовать логику? Ваш ответ немного расплывчатый с моей точки зрения. Опять же, если бы у меня было время, я бы исследовал и выяснял, но, к сожалению, я этого не делаю. Извините, но пример - необходимость часа.
 Siddharth Lele28 мая 2012 г., 13:21
Возможно, я мог бы опубликовать всю свою активность, которая снова отправляет данные на этот адаптер. Если это поможет.
 Siddharth Lele28 мая 2012 г., 13:20
Не могли бы вы добавить немного больше деталей к ответу, который вы опубликовали? Я попробовал первые два вопроса, и ни один из них не сработал. В идеале я хотел бы потратить больше времени на отладку любого из этих двух решений, но ваше предложение, похоже, имеет больше смысла в будущем. Например, в первом предложении, которое вы вносите при рефакторинге бита кода, вы имеете в виду переместить всю часть, где я анализирую результат JSON, в этот класс?

Ваш ответ на вопрос