Панель рейтинга внутри ListView смешивает элементы списка

Я пытался реализовать ListView, внутри которого есть Панель рейтинга. У меня есть прослушиватель onRatingChanged, и я хочу изменить TextView внутри элемента в зависимости от рейтинга.

Проблема в том, что когда я касаюсь звездочек и обновляю их, обновляется другое значение TextView. Мой адаптер расширяет CursorAdapter. Если бы у меня было getView(), думаю, я бы решил эту проблему, но я не знаю, что делать с CursorAdapter, так как мы не используем getView().

|------------------|
| TextView         | ---> TextView I want to update
| * * * * *        | ---> Rating Bar
|                  |
|__________________|

person Gokhan Arik    schedule 25.07.2013    source источник
comment
Код, который вы будете использовать, будет таким же, как и для адаптера, не основанного на курсоре, с той лишь разницей, что вы будете использовать методы newView() и bindView().   -  person user    schedule 25.07.2013
comment
Как я могу решить это тогда, я действительно сбит с толку сейчас   -  person Gokhan Arik    schedule 25.07.2013
comment
В пользовательском адаптере я использовал теги, но я не знаю, как с ними работать.   -  person Gokhan Arik    schedule 25.07.2013


Ответы (1)


Проблема в том, что когда я касаюсь звездочек и обновляю их, они обновляют другое значение TextView. Мой адаптер расширяет CursorAdapter. Если бы у меня был getView(), думаю, я бы решил эту проблему, но я не знаю, что делать с CursorAdapter, поскольку мы не используем getView().

Как я уже сказал в своем комментарии, в случае адаптера на основе Cursor вы должны использовать методы newView() и bindView(). Ниже небольшой пример:

public class CustomAdapter extends CursorAdapter {

    private static final int CURSOR_TEXT_COLUMN = 0;

    public CustomAdapter(Context context, Cursor c, int flags) {
        super(context, c, flags);

    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        ViewHolder holder = (ViewHolder) view.getTag();
        holder.text.setText(cursor.getString(CURSOR_TEXT_COLUMN));
        holder.progress
                .setOnRatingBarChangeListener(new OnRatingBarChangeListener() {

                    @Override
                    public void onRatingChanged(RatingBar ratingBar,
                            float rating, boolean fromUser) {
                        // basic example on how you may update the
                        // TextView(you could use a tag etc).
                        // Keep in mind that if you scroll this row and come
                        // back the value will reset as you need to save the
                        // new rating in a more persistent way and update
                        // the progress
                        View rowView = (View) ratingBar.getParent();
                        TextView text = (TextView) rowView
                                .findViewById(R.id.the_text);
                        text.setText(String.valueOf(rating));
                    }
                });
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        LayoutInflater mInflater = LayoutInflater.from(context);
        View rowView = mInflater.inflate(R.layout.row_layout, parent,
                false);
        ViewHolder holder = new ViewHolder();
        holder.text = (TextView) rowView.findViewById(R.id.the_text);
        holder.progress = (RatingBar) rowView
                .findViewById(R.id.the_progress);
        rowView.setTag(holder);
        return rowView;
    }

    static class ViewHolder {
        TextView text;
        RatingBar progress;
    }

}
person user    schedule 26.07.2013
comment
Я понял. Спасибо чувак! Я не видел примера с держателем, я думал, что он работает иначе, чем базовый адаптер, теперь это имеет смысл. Он работает идеально. - person Gokhan Arik; 26.07.2013
comment
У меня есть еще один вопрос, у вас есть, как я могу получить позицию элемента списка, когда пользователь касается панели рейтинга? Как только они изменят рейтинг, я хочу определить, какая это строка, и переместить курсор в эту позицию. - person Gokhan Arik; 26.07.2013
comment
Я получил сейчас! Вы уже использовали позицию в качестве тега. Одним ответом вы ответили на два моих вопроса! Спасибо - person Gokhan Arik; 26.07.2013
comment
@GokhanArik Положение строки можно легко получить с помощью cursor.getPosition(). Если вы поместите это значение в качестве тега для RatingBar, вы можете получить его в прослушивателе и делать то, что хотите. - person user; 26.07.2013
comment
Когда мы используем bindView, он не должен смешивать представления, верно? Потому что он проверяет, является ли View нулевым или нет. Мой все еще смешивает рейтинговые панели и флажки внутри списка. Вы можете помочь? - person Gokhan Arik; 29.07.2013
comment
@GokhanArik bindView() будет вызываться для привязки данных каждый раз, когда на экране появляется новая строка. Если вы все еще смешиваете строки, проверьте, что вы делаете, например, если вы меняете фон на основе условия, убедитесь, что у вас есть предложение else для обработки переработанной строки, не соответствующей этому условию. Если вам не удастся это сделать, опубликуйте свой код где-нибудь, чтобы я мог его посмотреть. - person user; 29.07.2013
comment
Похоже, проблема в положении. Когда я печатаю список на экране, они верны, но когда я регистрирую позицию внутри onRatingBarChangedListener, я получаю неправильную позицию. - person Gokhan Arik; 29.07.2013
comment
Где я должен установить позицию в качестве тега? Когда я автоматически устанавливаю внутри bindview(), он каждый раз устанавливает последнюю позицию курсора. Он не проходит позицию панели рейтинга, которая принадлежит элементу - person Gokhan Arik; 29.07.2013
comment
@GokhanArik Еще раз, пожалуйста, опубликуйте код, который вы использовали для своего адаптера. - person user; 29.07.2013
comment
Извините за опоздание, я разобрался. Мне не хватало сохранения состояния CheckBox в другом месте и использования операторов else. Я сохраняю свое состояние флажка в ArrayList и теперь использую операторы else, он работает отлично. Еще раз спасибо - person Gokhan Arik; 31.07.2013