2

Я использую эту библиотеку для создания мазковой-возможности карты: https://github.com/Diolor/SwipecardsКаковы условия, при которых адаптер не обновляет присоединенные вид

мнения, что делает салфетки-карту в состоянии контролировать, привязываются к адаптеру и источники, которые он извлекает из него.

В моей реализации каждая карта имеет кнопку, и когда ее щелкают, происходит что-то в исходном массиве, для которого я хочу обновить весь список карт. Я вызываю notifyDataSetChanged() на соответствующем адаптере, но getView() никогда не вызывается в адаптере для просмотра каких-либо обновлений.

Что странно, что тот же адаптер отлично работает с ListView

Есть ли какие-либо конкретные требования либо в стороне адаптера или само представление, которое требуется для правильного функционирования notifyDataSetChanged?

Моего код:
(Просьба игнорировать отсутствие ViewHolder рисунка и наличие щелчка приемников внутри адаптера качество коды является наименее, что я могу быть обеспокоен прямо сейчас, когда решающая функциональность не работает.)

адаптер (с использованием массива Adapter)

public class TourCardAdapter extends ArrayAdapter<TourCardBean> implements View.OnClickListener { 

    Context context; 
    ToursFragment.ToursControlsClickListener clickListener; 

    public TourCardAdapter(Context context, ArrayList<TourCardBean> tourCardsArr, ToursFragment.ToursControlsClickListener clickListener) { 
     super(context, 0, tourCardsArr); 
     this.context = context; 
     this.clickListener = clickListener; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View rowView = convertView; 
     ViewHolder viewHolder; 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     TourCardBean tourCard = getItem(position); 

     rowView = inflater.inflate(R.layout.card_tour, parent, false); 


     viewHolder = new ViewHolder(); 

     viewHolder.title = (TextView) rowView 
       .findViewById(R.id.title); 
     viewHolder.detail = (TextView) rowView 
       .findViewById(R.id.detail); 
     viewHolder.likeCount = (TextView) rowView 
       .findViewById(R.id.likeCount); 
     viewHolder.image = (ImageView) rowView 
       .findViewById(R.id.cardLocationImage); 
     viewHolder.likeButton = (ImageView) rowView 
       .findViewById(R.id.cardLikeImage); 
     viewHolder.shareButton = (ImageView) rowView 
       .findViewById(R.id.cardShareImage); 

     viewHolder.likeButton.setOnClickListener(this); 
     viewHolder.shareButton.setOnClickListener(this); 

     viewHolder.title.setText(tourCard.getTitle()); 
     viewHolder.detail.setText(tourCard.getDetails()); 
     viewHolder.likeCount.setText("" + tourCard.getLikeCount()); 
     viewHolder.likeButton.setTag(tourCard.getId()); 
     viewHolder.shareButton.setTag(tourCard.getId()); 

     return rowView; 
    } 

    @Override 
    public void onClick(View v) { 
     switch (v.getId()) { 
      case R.id.cardLikeImage: 
       clickListener.onLikeClick((int) v.getTag()); 
       break; 
      case R.id.cardShareImage: 
       clickListener.onShareClick((int) v.getTag()); 
       break; 
     } 
    } 


    /** 
    * View Holder for ListView 
    * 
    * @author Aman Alam 
    */ 
    class ViewHolder { 
     public ImageView image; 
     public ImageView likeButton; 
     public ImageView shareButton; 
     public TextView title; 
     public TextView detail; 
     public TextView likeCount; 
    } 
} 
+0

Основываясь на некоторых проблемах, зарегистрированных в библиотеке Swipecards, похоже, что у него могут быть ошибки, которые мешают ему обновлять представления на 'notifyDataSetChanged()'. [Этот] (https://github.com/Diolor/Swipecards/issues/29) содержит несколько обходных решений, которые могут сработать для вас. В частности, 'flingContainer.removeAllViewsInLayout()'. – Bradford2000

+0

@ Bradford2000 Это было очень полезно, ссылка на всю проблему. Спасибо огромное! :) Можете ли вы написать это как ответ, чтобы я мог принять его как правильный ответ? –

+1

Готово. Рад, что помогло! – Bradford2000

ответ

1

Основываясь на некоторых проблемах, зарегистрированных в библиотеке Swipecards, похоже, что у него могут быть ошибки, которые мешают ему обновлять представления на notifyDataSetChanged(). This one имеет несколько обходных решений, которые могут сработать для вас. В частности, flingContainer.removeAllViewsInLayout().

+1

Спасибо большое, мне потребовалось 3-4 дня борьбы, чтобы прийти в это место и найти свое решение :) –

0

библиотека может быть очень полезна, но я думаю, что это разумно использовать библиотеку поддержки, предлагаемую Google.
Вы получаете преимущества получения последних обновлений в материальном дизайне, как только они будут выпущены.
Вы можете объявить в своем файле градации. это;

compile 'com.android.support:design:22.2.0' 
+0

Боюсь, это не ответ на этот вопрос.Библиотека поддержки дизайна Android не позволяет мне создавать карты с прокруткой, такие как tinder, и ни одна из них не является библиотекой, которую я использую, является частью библиотеки поддержки дизайна, поэтому этот ответ не имеет значения. –

2

Если он работает с ListView, ваш адаптер не должен быть проблемой.

SwipeFlingAdapterView является (более или менее) напрямую на основе AdapterView, который не называет getView(). Поэтому, когда набор данных был изменен, он должен позвонить в getView(). Соответствующая часть кода, кажется, что может быть заблокирован вашим событие щелчка:

if (this.flingCardListener.isTouching()) { 
    PointF lastPoint = this.flingCardListener.getLastPoint(); 
    if (this.mLastTouchPoint == null || !this.mLastTouchPoint.equals(lastPoint)) { 
     this.mLastTouchPoint = lastPoint; 
     removeViewsInLayout(0, LAST_OBJECT_IN_STACK); 
     layoutChildren(1, adapterCount); 
    } 
} 

В целом SwipeFlingAdapterView, кажется, не быть готовым к событию изменения набора данных на всех.