Java RecyclerView显示相同的项目

Java RecyclerView显示相同的项目,java,android,android-recyclerview,Java,Android,Android Recyclerview,我试图实现RecyclerView,显示来自JSONArray的数据。解析工作非常完美,但RecyclerView在每个项目中显示必须仅在最后一个项目中的信息 这是我的密码: MainActivity.java public class MainActivity extends AppCompatActivity { RecyclerView mRecyclerView; private RecyclerView.Adapter mAdapter; private RecyclerView.La

我试图实现RecyclerView,显示来自JSONArray的数据。解析工作非常完美,但RecyclerView在每个项目中显示必须仅在最后一个项目中的信息

这是我的密码:

MainActivity.java

public class MainActivity extends AppCompatActivity {
RecyclerView mRecyclerView;
private RecyclerView.Adapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;

protected void onCreate(Bundle savedInstanceState) {
    setTheme(R.style.AppTheme);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_layout);
    new parseTask().execute();
}

private class parseTask extends AsyncTask<Void, Void, String> {

    HttpURLConnection urlConnection = null;
    BufferedReader reader = null;
    String resultJson = "";
    ProgressDialog pdLoading = new ProgressDialog(MainActivity.this, R.style.MyDialogStyle);

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pdLoading.setMessage("\tLoading...");
        pdLoading.setCancelable(false);
        pdLoading.show();
    }

    @Override
    protected String doInBackground(Void... params) {
        try {
            URL url = new URL("http://songo.eu.pn/db_GetFromSongs.php");
            urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setRequestMethod("GET");
            urlConnection.connect();
            InputStream inputStream = urlConnection.getInputStream();
            StringBuffer buffer = new StringBuffer();
            reader = new BufferedReader(new InputStreamReader(inputStream));

            String line;
            while ((line = reader.readLine()) != null) {
                buffer.append(line);
            }

            resultJson = buffer.toString();

        } catch (Exception e) {
            e.printStackTrace();
        }
        return resultJson;
    }

    @Override
    protected void onPostExecute(String strJson) {
        super.onPostExecute(strJson);
        List<DataSongs> data = new ArrayList<>();
        JSONObject dataJsonObj = null;

        try {
            dataJsonObj = new JSONObject(strJson);
            JSONArray songs = dataJsonObj.getJSONArray("Songs");
            DataSongs songData = new DataSongs();
            for (int i = 0; i < songs.length(); i++) {
                JSONObject song = songs.getJSONObject(i);
                songData.songName = song.getString("song");
                songData.songGenreID = song.getString("GenreID");
                songData.songUserID = song.getString("UserID");
                data.add(songData);
                Log.e("songo", "SongName: " + data.get(i).songName);
            }

            mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
            mAdapter = new RecyclerAdapter(MainActivity.this, data, mRecyclerView);
            mRecyclerView.setHasFixedSize(true);
            mLayoutManager = new LinearLayoutManager(MainActivity.this);
            mRecyclerView.setAdapter(mAdapter);
            mRecyclerView.setLayoutManager(mLayoutManager);

        } catch (JSONException e) {
            e.printStackTrace();
        }

        pdLoading.dismiss();
    }
}
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {

private Context context;
private LayoutInflater inflater;
List<DataSongs> data = Collections.emptyList();

public RecyclerAdapter(Context context, List<DataSongs> data, RecyclerView recyclerView) {
    this.context = context;
    inflater = LayoutInflater.from(context);
    this.data = data;
    this.recyclerView = recyclerView;
}

class ViewHolder extends RecyclerView.ViewHolder{

    TextView tv_songName;
    TextView tv_songGenreID;
    TextView tv_songUserID;

    public ViewHolder(View itemView) {
        super(itemView);
        tv_songName = (TextView) itemView.findViewById(R.id.tv_songName);
        tv_songGenreID = (TextView) itemView.findViewById(R.id.tv_songGenreID);
        tv_songUserID = (TextView) itemView.findViewById(R.id.tv_songUserID);
    }
}

// Создает новые views (вызывается layout manager-ом)
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v=inflater.inflate(R.layout.recycler_item, parent,false);
    return new ViewHolder(v);
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    DataSongs current = data.get(position);
    holder.tv_songName.setText(current.songName);
    holder.tv_songGenreID.setText(current.songGenreID);
    holder.tv_songUserID.setText(current.songUserID);
    Log.e("songo", "SongName: " + data.get(position).songName);        
}

@Override
public int getItemCount() {
    return data.size();
}
public类MainActivity扩展了AppCompatActivity{
回收视图mRecyclerView;
专用回收器查看适配器mAdapter;
private RecyclerView.LayoutManager MLLayoutManager;
创建时受保护的void(Bundle savedInstanceState){
setTheme(R.style.AppTheme);
super.onCreate(savedInstanceState);
setContentView(右布局、主布局);
新建parseTask().execute();
}
私有类parseTask扩展了AsyncTask{
HttpURLConnection-urlConnection=null;
BufferedReader reader=null;
字符串resultJson=“”;
ProgressDialog pdLoading=新建ProgressDialog(MainActivity.this,R.style.MyDialogStyle);
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
pdLoading.setMessage(“\t加载…”);
pdLoading.setCancelable(假);
pdLoading.show();
}
@凌驾
受保护字符串doInBackground(无效…参数){
试一试{
URL=新URL(“http://songo.eu.pn/db_GetFromSongs.php");
urlConnection=(HttpURLConnection)url.openConnection();
urlConnection.setRequestMethod(“GET”);
urlConnection.connect();
InputStream InputStream=urlConnection.getInputStream();
StringBuffer=新的StringBuffer();
reader=新的BufferedReader(新的InputStreamReader(inputStream));
弦线;
而((line=reader.readLine())!=null){
buffer.append(行);
}
resultJson=buffer.toString();
}捕获(例外e){
e、 printStackTrace();
}
返回resultJson;
}
@凌驾
受保护的void onPostExecute(字符串strJson){
super.onPostExecute(strJson);
列表数据=新的ArrayList();
JSONObject数据JSONOBJ=null;
试一试{
dataJsonObj=新的JSONObject(strJson);
JSONArray songs=dataJsonObj.getJSONArray(“歌曲”);
DataSongs songData=新的DataSongs();
对于(int i=0;i
RecyclerAdapter.java

public class MainActivity extends AppCompatActivity {
RecyclerView mRecyclerView;
private RecyclerView.Adapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;

protected void onCreate(Bundle savedInstanceState) {
    setTheme(R.style.AppTheme);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_layout);
    new parseTask().execute();
}

private class parseTask extends AsyncTask<Void, Void, String> {

    HttpURLConnection urlConnection = null;
    BufferedReader reader = null;
    String resultJson = "";
    ProgressDialog pdLoading = new ProgressDialog(MainActivity.this, R.style.MyDialogStyle);

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pdLoading.setMessage("\tLoading...");
        pdLoading.setCancelable(false);
        pdLoading.show();
    }

    @Override
    protected String doInBackground(Void... params) {
        try {
            URL url = new URL("http://songo.eu.pn/db_GetFromSongs.php");
            urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setRequestMethod("GET");
            urlConnection.connect();
            InputStream inputStream = urlConnection.getInputStream();
            StringBuffer buffer = new StringBuffer();
            reader = new BufferedReader(new InputStreamReader(inputStream));

            String line;
            while ((line = reader.readLine()) != null) {
                buffer.append(line);
            }

            resultJson = buffer.toString();

        } catch (Exception e) {
            e.printStackTrace();
        }
        return resultJson;
    }

    @Override
    protected void onPostExecute(String strJson) {
        super.onPostExecute(strJson);
        List<DataSongs> data = new ArrayList<>();
        JSONObject dataJsonObj = null;

        try {
            dataJsonObj = new JSONObject(strJson);
            JSONArray songs = dataJsonObj.getJSONArray("Songs");
            DataSongs songData = new DataSongs();
            for (int i = 0; i < songs.length(); i++) {
                JSONObject song = songs.getJSONObject(i);
                songData.songName = song.getString("song");
                songData.songGenreID = song.getString("GenreID");
                songData.songUserID = song.getString("UserID");
                data.add(songData);
                Log.e("songo", "SongName: " + data.get(i).songName);
            }

            mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
            mAdapter = new RecyclerAdapter(MainActivity.this, data, mRecyclerView);
            mRecyclerView.setHasFixedSize(true);
            mLayoutManager = new LinearLayoutManager(MainActivity.this);
            mRecyclerView.setAdapter(mAdapter);
            mRecyclerView.setLayoutManager(mLayoutManager);

        } catch (JSONException e) {
            e.printStackTrace();
        }

        pdLoading.dismiss();
    }
}
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {

private Context context;
private LayoutInflater inflater;
List<DataSongs> data = Collections.emptyList();

public RecyclerAdapter(Context context, List<DataSongs> data, RecyclerView recyclerView) {
    this.context = context;
    inflater = LayoutInflater.from(context);
    this.data = data;
    this.recyclerView = recyclerView;
}

class ViewHolder extends RecyclerView.ViewHolder{

    TextView tv_songName;
    TextView tv_songGenreID;
    TextView tv_songUserID;

    public ViewHolder(View itemView) {
        super(itemView);
        tv_songName = (TextView) itemView.findViewById(R.id.tv_songName);
        tv_songGenreID = (TextView) itemView.findViewById(R.id.tv_songGenreID);
        tv_songUserID = (TextView) itemView.findViewById(R.id.tv_songUserID);
    }
}

// Создает новые views (вызывается layout manager-ом)
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v=inflater.inflate(R.layout.recycler_item, parent,false);
    return new ViewHolder(v);
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    DataSongs current = data.get(position);
    holder.tv_songName.setText(current.songName);
    holder.tv_songGenreID.setText(current.songGenreID);
    holder.tv_songUserID.setText(current.songUserID);
    Log.e("songo", "SongName: " + data.get(position).songName);        
}

@Override
public int getItemCount() {
    return data.size();
}
公共类RecyclerAdapter扩展了RecyclerView.Adapter{ 私人语境; 私人充气机; List data=Collections.emptyList(); 公共RecyclerAdapter(上下文上下文、列表数据、RecyclerView RecyclerView){ this.context=上下文; 充气器=充气器。从(上下文); 这个数据=数据; this.recyclerView=recyclerView; } 类ViewHolder扩展了RecyclerView.ViewHolder{ TextView tv_songName; TextView tv_songGenreID; TextView电视用户ID; 公共视图持有者(视图项视图){ 超级(项目视图); tv_songName=(TextView)itemView.findViewById(R.id.tv_songName); tv_songGenreID=(TextView)itemviewbyd(R.id.tv_songGenreID); tv_songUserID=(TextView)itemView.findViewById(R.id.tv_songUserID); } } //视图(布局管理器-项目) @凌驾 public ViewHolder onCreateViewHolder(视图组父级,int-viewType){ 视图v=充气机。充气(R.layout.recycler\u项目,父项,false); 返回新的视图持有者(v); } @凌驾 公共无效onBindViewHolder(ViewHolder,int位置){ DataSongs current=data.get(位置); holder.tv_songName.setText(当前的.songName); holder.tv_songGenreID.setText(当前的songGenreID); holder.tv_songUserID.setText(当前的.songUserID); Log.e(“songo”,“SongName:”+data.get(position.SongName)); } @凌驾 public int getItemCount(){ 返回data.size(); }
来自MainActivity的日志按原样显示信息(没有相等的行)

来自RecyclerAdapter的日志显示每个歌曲名都是相同的

DataSongs songData = new DataSongs(); 
在for循环中的这行代码中,您每次都需要创建新的json对象来解决此问题

试试这个

 try {
        dataJsonObj = new JSONObject(strJson);
        JSONArray songs = dataJsonObj.getJSONArray("Songs");
        DataSongs songData = null;
        for (int i = 0; i < songs.length(); i++) {
            songData = new DataSongs();
            JSONObject song = songs.getJSONObject(i);
            songData.songName = song.getString("song");
            songData.songGenreID = song.getString("GenreID");
            songData.songUserID = song.getString("UserID");
            data.add(songData);
            Log.e("songo", "SongName: " + data.get(i).songName);
        }

        mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
        mAdapter = new RecyclerAdapter(MainActivity.this, data, mRecyclerView);
        mRecyclerView.setHasFixedSize(true);
        mLayoutManager = new LinearLayoutManager(MainActivity.this);
        mRecyclerView.setAdapter(mAdapter);
        mRecyclerView.setLayoutManager(mLayoutManager);

    } catch (JSONException e) {
        e.printStackTrace();
    }
试试看{
dataJsonObj=新的JSONObject(strJson);
JSONArray songs=dataJsonObj.getJSONArray(“歌曲”);
DataSongs songData=null;
对于(int i=0;i        dataJsonObj = new JSONObject(strJson);
        JSONArray songs = dataJsonObj.getJSONArray("Songs");
        DataSongs songData = new DataSongs();
        for (int i = 0; i < songs.length(); i++) {
            JSONObject song = songs.getJSONObject(i);
            songData.songName = song.getString("song");
            songData.songGenreID = song.getString("GenreID");
            songData.songUserID = song.getString("UserID");
            data.add(songData);
            Log.e("songo", "SongName: " + data.get(i).songName);
        }
        dataJsonObj = new JSONObject(strJson);
        JSONArray songs = dataJsonObj.getJSONArray("Songs");

        for (int i = 0; i < songs.length(); i++) {
            JSONObject song = songs.getJSONObject(i);
            DataSongs songData = new DataSongs();
            songData.songName = song.getString("song");
            songData.songGenreID = song.getString("GenreID");
            songData.songUserID = song.getString("UserID");
            data.add(songData);
            Log.e("songo", "SongName: " + data.get(i).songName);
        }
public class MainActivity extends AppCompatActivity {
        RecyclerView mRecyclerView;
        private RecyclerView.Adapter mAdapter;
        private RecyclerView.LayoutManager mLayoutManager;

        protected void onCreate(Bundle savedInstanceState) {
            setTheme(R.style.AppTheme);
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main_layout);
            new parseTask().execute();
        }

        private class parseTask extends AsyncTask<Void, Void, String> {

            HttpURLConnection urlConnection = null;
            BufferedReader reader = null;
            String resultJson = "";
            ProgressDialog pdLoading = new ProgressDialog(MainActivity.this, R.style.MyDialogStyle);

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                pdLoading.setMessage("\tLoading...");
                pdLoading.setCancelable(false);
                pdLoading.show();
            }

            @Override
            protected String doInBackground(Void... params) {
                try {
                    URL url = new URL("http://songo.eu.pn/db_GetFromSongs.php");
                    urlConnection = (HttpURLConnection) url.openConnection();
                    urlConnection.setRequestMethod("GET");
                    urlConnection.connect();
                    InputStream inputStream = urlConnection.getInputStream();
                    StringBuffer buffer = new StringBuffer();
                    reader = new BufferedReader(new InputStreamReader(inputStream));

                    String line;
                    while ((line = reader.readLine()) != null) {
                        buffer.append(line);
                    }

                    resultJson = buffer.toString();

                } catch (Exception e) {
                    e.printStackTrace();
                }
                return resultJson;
            }

            @Override
            protected void onPostExecute(String strJson) {
                super.onPostExecute(strJson);
                List<DataSongs> data = new ArrayList<>();
                JSONObject dataJsonObj = null;

                try {
                    dataJsonObj = new JSONObject(strJson);
                    JSONArray songs = dataJsonObj.getJSONArray("Songs");

                    for (int i = 0; i < songs.length(); i++) {
                        JSONObject song = songs.getJSONObject(i);
                        /**
                         * you were wrong here
                         */
                        DataSongs songData = new DataSongs();

                        songData.songName = song.getString("song");
                        songData.songGenreID = song.getString("GenreID");
                        songData.songUserID = song.getString("UserID");
                        data.add(songData);
                        Log.e("songo", "SongName: " + data.get(i).songName);
                    }

                    mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
                    mAdapter = new RecyclerAdapter(MainActivity.this, data, mRecyclerView);
                    mRecyclerView.setHasFixedSize(true);
                    mLayoutManager = new LinearLayoutManager(MainActivity.this);
                    mRecyclerView.setAdapter(mAdapter);
                    mRecyclerView.setLayoutManager(mLayoutManager);

                } catch (JSONException e) {
                    e.printStackTrace();
                }

                pdLoading.dismiss();
            }
        }