java - 我不断收到错误。不兼容的类型 : ArrayList<StudentDetails> cannot be converted to ArrayList<AndroidTargets>

标签 java android firebase firebase-realtime-database android-recyclerview

The idea is to make a list from Firebase clickable when it is populated in the RecyclerView but I get this error:

error: incompatible types: ArrayList cannot be converted to ArrayList"

在包含“adapter = new TargetDataAdapter(list,this);”的行在“showstudentdetails” Activity 中。

This is the showstudentdetails code:

package com.example.helpresponse;

import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;

import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import java.util.ArrayList;
import java.util.List;


//Note that you can implement more than one interfaces, that's one of its beauty.
public class ShowStudentDetailsActivity extends AppCompatActivity implements HandleClick {
    private DatabaseReference databaseReference;

    ProgressDialog progressDialog;

    private ArrayList<StudentDetails> list = new ArrayList<>();

    private RecyclerView recyclerView;
    private TargetDataAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_show_student_details);

        initRecyclerView();
        initProgressDialog("Loading Data from Firebase Database");

        progressDialog.show();

        databaseReference = FirebaseDatabase.getInstance().getReference("Police").child("Chats");

        databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {

                for (DataSnapshot dataSnapshot : snapshot.getChildren()) {

                    StudentDetails studentDetails = dataSnapshot.getValue(StudentDetails.class);

                    list.add(studentDetails);
                }

                adapter = new TargetDataAdapter(list,this);
                recyclerView.setAdapter(adapter);

                progressDialog.dismiss();
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

                progressDialog.dismiss();

            }
        });
    }

    private void initProgressDialog(String msg){
        progressDialog = new ProgressDialog(this);
        progressDialog.setMessage(msg);
    }

    private void initRecyclerView(){
        recyclerView = findViewById(R.id.recyclerView);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
    }

    @Override
    public void onItemClick(int index){
        Intent intent = new Intent(this, MapsActivity.class);
        int myData = index;
        intent.putExtra("myDataKey", myData);
        startActivity(intent);
    }
}

this is the android targets

package com.example.helpresponse;

public class AndroidTargets {
    public String FIELD1;
    public Long FIELD2;
    public String FIELD3;
}

this is the adapter

package com.example.helpresponse;

import android.content.Context;
import android.content.Intent;
import android.support.annotation.NonNull;
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.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.Locale;

public class TargetDataAdapter extends RecyclerView.Adapter<TargetDataAdapter.TargetViewHolder> {

    private ArrayList<AndroidTargets> targetsArrayList;
    private HandleClick mHandleClick;

    /*Note that the constructor now take two params which helps us get ride of setmHandleClick() method.*/
    public TargetDataAdapter(ArrayList<AndroidTargets> mTargetData, HandleClick handleClick) {
        targetsArrayList = mTargetData;
        mHandleClick = handleClick;
    }

    @NonNull
    @Override
    public TargetViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.target_row, viewGroup, false);
        return new TargetViewHolder(v);
    }

    /* There is an interesting way to make below code neater by abstracting it back to the Activity incharge, let me know if you want that...priority now is to focus on fixing your issue. */
    @Override
    public void onBindViewHolder(@NonNull TargetViewHolder viewHolder, int i) {
        viewHolder.androidTargetName.setText(targetsArrayList.get(i).FIELD1);
        viewHolder.androidTargetNumber.setText(String.format(Locale.getDefault(), "API Level: %d", targetsArrayList.get(i).FIELD2));
        viewHolder.androidTargetShortName.setText(targetsArrayList.get(i).FIELD3);
        viewHolder.myClickableView.setClickable(true);

        viewHolder.myClickableView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mHandleClick.onItemClick(i);
            }
        });
    }

    @Override
    public int getItemCount() {
        if (targetsArrayList == null)
            return 0;
        return targetsArrayList.size();
    }

    public static class TargetViewHolder extends RecyclerView.ViewHolder {
        protected TextView androidTargetName;
        protected TextView androidTargetNumber;
        protected TextView androidTargetShortName;
        protected LinearLayout myClickableView;


        public TargetViewHolder(@NonNull View itemView) {

            super(itemView);
            myClickableView = itemView.findViewById(R.id.linearLayout);
            androidTargetShortName = itemView.findViewById(R.id.textView2);
            androidTargetName = itemView.findViewById(R.id.textView3);
            androidTargetNumber = itemView.findViewById(R.id.textView4);

        }

        public interface IHomeSelector {
            void onCategorySelected(int postion);
        }
    }
}

this is the Studentdetails

package com.example.helpresponse;

/**
 * Created by Juned on 7/25/2017.
 */

public class StudentDetails {


    private String name;
   public String message;
    public String latitude;
    public String longitude;

    public StudentDetails() {
        // This is default constructor.
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String getLatitude() {
        return latitude;
    }

    public void setLatitude(String latitude) {
        this.latitude = latitude;
    }

    public String getLongitude() {
        return longitude;
    }

    public void setLongitude(String longitude) {
        this.longitude = longitude;
    }

    public String getStudentName() {

        return name;
    }

    public void setStudentName(String name) {

        this.name = name;
    }

}

最佳答案

您收到该错误是因为您传递了以下代码行:

adapter = new TargetDataAdapter(list,this);

前往TargetDataAdapter构造函数list它被声明为 ArrayList<StudentDetails> 类型在您的适配器中,列表的类型为 ArrayList<AndroidTargets> ,因此出现错误。要解决此问题,您应该传递相同数据类型的列表,更准确地说,类型为 ArrayList<AndroidTargets> 。因此列表中的所有对象都必须是 AndroidTargets 类型并且类型为 StudentDetails .

如果要显示 StudentDetails 的列表对象,那么您需要创建另一个接受 StudentDetails 类型列表的适配器.

关于java - 我不断收到错误。不兼容的类型 : ArrayList<StudentDetails> cannot be converted to ArrayList<AndroidTargets>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59510802/

相关文章:

android - Drawables 本身会泄漏内存?

java - 如何使用 Android 对 Firestore 进行分页?

javascript - firebase 与本地 react ,太慢

java - 使用Java定期将记录写入CSV文件

c# - 寻找一个开源的绘画风格程序作为游戏编辑器的基础

java - 可重用的 Java StringReader

android - jquery忽略错误和成功json代码

java - Android 上的可移植 JDBC 与 SQLite

java - 通过设置连接超时的 SSLSocketFactory 创建 SSLSocket

android - 在我的 android firebase 应用程序中安装 Fabric Crashlytics 后,这个 Gradle 构建错误是什么?