2017-05-17 3 views
0
setzen

Also habe ich eine Liste von Zuständen in meinem RecyclerView und das funktioniert. Aber ich möchte auf der linken Seite des Textes ein Bild aus meinem Assets-Ordner hinzufügen, das auf der gleichen Ebene wie der Res-Ordner ist, kein Unterordner, und das funktioniert nicht.Bild im RecyclerView von Adapter

Meine Layout-Datei lautet wie folgt:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:paddingBottom="5dp" 
android:paddingTop="5dp"> 

<ImageView 
    android:id="@+id/state_Icon_View" 
    android:layout_width="50dp" 
    android:layout_height="50dp" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" 
    android:layout_centerVertical="true" 
    tools:ignore="HardcodedText" /> 

<TextView 
    android:id="@+id/state_Item" 
    android:layout_width="wrap_content" 
    android:layout_height="50dp" 
    android:layout_centerVertical="true" 
    android:layout_marginLeft="@dimen/activity_horizontal_margin" 
    android:layout_marginStart="@dimen/activity_horizontal_margin" 
    android:layout_toEndOf="@+id/state_Icon_View" 
    android:layout_toRightOf="@+id/state_Icon_View" 
    android:text="The State" 
    android:textColor="#000000" 
    android:textSize="24sp" 
    tools:ignore="HardcodedText" /> 

Hier ist meine Daten-Provider:

import android.widget.ImageView; 

public class StateDataProvider 
{ 
private String state; 
private ImageView image; 

public StateDataProvider(String state) 
{this.setState(state);} 

public StateDataProvider(ImageView image) 
{this.setImage(image);} 

public String getState() { 
    return state; 
} 

public ImageView getImage() { 
    return image; 
} 

public void setState(String state) 
{ 
    this.state = state; 
} 

public void setImage(ImageView image) 
{ 
    this.image = image; 
} 
} 

Und schließlich ist hier mein Adapter:

public class StateRecyclerAdapter extends RecyclerView.Adapter <StateRecyclerAdapter.RecyclerViewHolder> { 

private ArrayList<StateDataProvider> arrayList = new ArrayList<StateDataProvider>(); 

private Context context; 

public StateRecyclerAdapter(Context context, ArrayList<StateDataProvider> arrayList) 
{ 
    this.arrayList = arrayList; 
    this.context = context; 

} 

private String theStateIcon; 

@Override 
public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.state_layout,parent,false); 

    RecyclerViewHolder recyclerViewHolder = new RecyclerViewHolder(view); 

    return recyclerViewHolder; 
} 

@Override 
public void onBindViewHolder(StateRecyclerAdapter.RecyclerViewHolder holder, int position) { 
    StateDataProvider data_provider = arrayList.get(position); 

    holder.state.setText(data_provider.getState()); 

    String whichState = data_provider.getState(); 
    switch (whichState) { 
     case "New South Wales": 
      theStateIcon = "NSW_icon.png"; 
     case "Victoria": 
      theStateIcon = "VIC_icon.png"; 
     case "Queensland": 
      theStateIcon = "QLD_icon.png"; 
     case "Tasmania": 
      theStateIcon = "TAS_icon.png"; 
     case "South Australia": 
      theStateIcon = "SA_icon.png"; 
     case "Northern Territory": 
      theStateIcon = "NT_icon.png"; 
     case "Western Australia": 
      theStateIcon = "WA_icon.png"; 
    } 

    int resourceId = context.getResources().getIdentifier(theStateIcon, "assets", "au.com.itmobilesupport.sqltwo"); 
    holder.state_Icon.setImageDrawable(ContextCompat.getDrawable(context,resourceId)); 

} 

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

public static class RecyclerViewHolder extends RecyclerView.ViewHolder 
{ 
    TextView state; 
    ImageView state_Icon; 

    public RecyclerViewHolder(View view) { 
     super(view); 
     state = (TextView)view.findViewById(R.id.state_Item); 
     state_Icon = (ImageView) view.findViewById(R.id.state_Icon_View); 
     } 
} 
} 

Also ich versuche, um den Kontext zu bekommen und dann das Bild für die Bildansicht zu setzen, aber wenn ich versuche den Kontext zu bekommen, bekomme ich folgendes wegen Fehler:

Error:(48, 19) error: constructor StateRecyclerAdapter in class 
StateRecyclerAdapter cannot be applied to given types; 
required: Context,ArrayList<StateDataProvider> 
found: ArrayList<StateDataProvider> 
reason: actual and formal argument lists differ in length 

EDIT: Hier ist mein StatePage.java

public class StatePage extends AppCompatActivity { 

private Cursor reefs; 
private MyDatabase db; 
private String chosenState; 
RecyclerView recyclerView; 
RecyclerView.Adapter adapter; 
RecyclerView.LayoutManager layoutManager; 
ArrayList<StateDataProvider> arrayList = new 
ArrayList<StateDataProvider>(); 
StateDataProvider dataprovider; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_state_page); 
    db = new MyDatabase(this); 

    reefs = db.getStateData(); 

    do{ 
     dataprovider = new StateDataProvider(reefs.getString(1)); 
     arrayList.add(dataprovider); 

    } while (reefs.moveToNext()); 

    recyclerView = (RecyclerView)findViewById(R.id.recycler_view); 
    recyclerView.setHasFixedSize(true); 

    layoutManager = new LinearLayoutManager(this); 
    recyclerView.setLayoutManager(layoutManager); 

    adapter = new StateRecyclerAdapter(arrayList); 
    recyclerView.setAdapter(adapter); 

    recyclerView.addOnItemTouchListener(
      new MyRecyclerViewClickListener(this, new 
MyRecyclerViewClickListener.OnItemClickListener() { 
       @Override 
       public void onItemClick(View view, int position) { 
        chosenState = arrayList.get(position).getState(); 
        goToRegionPage(); 
//      System.out.println("State is" + 
arrayList.get(position).getState()); 
       } 
      }) 
    ); 
} 
public void goToRegionPage() 
{ 
    Intent intent = new Intent(this, RegionPage.class); 
    intent.putExtra("theState", chosenState); 
    startActivity(intent); 
} 
} 
+0

Können Sie Ihre Aktivität/Fragment Codes schreiben, wo Sie diese StateRecyclerAdapter verwenden. Der Fehler ist nicht auf das Festlegen des Bildproblems zurückzuführen. –

+0

Included StartPage.java Ermittelt die Daten aus einer SQL-Datenbank, die beim Start importiert wird. Es funktioniert alles, aber ich möchte nur die App um ein Bild zu verbessern und das ist, wo ich festgefahren bin. – timv

+0

Danke Quang, ich bekomme einen Fehler bei Adapter = new StateRecyclerAdapter (arrayList); Ich muss auch den Kontext angeben, bin mir aber nicht sicher, wie das geht. Und ja, ich bin ein Neuling, tut mir leid, wenn es eine dumme Frage ist. – timv

Antwort

1

Der Fehler von dieser Linie in Ihrer Aktivität:

adapter = new StateRecyclerAdapter(arrayList); 

Sie sollte zu

ändern

Da Ihr SateRecyclerAdapter Konstruktor erfordert zwei Argumente (Kontext und Datenliste):

public StateRecyclerAdapter(Context context, ArrayList<StateDataProvider> arrayList) 
+0

Jetzt versuchen, danke für die Info. – timv

1

Sie Konstruktoraufruf nicht genug param

StateRecyclerAdapter state = new StateRecyclerAdapter(arrayList); 

zu

StateRecyclerAdapter state = new StateRecyclerAdapter(getApplicationContext(),arrayList); 


dann für den Bildteil

Sie benötigen die Bitmap erste

private Bitmap getBitmapFromAsset(String strName) 
{ 
     AssetManager assetManager = getAssets(); 
     InputStream istr = null; 
     try { 
      istr = assetManager.open(strName); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     Bitmap bitmap = BitmapFactory.decodeStream(istr); 
     return bitmap; 
} 

Dann bekommen

holder.state_Icon.setImageBitmap(getBitmapFromAsset("name of image")); 
+0

Ich werde das versuchen und danke für die Info, aber ich habe immer noch Probleme mit dem Konstruktor. Brauche ich den "Kontext" mit Ihrer Lösung, da ich im Begriff bin, den Kontextcode zu entfernen und es ohne den Kontext zu versuchen – timv

+0

siehe bearbeiten ....... – ZeroOne

Verwandte Themen