【问题标题】:Android Adapter not being updatedAndroid 适配器未更新
【发布时间】:2018-03-04 14:44:03
【问题描述】:

我想借助适配器在回收站视图中显示匹配对象列表(匹配 = 两个互相喜欢的用户)。

这是我的活动,旨在显示这些匹配项:

public class MatchesActivity extends AppCompatActivity {

// variables:
private RecyclerView mMatchesRecyclerView;
private RecyclerView.Adapter mMatchItemAdapter;
private RecyclerView.LayoutManager mMatchesLayoutManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_matches);

    mMatchesRecyclerView = findViewById(R.id.matches_recyclerView);
    mMatchesRecyclerView.setNestedScrollingEnabled(false);
    mMatchesRecyclerView.setHasFixedSize(true);

    // set layout manager & pass it to the recycler view:
    mMatchesLayoutManager = new LinearLayoutManager(MatchesActivity.this);
    mMatchesRecyclerView.setLayoutManager(mMatchesLayoutManager);

    // set match adapter & pass it to the recycler view:
    mMatchItemAdapter = new MatchItemAdapter(getMatchesList(), MatchesActivity.this);
    mMatchesRecyclerView.setAdapter(mMatchItemAdapter);

    // add test items to the recycler view:
    Match testMatch = new Match("abcdefgh");
    matchesList.add(testMatch);
    mMatchItemAdapter.notifyDataSetChanged();
    Log.d("MatchesActivity", "TEST LIST: " + matchesList.toString());
}

private ArrayList<Match> matchesList = new ArrayList<Match>();
private List<Match> getMatchesList() {
    Log.d("MatchesActivity", "getMatchesList function: " + matchesList.toString());
    return matchesList;
}
}

这是我的适配器,它应该膨胀相关的布局并用相关的对象数据填充它:

public class MatchItemAdapter extends RecyclerView.Adapter<MatchViewholder> {

private List<Match> mMatchesList;
private Context mViewContext;

public MatchItemAdapter(List<Match> matchesList, Context context) {
    this.mMatchesList = matchesList;
    this.mViewContext = context;
    Log.d("MatchItemAdapter", "Constructor: " + mMatchesList.toString());
}

// inflate the layout:
@Override
public MatchViewholder onCreateViewHolder(ViewGroup parent, int viewType) {
    View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_matches, null, false);
    RecyclerView.LayoutParams lp = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    layoutView.setLayoutParams(lp);
    MatchViewholder matchViewholder = new MatchViewholder(layoutView);
    Log.d("MatchItemAdapter", "onCreateViewHolder: " + mMatchesList.toString());
    return matchViewholder;
}

// populate each row within the layout:
@Override
public void onBindViewHolder(MatchViewholder holder, int position) {
    Log.d("MatchItemAdapter", "onBindViewHolder: " + mMatchesList.toString());
    holder.mMatchID.setText(mMatchesList.get(position).getMatchID());
}

@Override
public int getItemCount() {
    return 0;
}

}

Match 类目前只接受字符串 matchID 参数。使用默认图像和此 matchID 字符串创建对象。 目前,我还没有准备好数据库中的真正匹配对象,所以我想在稍后继续之前检查回收器视图和适配器是否按预期工作。

但是,当我转到 Matches Activity 时,它是空的,什么也没有显示。从 MatchesActivity onCreate 方法中可以看出,我创建了一个 matchID = "abcdefgh" 的测试 Match 对象,然后将其添加到 matchesList 中。因此,我希望将“abcdefgh”文本传递给适配器并显示在 MatchesActivity 中。

我的日志语句表明 Match 对象已成功创建并添加到列表中,但是,getMatchesList() 函数返回一个空列表,然后在 Adapter 构造函数中也使用该列表,(我认为这是)导致 Activity 不显示任何东西。

我对 Android 和 Java 开发相对较新,尤其是回收器视图和适配器,但从我收集到的内容看来,

mMatchItemAdapter.notifyDataSetChanged();

工作不正常,因为在那之前一切似乎都很好。任何帮助将不胜感激!

【问题讨论】:

    标签: java android class android-recyclerview android-adapter


    【解决方案1】:

    你返回 0。你应该做的是返回 mMatchesList 列表的长度。

    @Override
    public int getItemCount() {
        return mMatchesList.size();
    }    
    

    【讨论】:

    • 您说的完全正确,谢谢!我完全忽略了它,因为我自己没有在任何地方调用它。有什么方法可以找出适配器何时调用或使用 getItemCount() ?找不到这方面的好文章。
    • @puk789 this 是最准确的答案。它在内部完成,并在 recyclerview/listview 需要时调用。
    猜你喜欢
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多