RecyclerView没有填充,问题可能是将适配器转到rv

时间:2016-05-16 14:43:07

标签: android android-fragments android-asynctask android-recyclerview

我有这个正在运行的Recyclerview但问题是,它没有填充任何东西。所以它是一个空白片段。我按照本教程了解如何做到这一点,我抽搐它以适应我自己。当然,它出了问题。

我正在关注的教程:http://androidcss.com/android/fetch-json-data-android/#comment-56

教程正在进行一个主要的活动asynctask适配器。我将其切换为片段asynctask和适配器。

public class AdapterProfile extends android.support.v7.widget.RecyclerView.Adapter<android.support.v7.widget.RecyclerView.ViewHolder>{

    private android.content.Context context;
    private android.view.LayoutInflater inflater;
    java.util.List<Profile> data = java.util.Collections.emptyList();
    com.example.admin.quoteme.Profile current;
    int currentPos = 0;

    public AdapterProfile(android.content.Context context, java.util.List<com.example.admin.quoteme.Profile> data){

        this.context=context;
        inflater= android.view.LayoutInflater.from(context);
        this.data=data;
    }

    @Override
    public android.support.v7.widget.RecyclerView.ViewHolder onCreateViewHolder(android.view.ViewGroup parent, int viewType){

        android.view.View view = inflater.inflate(com.example.admin.quoteme.R.layout.feed_layout_v2, parent, false);
        MyHolder holder = new com.example.admin.quoteme.AdapterProfile.MyHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(android.support.v7.widget.RecyclerView.ViewHolder holder, int position) {

        // Get current position of item in recyclerview to bind data and assign values from list
        MyHolder myHolder= (MyHolder) holder;
        com.example.admin.quoteme.Profile current=data.get(position);
        myHolder.name.setText(current.getUser_id());
        myHolder.quote.setText(current.getQuote());
        myHolder.points.setText(current.getQuote_points() + "Points");


        // load image into imageview using glide
        /*Glide.with(context).load("http://192.168.1.7/test/images/" + current.fishImage)
                .placeholder(R.drawable.ic_img_error)
                .error(R.drawable.ic_img_error)
                .into(myHolder.ivFish);*/
    }

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

    class MyHolder extends android.support.v7.widget.RecyclerView.ViewHolder{

        private android.widget.TextView name;
        private android.widget.TextView quote;
        private android.widget.TextView points;

        // create constructor to get widget reference
        public MyHolder(android.view.View itemView) {
            super(itemView);
            name = (android.widget.TextView)itemView.findViewById(com.example.admin.quoteme.R.id.name);
            quote = (android.widget.TextView)itemView.findViewById(com.example.admin.quoteme.R.id.quote);
            points = (android.widget.TextView)itemView.findViewById(com.example.admin.quoteme.R.id.points);
        }
    }

还有一些注释掉的代码是我过去的实验。请忽略已注释掉的内容。此外,我试图在asyncTask和onCreate中初始化适配器,两者都不起作用。我不知道。

我的适配器类。

if ( $data=~/<START>>/) {
    print "\nFound start\n";
    $message.=$data;
    while ($message !~/END/){
        $client_socket->recv($data, $message_length);
        $message.=$data;
        print "\nStill reading\n"; 
    };
    print "\nFound end\n"; # but may contain (part of) next START
}

我认为这两个课程足以消除错误。我很难尝试填充这个Recyclerview。

3 个答案:

答案 0 :(得分:0)

在onCreateView中你有 - &gt; mAdapter = new AdapterProfile(getActivity(),data); 但数据只是空的变量。稍后在Async任务中,您将构建不使用的新本地数据变量。后执行中的注释块应该正常工作 - 日志中是否有错误消息?

答案 1 :(得分:0)

您正在AsyncTasks&#39;中填充数据ArrayList。 onPostExecute方法,但你永远不会将它设置为适配器......

取消注释适配器的创建并将其设置为recyclerview。为什么要注释掉?有错误吗?

答案 2 :(得分:0)

嘿,您的数据对象大小必须为null,因为看到您的代码

@Override
    protected void onPostExecute(String result){

        java.util.List<Profile> data = new java.util.ArrayList<>();

        try {

            org.json.JSONArray jArray = new org.json.JSONArray(result);

            //extraction
            for(int i= 0; i<jArray.length(); i++){
                org.json.JSONObject json_data = jArray.getJSONObject(i);
                Profile profile = new Profile();
                profile.setUser_id(json_data.getString("user_id"));
                profile.setQuote_points(json_data.getInt("quote_points"));
                profile.setQuote(json_data.getString("quote_description"));
                data.add(profile);
            }

            //setup and hand data over to rv // adapter
            /*mRVProfile = (android.support.v7.widget.RecyclerView)llLayout.findViewById(com.example.admin.quoteme.R.id.recyclerViewGlobal);
            mAdapter = new AdapterProfile(getActivity(), data);
            mRVProfile.setAdapter(mAdapter);
            mRVProfile.setLayoutManager(new android.support.v7.widget.LinearLayoutManager(getActivity()));*/

        } catch (org.json.JSONException e){
            android.widget.Toast.makeText(getActivity(),e.toString(), android.widget.Toast.LENGTH_LONG);
        }
    }
}

在这里,您将创建一个本地数据ArrayList。但是你设置了一个名为相同数据的不同列表到适配器,实例化但是没有大小。

您应该从onCreateView()方法执行AssyncTask并从onPostExecute()方法设置适配器。 *还要在Adapter中设置相同的数据变量。最好使它成为Fragment类的领域。