notifyDataSetChanged()不使用自定义适配器视图

时间:2017-02-07 10:53:54

标签: java android android-arrayadapter notifydatasetchanged

我已经看过几次回答这个问题了,但是没有一个修复对我有用,所以我就联系了。

我已经构建了一个具有Diolor Swipeable Cards Library(here)的应用程序,现在正在尝试实施课程卡过滤器。

基本上当用户点击课程过滤器时,我们想要更改正在输入适配器的数据。

目前我正在尝试更新数据并在适配器上调用notifyDataSetChanged(),期望刷新卡以显示新的数据集,但是我发现它根本没有刷新。

对此的任何帮助都将非常感激。

以下所有代码均来自我的主要活动。

我声明了我将在活动顶部提供给适配器的数据集:

ArrayList<CourseCardModel> courseCardModelList;

然后在我的onCreate()方法中,我实例化适配器,将其附加到视图,并调用generateCourseCards()方法,该方法使用从firebase数据库中提取的对象填充courseCardModelList

// Set up and assign card adapter
    ca = new CustomCardAdapter(CardsActivity.this,     android.R.layout.simple_list_item_1, generateCourseCards());
    flingContainer.init(CardsActivity.this, ca);

generateCourseCards()方法

private ArrayList<CourseCardModel> generateCourseCards() {

    Toast.makeText(getApplicationContext(), "Retrieving Courses", Toast.LENGTH_LONG).show();

    courseCardModelList = new ArrayList<CourseCardModel>();

    dbref =  FirebaseDatabase.getInstance().getReference().child("courses");



    // Retrieve the course data from Firebase db and cast as Course object
    dbref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {
            Log.e("Count " ,"" + snapshot.getChildrenCount());
            for (DataSnapshot postSnapshot: snapshot.getChildren()) {

                c = postSnapshot.getValue(Course.class);

                System.out.println(c.getCourseName());

                CourseCardModel model = new CourseCardModel();
                 model.setCourse(c);

                courseCardModelList.add(model);

            }

            Collections.shuffle(courseCardModelList);
            ca.notifyDataSetChanged();


        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.e("The read failed: ", databaseError.getMessage());
        }

    });

    return courseCardModelList;

}

尝试更新数据集(暂时简单的随机播放)并刷新卡片

// Shuffle the collection and refresh the cards
            Collections.shuffle(courseCardModelList);
            ca.notifyDataSetChanged();

编辑:添加了适配器代码

public class CustomCardAdapter extends ArrayAdapter {

private TextView courseName, uniName, entryStandards, courseDuration, studyMode, qualification,
        studentSatisfaction, gradProspects, t1, t2, t3, t4, t5, t6;

ArrayList<CourseCardModel> items;



View v;


LayoutInflater vi;

public CustomCardAdapter(Activity context, int resource, ArrayList<CourseCardModel> courses) {
    super(context, resource, courses);

    vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}


@NonNull
@Override
public View getView(int position, View convertView, ViewGroup parent) {

    v = convertView;
    if (v == null) {

        v = vi.inflate(R.layout.course_card_inner_template, parent , false);
    }

    CourseCardModel c = (CourseCardModel) getItem(position);

    if (c != null) {

        courseName = (TextView) v.findViewById(R.id.courseCardCourseName);
        uniName = (TextView) v.findViewById(R.id.courseCardUniName);
        entryStandards = (TextView) v.findViewById(R.id.courseCardEntryStandards);
        courseDuration = (TextView) v.findViewById(R.id.courseCardCourseDuration);
        studyMode = (TextView) v.findViewById(R.id.courseCardStudyMode);
        qualification = (TextView) v.findViewById(R.id.courseCardQualification);
        studentSatisfaction = (TextView) v.findViewById(R.id.courseCardStudentSatisfaction);
        gradProspects = (TextView) v.findViewById(R.id.courseCardGraduateProspects);


        t1 = (TextView) v.findViewById(R.id.cardTV1);
        t2 = (TextView) v.findViewById(R.id.cardTV2);
        t3 = (TextView) v.findViewById(R.id.cardTV3);
        t4 = (TextView) v.findViewById(R.id.cardTV4);
        t5 = (TextView) v.findViewById(R.id.cardTV5);
        t6 = (TextView) v.findViewById(R.id.cardTV6);

        v.setBackgroundResource(R.drawable.newcard);

        courseName.setText(c.getCourse().getCourseName());
        uniName.setText(c.getCourse().getUniversity());
        entryStandards.setText(c.getCourse().getEntryStandards());
        courseDuration.setText(c.getCourse().getCourseDuration());
        studyMode.setText(c.getCourse().getStudyMode());
        qualification.setText(c.getCourse().getQualification());
        studentSatisfaction.setText(c.getCourse().getStudentSatisfaction().toString() + " / 5");
        gradProspects.setText(c.getCourse().getGradProspects() + " / 100");



    }

    if(position ==0)
    {
        //float alpha = (float) 0.8;
        //v.setAlpha(alpha);
        courseName.setVisibility(View.VISIBLE);
    }

    else if (position == 1){

        // Prepare the View for the animation
        v.setVisibility(View.VISIBLE);

        float alpha = (float) 0.8;
        float alpha2 = (float) 0.3;
        courseName.setAlpha(alpha2);
        uniName.setAlpha(alpha2);
        entryStandards.setAlpha(alpha2);
        courseDuration.setAlpha(alpha2);
        studyMode.setAlpha(alpha2);
        qualification.setAlpha(alpha2);
        studentSatisfaction.setAlpha(alpha2);
        gradProspects.setAlpha(alpha2);
        t1.setAlpha(alpha2);
        t2.setAlpha(alpha2);
        t3.setAlpha(alpha2);
        t4.setAlpha(alpha2);
        t5.setAlpha(alpha2);
        t6.setAlpha(alpha2);
        v.setAlpha(alpha);


    }
    else {
        v.setVisibility(View.INVISIBLE);
    }

    return v ;
}


public void updateData(ArrayList<CourseCardModel> courseCardModels) {

    this.items = courseCardModels;
    notifyDataSetChanged();

}

}

3 个答案:

答案 0 :(得分:0)

如果没有适配器类提供,我的第一个猜测是你搞砸了引用。也许你正在改组未从适配器引用的数据。分享适配器代码后,我会更新我的答案。

==编辑==

避免从适配器引用一些外部数据集合,并更新引用的数据。更新适配器/列表数据应使用适配器的接口和方法完成,例如add()addAll()remove()可能会发生(父)适配器进行克隆/复制数据,在这种情况下,更新外部/引用的集合没有任何好处。

答案 1 :(得分:0)

这个方法存在问题。

public void updateData(ArrayList<CourseCardModel> courseCardModels) {
    this.items = courseCardModels;
    notifyDataSetChanged();
}

这里给出了适配器的另一个数组引用。

只需重写如下。

public void updateData(ArrayList<CourseCardModel> courseCardModels) {
    this.items.clear();
    this.items.addAll(courseCardModels);
    notifyDataSetChanged();
}

答案 2 :(得分:0)

您正在扩展一个ArrayAdapter,它包含自己的模型数组(传递给构造函数的数组)。如果您想更新项目,请执行以下操作:

ca.clear(); 
for (CourseCardModel object : courseCardModelList) {
   ca.insert(object, ca.getCount());
}

ca.notifyDataSetChanged();

或者您可以覆盖getItem方法并从items数组中返回一个项目。

另一种选择是扩展BaseAdapter而不是ArrayAdapter。