このコードスニペットでは、条件に基づいてオブジェクトを取得するためのParseQueryを作成しています。 forブロックの先頭にブレークポイントを置くと、doneメソッド内で、取得したいオブジェクトの数を確認することができます。これを実行すると、各アイテムがlistItems配列に追加されます。しかし、私が落ち込んで最終的なブレークポイント@return listItemsを打つと、listitems配列はnullになります。ListitemsがParseQueryからnullを返す(編集済み)
私は、SOからの回答からいくつかの例を追いかけるつもりでしたが、それを理解できないようです。コールバックではオブジェクトを取得しますが、結果をlistitemsオブジェクトに割り当てる方法はわかりません。
誰かが私がここで間違っていることを教えてもらえますか、このコードスニペットまで私の問題を追跡しました。私のフラグメントのクラスで
public List<ListItem> getListItems()
{
final List<ListItem> listItems = new ArrayList<ListItem>();
ParseUser currentUser = ParseUser.getCurrentUser();
ParseQuery<ParseObject> postQuery = ParseQuery.getQuery("posts");
postQuery.whereEqualTo("username", currentUser.getUsername());
postQuery.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(List<ParseObject> objects, ParseException e) {
if (e == null) {
for (ParseObject object : objects) {
ListItem item = new ListItem();
ParseFile imgFile = object.getParseFile("pic");
item.setPostImage(imgFile);
listItems.add(item);
}
}
}
});
return listItems;
}
は、私が処理のために、のgetHeader()とgetListItems()メソッドから返された値を取り、私のRecyclerViewアダプタクラスにこれらの値を渡す新しいRecyclerViewをインスタンス化します。
final RecyclerAdapter adapter = new RecyclerAdapter(getHeader(), getListItems());
これは私がみんなに助けに感謝をしようとすると、リストを返す方法を考え出し
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final int TYPE_HEADER = 0;
private static final int TYPE_ITEM = 1;
private Header header;
private List<ListItem> listItems;
public RecyclerAdapter(Header header, List<ListItem> listItems)
{
if (header == null) {
throw new IllegalArgumentException("Header may not be null");
}
this.header = header;
this.listItems = listItems;
}
public boolean isHeader(int position) {
return position == 0;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if(viewType == TYPE_HEADER)
{
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.header, parent, false);
return new VHHeader(v);
}
else if(viewType == TYPE_ITEM)
{
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.model, parent, false);
return new VHItem(v);
}
throw new RuntimeException("There is no type that matches the type " + viewType + " + make sure your using types correctly");
}
private ListItem getItem(int position)
{
return listItems.get(position);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (isHeader(position)) {
if(holder instanceof VHHeader)
{
VHHeader VHheader = (VHHeader)holder;
VHheader.txtFullname.setText(header.getFullname());
VHheader.txtWeb.setText(header.getWeb());
VHheader.txtBio.setText(header.getBio());
VHheader.txtSwaggCount.setText(String.valueOf(header.getSwaggCount()));
VHheader.txtFollowerCount.setText(String.valueOf(header.getFollowerCount()));
VHheader.txtFollowingCount.setText(String.valueOf(header.getFollowingCount()));
Bitmap bmp = null;
try {
bmp = BitmapFactory.decodeStream(header.getProfileImage().getDataStream());
} catch (ParseException e) {
e.printStackTrace();
}
VHheader.cImageView.setImageBitmap(bmp);
VHheader.btnEditProfile.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Context context = view.getContext();
Intent editProfileIntent = new Intent(context, EditProfileActivity.class);
context.startActivity(editProfileIntent);
}
});
return;
}
}
if(holder instanceof VHItem)
{
ListItem currentItem = getItem(position - 1);
VHItem VHItem = (VHItem)holder;
Bitmap bmp = null;
try {
bmp = BitmapFactory.decodeStream(currentItem.getPostImage().getDataStream());
} catch (ParseException e) {
e.printStackTrace();
}
VHItem.iv.setImageBitmap(bmp);
}
}
// Need to override this method
public int getItemViewType(int position) {
if(isPositionHeader(position))
return TYPE_HEADER;
return TYPE_ITEM;
}
private boolean isPositionHeader(int position){
return position == 0;
}
@Override
public int getItemCount() {
return listItems.size() + 1;
}
private class VHHeader extends RecyclerView.ViewHolder {
TextView txtFullname;
TextView txtWeb;
TextView txtBio;
TextView txtSwaggCount;
TextView txtFollowerCount;
TextView txtFollowingCount;
CircleImageView cImageView;
Button btnEditProfile;
VHHeader(View itemView) {
super(itemView);
this.txtFullname = (TextView)itemView.findViewById(R.id.fullnameTV);
this.txtWeb = (TextView)itemView.findViewById(R.id.webTV);
this.txtBio= (TextView)itemView.findViewById(R.id.bioTV);
this.txtSwaggCount = (TextView)itemView.findViewById(R.id.swaggsCountTV);
this.txtFollowerCount = (TextView)itemView.findViewById(R.id.followerCountTV);
this.txtFollowingCount = (TextView)itemView.findViewById(R.id.followingCountTV);
this.cImageView = (CircleImageView)itemView.findViewById(R.id.avaImageIV);
this.btnEditProfile = (Button)itemView.findViewById(R.id.editProfileBtn);
}
}
private class VHItem extends RecyclerView.ViewHolder {
ImageView iv;
VHItem(View itemView){
super(itemView);
this.iv = (ImageView)itemView.findViewById(R.id.ivListItem);
}
}
私のカスタムアダプタクラスであり、ここで私のListItemのクラス
あるpublic class ListItem {
private ParseFile postImage;
private int id;
public ListItem() {
}
public ParseFile getPostImage() {
return postImage;
}
public void setPostImage(ParseFile postImage) {
this.postImage = postImage;
}
の代わりに返すコールバック内のリストを処理することができますように、私はそれを変更? –
@Abhijithもっと詳しく説明できますか?リストを返す代わりに、メソッドのシグネチャをpublic void getListItems()に変更すると、処理がすべて完了し、listitemsが設定され、コールバックに追加されますが、メソッドを呼び出します。アダプタからの呼び出し、最後のRecyclerAdapterアダプタ=新しいRecyclerAdapter(getHeader()、getListItems()); –
質問を編集してコードを追加できますか? –