RecyclerView多次显示适配器中的最后一项.需要所有适配器项目以在RecyclerView中显示 [英] RecyclerView displaying the last item in the adapter several times. Need all adapter items to show in RecyclerView

查看:101
本文介绍了RecyclerView多次显示适配器中的最后一项.需要所有适配器项目以在RecyclerView中显示的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

因此,我尝试将数据从Parse数据库查询加载到recyclerView中.该查询将所有数据完美地加载到ArrayList中,然后将其添加到适配器中.

So I am trying to load data from a Parse database query into a recyclerView. The query is loading all my data into my ArrayList perfectly, which I then add to my adapter.

不幸的是,我的recyclerView只显示适配器数据的最后添加的内容.但是,如果适配器中有15个对象,则最后一次添加将在屏幕上重复15次.

Unfortunately, my recyclerView only displays the last addition to the adapter's data. However, if there are 15 objects in the adapter, then this last addition will be repeated 15 times on screen.

我认为问题在于,即使出于某种原因,数据ArrayList内部的值也不存在于查询之外,即使我在类中声明了它.

I believe the issue is that the values inside of the data ArrayList, for some reason, do not exist outside of the query, even though I declared it in the class.

这是我的MainActivity代码:

Here is my MainActivity Code:

public class MainActivity extends  ActionBarActivity implements DataAdapter.ClickListener {
private RecyclerView recyclerView;
static DataAdapter adapter;

public TextView tvParseUser;
private Context context;
String currentUser;

Data current = new Data();

List<Data> data = new ArrayList<>();


public static String BROADCAST_ACTION =
        "broadcast_action_packagename";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    IntentFilter filter = new IntentFilter();
    filter.addAction(BROADCAST_ACTION);
    filter.addCategory(Intent.CATEGORY_DEFAULT);
    registerReceiver(br, filter);

//testing Sree's suggestion
        adapter = new CommitmentDataAdapter(getApplicationContext(), data);
        Log.d("DATABEFOREADD", data.toString()); //data here is empty

    startService(new Intent(this, Broadcast_Service.class));
    tvParseUser = (TextView) findViewById(R.id.ParseUserName);
    setContentView(R.layout.activity_main);

    ParseQuery<ParseObject> query = ParseQuery.getQuery("ColumnTitle");
    query.whereEqualTo("author", ParseUser.getCurrentUser());
    recyclerView = (RecyclerView) findViewById(R.id.recyclerView); 
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    query.findInBackground(new FindCallback<ParseObject>() {

        @Override
        public void done(List<ParseObject> list, ParseException e) { //returns actual Parse Object
            if (e == null)
            {
                for (ParseObject getData : list)
                {

                    current.1= getData.getString("1");
                    current.2= getData.getString("2");
                    current.3= getData.getString("3");
                    current.4= getData.getString("4");
                    current.5= getData.getString("5");

                    current.combined= current.1 + current.2 + current.3 + current.4;
                    //checked Log.d, query is working fine. ArrayList should have an object of all the data for use

                    data.add(current);
                    Log.d("data", data.toString());
                    Log.d("CurrentCombined", current.combined);
                    adapter.notifyDataSetChanged(); //Sree's suggestion




                    //data correctly contains list of objects that I need

                }

                Log.d("dataInfo", String.valueOf(data));
                Log.d("Current", current.toString());
            }

            else
            {

            }

            recyclerView.setAdapter(adapter); //set recyclerView to this adapter

        }

    });
    Log.d("ADAPTERDATA", data.toString()); //NOTE THIS RETURNS AN EMPTY ARRAY. WHY?!
}

public BroadcastReceiver br = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        updateGUI(intent);
        adapter.notifyDataSetChanged();

    }
};

DataAdapter代码:

DataAdapter code:

    package com.example.android.moneyspeaks;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.CountDownTimer;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Chronometer;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import org.slf4j.helpers.Util;
import org.w3c.dom.Text;

import java.sql.Time;
import java.util.Calendar;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeUnit;


public class DataAdapter extends RecyclerView.Adapter<DataAdapter.MyViewHolder> {
    List<Data> data = Collections.emptyList();
    private LayoutInflater inflater;
    private Context context;
    private ClickListener clickListener;
    long millisCountDownTime;
    Intent intent;
    PendingIntent pendingIntent;
    Thread thread;
    Handler handler;
    Long now;
    Long later;
    Integer i = 0;
    final Handler myHandler = new Handler();

    public DataAdapter(Context context, List<Data> data) 
    {
        inflater = LayoutInflater.from(context);
        this.data = data;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
    {
        View view = inflater.inflate(R.layout.recycler_view_layout, parent, false); 
        MyViewHolder holder = new MyViewHolder(view); 

        return holder;
    }

    public void setClickListener(ClickListener clickListener) {
        this.clickListener = clickListener;

    }

    @Override
    public void onBindViewHolder(final MyViewHolder holder, int position) {
        Data current = data.get(position);
        holder.combined.setText(current.combined);
        holder.codeTimer.setText(current.goalTimer);
        holder.submitCode.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(v.getContext(), "HELL YA", Toast.LENGTH_LONG).show();

            }
        });

        if (current.classify2.equals("day(s)")) {
            millisCountDownTime = 86400000;
        } else if (current.classify2.equals("week(s)")) {
            millisCountDownTime = 604800000;
        } else if (current.classify2.equals("hour(s)")) {
            millisCountDownTime = 3600000;
        } else if (current.classify2.equals("minute(s)")) {
            millisCountDownTime = 6000;
        }
        final Runnable myRunnable = new Runnable() {
            @Override
            public void run() {
                holder.codeTimer.setText(String.valueOf(i));

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

class MyViewHolder extends RecyclerView.ViewHolder {
    TextView combined;
    TextView enterCode;
    TextView codeTimer;
    EditText codeInputField;
    Button submitCode;

    public MyViewHolder(View itemView) {
        super(itemView);
        combined= (TextView) itemView.findViewById(R.id.combinedSentence);
        codeTimer = (TextView) itemView.findViewById(R.id.codeTimer);
        submitCode = (Button) itemView.findViewById(R.id.submitTheCode);

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (v.getId() == R.id.submitTheCode) {
                    Intent i = new Intent(v.getContext(), Different.class);
                    v.getContext().startActivity(i);

                }

            }
        });
    }
}

public interface ClickListener {
    public void itemClicked(View view, int position);
}
}

推荐答案

我也遇到了同样的问题,并中断了谷歌搜索. 绝对的解决方案是在主要活动的for循环内创建类型为Datacurrent对象

I too faced the same issue and broke my head googling.. The absolute solution is to create your current object of type Data inside the for loop in the main activity

说明:您正在创建单个对象,并在循环外声明current对象时,使用相同的对象使用相同的值n次.

Explanation :You are creating a single object and using the same object with the same value n times when you declare your current object outside the loop

编码愉快!

这篇关于RecyclerView多次显示适配器中的最后一项.需要所有适配器项目以在RecyclerView中显示的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆