2017-07-18 7 views
1

Diese Frage wurde ein paar Mal gestellt, aber diese Antworten gelten nicht für mich. Ich möchte eine allgemeinere Antwort darüber, was dieses Problem im Allgemeinen verursacht.RecyclerView zeigt keine Elemente bis zum Scrollen

Ich habe eine Recyclerview in meinem Aktivitätslayout. Zeilen des recyclerview ist ein Constraint-Layout mit einer Bildansicht und Textview:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="50dp" 
    android:clickable="true"> 

    <ImageView 
     android:id="@+id/file_icon" 
     android:layout_width="50dp" 
     android:layout_height="50dp" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:layout_constraintBottom_toBottomOf="parent" 
     app:layout_constraintTop_toTopOf="parent"/> 

    <TextView 
     android:text="File" 
     android:id="@+id/file_name" 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     app:layout_constraintLeft_toRightOf="@+id/file_icon" 
     app:layout_constraintTop_toTopOf="parent" 
     app:layout_constraintBottom_toBottomOf="parent" 
     app:layout_constraintRight_toRightOf="parent"/> 

</android.support.constraint.ConstraintLayout> 

ich mehr Elemente habe in dieser Zeilenstruktur zu zeigen. Ich habe den Adapter richtig eingerichtet. Wenn ich meine Anwendung ausführe, werden Textansichten, die auf dem Bildschirm angezeigt werden, jedoch nicht angezeigt, bis ich wieder scrolle und zurückscrolle. Damit diese Textansichten angezeigt werden können, müssen sie im Grunde aus der Anzeige entfernt und erneut eingegeben werden. Hier ist mein Adapter-Code:

public class FileViewAdapter extends RecyclerView.Adapter<FileViewAdapter.Viewholder> { 

    private Context context; 
    private List<File> files; 

    public FileViewAdapter(Context context, List<File> files) { 
     this.context = context; 
     this.files = files; 
    } 

    public FileViewAdapter(Context context){ 

     this.context = context; 
    } 

    @Override 
    public Viewholder onCreateViewHolder(ViewGroup viewGroup, int i) { 
     LayoutInflater inflater = LayoutInflater.from(context); 
     View layout = inflater.inflate(R.layout.file_list_item, viewGroup, false); 
     return new Viewholder(layout); 
    } 

    @Override 
    public void onBindViewHolder(Viewholder viewholder, int i) { 
     File file = files.get(i); 
     if (file.isDirectory()) { 
      viewholder.fileIcon.setImageDrawable(
        context.getResources().getDrawable(R.drawable.ic_folder_black_24dp)); 
      viewholder.wholeThing.setOnClickListener(null); 
     } else { 
      viewholder.fileIcon.setImageDrawable(
        context.getResources().getDrawable(R.drawable.ic_insert_drive_file_black_24dp)); 
      viewholder.wholeThing.setOnClickListener(null); 
     } 
     viewholder.fileName.setText(file.getName()); 
    } 


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

    public void clear() { 
     files.clear(); 
     notifyDataSetChanged(); 
    } 

    public void addAll(List<File> newFiles) { 
     files.addAll(newFiles); 
     notifyDataSetChanged(); 
    } 

    class Viewholder extends RecyclerView.ViewHolder { 
     View wholeThing; 
     ImageView fileIcon; 
     TextView fileName; 

     public Viewholder(View itemView) { 
      super(itemView); 
      wholeThing = itemView; 
      fileIcon = (ImageView) itemView.findViewById(R.id.file_icon); 
      fileName = (TextView) itemView.findViewById(R.id.file_name); 
     } 
    } 

} 

EDIT: Wie ich den Konstruktor von Adapter auf Aktivität aufrufen.

+0

Add wo Sie Ihren Adapter –

+1

android nennen: layout_width = "0DP" android: layout_height = "0DP" Warum ist Ihre Breite und Höhe für Textview 0DP? –

+0

@EkundayoBlessingFunminiyi Es ist ConstraintLayout. Wenn Sie die Breite oder Höhe auf 0dp festlegen, wird es sich bis zu der horizontalen oder vertikalen Beschränkung erstrecken. – Bora

Antwort

0

Wenn Sie Daten für den Konstruktor festlegen, wird der Adapter möglicherweise nie über eingefügte Daten benachrichtigt. Versuchen Sie, eine notifyDataSetChanged() entweder am unteren Rand des Konstruktors oder extern hinzuzufügen (oder rufen Sie Ihre setData-Methode auf)

1

Bitte versuchen Sie es. Ich hoffe, es wird hilfreich sein.

RecyclerView recyclerView; 
FileViewAdapter adapter; 
List<File> files = new ArrayList<>(); 

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

    recyclerView = (RecyclerView) findViewById(R.id.recyclerView); 
    adapter = new FileViewAdapter(this, files); 
    recyclerView.setAdapter(adapter); 
    recyclerView.setLayoutManager(new LinearLayoutManager(this)); 
} 

@Override 
public void onResume() { 
    super.onResume(); 

    files = getFiles();//fetch files 
    adapter.notifyDataSetChanged();//update UI 
} 

public List<File> getFiles() { 
    //fetch files 
    //... 
    return files; 
} 

By the way, fand ich nicht die Situation mit dir passiert. Es kann einige andere Fehler in Ihrem Code geben, die Sie uns nicht gezeigt haben.

0

Das Problem von dem, was ich sehe, ist, dass die notifyDataSetChanged nicht im UiThread ocrr ist, also, wenn run ur setData Methode wie diese wird es funktionieren.

this.runOnUiThread(new Runnable() { 
     public void run() { 
      mAdapter.setNewData(newDataListForAdapter); 
      mAdapter.notifyDataSetChanged(); 

     } 
    }); 
Verwandte Themen