简体   繁体   English

如何检索解析对象以回收带有片段的视图

[英]how to retrieve parse object to recycle view with fragment

I try to retrieve parse object on recyclerview . 我尝试在recyclerview上检索解析对象。 but data not showing. 但数据未显示。 in logcat 在logcat中

12-08 22:14:41.222 23950-23950/com.keboo.ime E/RecyclerView: No adapter attached; skipping layout
12-08 22:14:41.313 23950-23950/com.keboo.ime E/RecyclerView: No adapter attached; skipping layout


public class TerasFragment extends Fragment {

public TerasAdapter terasAdapter;
private RecyclerView recyclerView;

public TerasFragment() {
    // Required empty public constructor
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ParseQuery<ParseObject> query = ParseQuery.getQuery("teras");
    query.findInBackground(new FindCallback<ParseObject>() {
        @Override
        public void done(List<ParseObject> list, ParseException e) {
            if (e != null) {
                Toast.makeText(getActivity().getBaseContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
            } else {
                terasAdapter = new TerasAdapter(getActivity().getApplicationContext(), list);
            }
        }
    });
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_teras, container, false);

    LinearLayoutManager llm = new LinearLayoutManager(getActivity().getBaseContext());
    llm.setOrientation(LinearLayoutManager.VERTICAL);

    recyclerView = (RecyclerView) view.findViewById(R.id.recycle_status);
    recyclerView.setLayoutManager(llm);
    recyclerView.setHasFixedSize(true);
    recyclerView.setAdapter(terasAdapter);
    return view;
}
}


  public class TerasAdapter extends RecyclerView.Adapter<TerasAdapter.ViewHolder>{

List<ParseObject> mlist;
Context mContext;
LayoutInflater inflater;

public TerasAdapter(Context context, List<ParseObject> list){
    this.mlist = list;
    this.mContext = context;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = inflater.from(parent.getContext()).inflate(R.layout.teras_item, parent, false);
    ViewHolder vh = new ViewHolder(v);
    return vh;
}

@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
    ParseObject status = mlist.get(position);
    holder.name.setText(status.getString("nama"));
    holder.status.setText(status.getString("status"));
    ParseFile picture = (ParseFile) status.get("picture");
    picture.getDataInBackground(new GetDataCallback() {
        @Override
        public void done(byte[] bytes, ParseException e) {
            Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
            holder.profil.setImageBitmap(bitmap);
        }
    });
}

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

public static class ViewHolder extends RecyclerView.ViewHolder{

    CardView mCardView;
    CircleImageView profil;
    TextView name, type, time, status;

    public ViewHolder(View itemView) {
        super(itemView);
        mCardView = (CardView) itemView.findViewById(R.id.cv_status);
        profil = (CircleImageView) itemView.findViewById(R.id.de_status_profil);
        name = (TextView) itemView.findViewById(R.id.tv_status_nama);
        type = (TextView) itemView.findViewById(R.id.tv_status_type);
        time = (TextView) itemView.findViewById(R.id.tvstatus_time);
        status = (TextView) itemView.findViewById(R.id.tv_status_deskription);
    }
}
}

it looks like you're doing the parsing in a thread other than UI thread, so it works asynchronous to UI thread, so you have to set the adapter after processing the parsing or you have to notify the adapter. 看起来您正在UI线程以外的线程中进行解析,因此它与UI线程异步运行,因此您必须在处理解析后设置适配器,或者必须通知适配器。 you are getting the message Skipping layout, because there is no data to be displayed in your Recyclerview. 您收到消息“正在跳过布局”,因为Recyclerview中没有要显示的数据。 so what you have to do is 所以你要做的是

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ParseQuery<ParseObject> query = ParseQuery.getQuery("teras");
    query.findInBackground(new FindCallback<ParseObject>() {
        @Override
        public void done(List<ParseObject> list, ParseException e) {
            if (e != null) {
                Toast.makeText(getActivity().getBaseContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
            } else {
                setListView(list);
            }
        }
    });
}



public void setListView(List<ParseObject< list){
  terasAdapter = new TerasAdapter(getActivity().getApplicationContext(), list);
  recyclerView = (RecyclerView) view.findViewById(R.id.recycle_status);
  recyclerView.setLayoutManager(new LinearLayoutManager(mContext));
  recyclerView.setHasFixedSize(true);
  recyclerView.setAdapter(terasAdapter);
}

and there is an error in your adapter's getItemCount() method, instead of returning 0 you have to return the size of your list. 并且适配器的getItemCount()方法中有一个错误,您不必返回0,而必须返回列表的大小。

ex: 例如:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM