0

Ich arbeite an einer einfachen Anwendung, die die Shows verfolgt, die ich gerade sehe, zuerst benutzte ich einen ListView, aber jetzt möchte ich einen RecyclerView verwenden. Ich speichere alle Shows in einer lokalen Datenbank. Ich habe jedoch Probleme, meinen Code korrekt in einen RecyclerView umzuwandeln. Ich kann es noch nicht testen, weil ich mit dem Fehler in der folgenden Zeile am kämpfen:Von ListView zu RecyclerView

showAdapter = new ArrayAdapter<Show>(this, showArrayAdapter); // the error 

Error:(62, 56) error: incompatible types: List cannot be converted to int

public class MainActivity extends AppCompatActivity { 
private Button btn; 
private RecyclerView recyclerView; 
private List<Show> showArrayAdapter; 
private ShowsAdapter showAdapter; 
private DataSource datasource; 
List<Show> shows = datasource.getAllShows(); 

public static final String INTENT_DETAIL_ROW_NUMBER = "Row number"; 
public static final String INTENT_DETAIL_REMINDER_TEXT = "Reminder text"; 
public static final int REQUESTCODE = 2; 
public static final String EXTRA_SHOW_ID = "extraShowId"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    datasource = new DataSource(this); 
    shows = datasource.getAllShows(); 
    recyclerView = (RecyclerView) findViewById(R.id.main_list); 
    showArrayAdapter = new ArrayList<Show>(); 


    recyclerView.setAdapter(showAdapter); 

    registerForContextMenu(recyclerView); 

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.taskView); 
     fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      startActivityForResult(new Intent(MainActivity.this, CreateShowActivity.class), 1); 
      } 
     }); 
    } 

    private void updateUI() { 
     if (showAdapter == null) { 
      showAdapter = new ArrayAdapter<Show>(this, showArrayAdapter); // the error 
      recyclerView.setAdapter(showAdapter); 
     } else { 
      showAdapter.notifyDataSetChanged(); 
     } 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == 1) { 
      if (resultCode == RESULT_OK) { 
       //Handle data 
       long showId = data.getLongExtra(EXTRA_SHOW_ID, -1); 
       if (showId != -1) { 
        Show show = datasource.getShow(showId); 
        showArrayAdapter.add(show); 
        updateUI(); 

       } 
      } 
     } 
     if (requestCode == 2) { 
      if (resultCode == RESULT_OK) { 
       updateUI(); 
      } 
     } 
    } 
} 

Mein Adapter

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

    private ArrayAdapter<Show> mShows; 
    private Context mContext; 

    public ShowsAdapter(Context mContext, ArrayAdapter<Show> mShows) { 
     this.mContext = mContext; 
     this.mShows = mShows; 
    } 

    @Override 
    public ShowsAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

     View view = LayoutInflater.from(mContext).inflate(android.R.layout.activity_list_item, null); 

     // Return a new holder instance 
     ShowsAdapter.ViewHolder viewHolder = new ShowsAdapter.ViewHolder(view); 
     return viewHolder; 


    } 

    @Override 
    public void onBindViewHolder(ShowsAdapter.ViewHolder holder, final int position) { 

     final Show show = mShows.getItem(position); 

     holder.textView.setText(show.getShow()); 

     holder.mView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Intent intent = new Intent(mContext, EditShowActivity.class); 
       intent.putExtra(INTENT_DETAIL_ROW_NUMBER, position); 
       intent.putExtra(INTENT_DETAIL_REMINDER_TEXT, show.getShow()); 
       ((MainActivity) mContext).startActivityForResult(intent, REQUESTCODE); 
      } 
     }); 

     holder.mView.setOnLongClickListener(new View.OnLongClickListener() { 
      @Override 
      public boolean onLongClick(View view) { 
       mShows.remove(mShows.getItem(position)); 
       notifyItemRemoved(position); 
       notifyItemRangeChanged(position,mShows.getCount()); 
       return true; 
      } 
     }); 

    } 

    @Override 
    public int getItemCount() { 
     return mShows.getCount(); 
    } 



    public static class ViewHolder extends RecyclerView.ViewHolder{ 

     public View mView; 
     public TextView textView; 

     //Constructor 
     public ViewHolder(View v) { 


      super(v); 
      textView = (TextView) v.findViewById(android.R.id.text1); 
      mView = v; 
     } 
    } 
} 

Da ich zur Zeit mit dieser habe Schwierigkeiten und versuchte, Es kann viele verschiedene Dinge geben, dass mein Code nicht funktioniert. wenn Sie etwas anderes sehen lassen Sie mich wissen

UPDATE:
änderte ich viel auf der Grundlage der Eingabe von allen erhalten:

private DataSource datasource; 
private Button btn; 
private RecyclerView recyclerView; 
private List<Show> shows; 

private ShowsAdapter showAdapter; 

hinzugefügt, um die Layout-Manager und entfernt Datenquelle, bevor die Initialisierung

DataSource datasource = new DataSource(this); 
    List<Show> shows = datasource.getAllShows(); 
    recyclerView = (RecyclerView) findViewById(R.id.main_list); 

    RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(this); 
    recyclerView.setLayoutManager(mLayoutManager); 
    recyclerView.setAdapter(showAdapter); 

Aktualisiert meine UpdateUI()

private void updateUI() { 
     if (showAdapter == null) { 
      showAdapter = new ShowsAdapter(this, shows); // the error 
      recyclerView.setAdapter(showAdapter); 
     } else { 
      showAdapter.notifyDataSetChanged(); 
     } 
    } 

und abgestimmt werden die Typen in showAdapters.java

public ShowsAdapter(Context mContext, List<Show> mShows) { 
     this.mContext = mContext; 
     this.mShows = mShows; 
    } 

jedoch auf Start I

E/RecyclerView: No adapter attached; skipping layout E/RecyclerView: No adapter attached; skipping layout

und

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { (has extras) }} to activity {com.example.kevin.androidapp/com.example.kevin.androidapp.MainActivity}: java.lang.NullPointerException

Caused by: java.lang.NullPointerException at com.example.kevin.androidapp.MainActivity.onActivityResult(MainActivity.java:77)

, die in der onActivityResult ist Show show = datasource.getShow(showId);

die folgenden Fehler bekommen My createShowActivity

public class CreateShowActivity extends AppCompatActivity { 
    private Button btn; 
    private EditText showDescription; 
    private DataSource datasource; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_list); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     showDescription = (EditText)this.findViewById(R.id.showDescription); 
     datasource = new DataSource(this); 

     FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.createButton); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       long assignmentId = datasource.createShows(showDescription.getText().toString()); 
       Intent resultIntent = new Intent(); 
       resultIntent.putExtra(MainActivity.EXTRA_SHOW_ID, assignmentId); 
       setResult(Activity.RESULT_OK, resultIntent); 
       finish(); 

      } 
     }); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    } 
} 
+0

Unklare entsprechen, welche Linie, die sie bezieht ... Auch , wer hat gesagt, dass du eine Recyclerview benötigst? Sie können das ViewHolder-Muster in einem ListView verwenden –

+1

Und "List shows = datasource.getAllShows();" sieht so aus, als würde es eine Null-Null-Erkennung auslösen, also würde der Code unabhängig vom Kompilierungsfehler nicht ausgeführt werden –

+0

nicht sicher, dass du den ArrayAdapter neu gesetzt hast (this, showArrayAdapter); umAdapter anzuzeigen. Sieht so aus, als wäre das Problem, eine ShowAdapter-Instanz zu erstellen und es zu versuchen? – Raghavendra

Antwort

2

Liste kann nicht in int konvertiert werden?

Das ist nicht die Linie, die Sie, es sei denn getAllShows() markiert einen int zurück ...


Sie Ihre Adapter Mischen, though. Recyclerview verwendet ArrayAdapter nicht.

Sie haben diese Klasse

ShowsAdapter extends RecyclerView.Adapter 

Aber Sie es nicht

showAdapter = new ArrayAdapter<Show>(this, showArrayAdapter); // the error 
    recyclerView.setAdapter(showAdapter); 

Auch showArrayAdapter = new ArrayList<Show>(); ist kein Adapter überhaupt. Sie haben bereits einen List<Show> shows

Und

datasource = new DataSource(this); 
shows = datasource.getAllShows(); 

Zunächst aber Sie bekommen die Shows auf dem Gebiet stoppen müssen, wenn Sie nicht über eine Nullpointer wollen.

private List<Show> shows; // = datasource.getAllShows(); 

Zusammengefasst zu verwenden Recyclerview

1) fügen Sie ein Layoutmanager
2) verwenden Sie den richtigen Adapter Klasse
3) verwenden, um die richtige Liste

RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(this); 
recyclerView.setLayoutManager(mLayoutManager); 

showAdapter = new ShowsAdapter(this, shows); 

recyclerView.setAdapter(showAdapter); 

Zusätzliche Anmerkung.

Diese Umwandlung in die Aktivität ist nicht erforderlich und führt zu Problemen, wenn Sie diesen Adapter für andere Aktivitäten verwenden möchten.

((MainActivity) mContext).startActivityForResult 
+0

Ersetzen Sie getActivity() durch Activity.this, da dies eine Aktivität ist. Ich machte das gleiche. –

+0

Im Layout-Manager übergeben Sie getActivity() –

+0

Hoppla, ja. Korrigiert –

2

Einer Ihrer Fehler ist diese

private DataSource datasource; 
List<Show> shows = datasource.getAllShows(); 

Sie versuchen, alles selbst zu bekommen zeigt, bevor Sie haben Datenquelle initialisiert. Da Sie dies bereits in onCreate() Methode tun, sollten Sie diese Zeile entfernen, die Sie vor onCreate() verwenden;

Sie haben auch keinen Layoutmanager für Ihre Recyclerview bereitgestellt. Daher wird Ihre Recycleransicht nicht angezeigt. Fügen Sie einen Layout-Manager wie dies

RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(MainActivity.this); 
recyclerView.setLayoutManager(mLayoutManager); 

Vergessen Sie auch nicht Layout-Manager wie oben in Ihrem updateUI() Verfahren zur Verfügung zu stellen.

1

Ganz sicher nicht, dass Sie

setzen
showAdapter = new ArrayAdapter<Show>(this, showArrayAdapter); 

zu showAdapter.

Sieht aus wie das Problem ist, erstellen ShowsAdapter Instanz und versuchen?

showAdapter = new ShowsAdapter(this, showArrayAdapter) 
2

In onCreate Sie setzen Adapter vor der Initialisierung

Bitte belove Linie in onCreate und Orientierung eingestellt entfernen für Recycler Ansicht mit LinearLayoutManger

entfernen Linie in onCreate

recyclerView.setAdapter(showAdapter); 
0

Sie können den ArrayList-Datentyp nicht in den ArrayApptor-Datentyp konvertieren. Sie müssen die folgende Zeile im Code ändern.

if (showAdapter == null) { 
    showAdapter = new ArrayAdapter<Show>(this, showArrayAdapter); 
    recyclerView.setAdapter(showAdapter); 
} 

Änderung

if (showAdapter == null) { 
    showAdapter = new ShowAdapter(this, showArrayAdapter); 
    recyclerView.setAdapter(showAdapter); 
} 

und in der ShowAdapter Klasse Array den Datentyp der Variablen mShows von ArrayAdaptor ändern. Sehen Sie sich den Beispielcode unten an.

private ArrayList<Show> mShows; 
public ShowsAdapter(Context mContext, ArrayList<Show> mShows) { 
    this.mContext = mContext; 
    this.mShows = mShows; 
} 
+1

Nichts wurde in der ShowAdapter-Klasse geändert. –

+0

@ cricket_007 Im Konstruktor der ShowAdapter-Klasse ist der zweite Parameter der Arrayadapter-Datentyp, jedoch im ursprünglichen Code als Arraylist-Datentyp übergeben. Ist es möglich, Arraylist in Arrayadapter Datentyp zu konvertieren? –

+0

Ah, mein Schlechter. Falsch gelesen –

0

showAdapter = new ArrayAdapter(this, showArrayAdapter);

Ihr ArrayAdapter Konstruktor mit einem these, seinem erwarteten zweiten Parameter als resourceId in integer und nicht die Liste daher, dass Fehler nicht

Verwandte Themen