Я только начал работать с Android, и у меня проблема. У меня есть Recycler View со списком тренировок, и в этом представлении я хочу создать заголовок, который будет в статическом месте независимо от прокрутки. Однако заголовок или текст не видны в линейном макете, который находится над recycler view.
Я не знаю, как решить мою проблему, у кого-нибудь есть решения или идеи?
Ниже я представляю отдельные элементы кода.
Мое мнение ресайклера:
<android.support.v7.widget.RecyclerView
xmlns:android = "http://schemas.android.com/apk/res/android"
android:id = "@+id/training_recycler"
android:scrollbars = "vertical"
android:layout_width = "match_parent"
android:layout_height = "wrap_content" />
Мой пример линейного макета
<LinearLayout 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:orientation = "vertical"
tools:context = ".TrainingFragment">
<TextView
android:id = "@+id/anything"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:textSize = "40sp"
android:text = "@string/monia"/>
</LinearLayout>
Внутри RecyclerView у меня есть вид карты, который выглядит:
<android.support.v7.widget.CardView
xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:card_view = "http://schemas.android.com/apk/res-auto"
android:id = "@+id/card_view"
android:layout_width = "match_parent"
android:layout_height = "50dp"
android:layout_margin = "15dp"
card_view:cardCornerRadius = "10dp">
<LinearLayout
android:layout_width = "match_parent"
android:layout_height = "fill_parent"
android:orientation = "vertical">
<TextView
android:id = "@+id/info_text"
android:layout_marginLeft = "15dp"
android:layout_marginBottom = "15dp"
android:layout_height = "wrap_content"
android:layout_width = "match_parent"
android:textSize = "20sp"/>
</LinearLayout>
</android.support.v7.widget.CardView>
Когда я смотрю в окно дизайна, я вижу свой textView с текстом, но когда я включаю эмулятор, TextView не отображается.
Спасибо за любые предложения.
Редактировать:
TrainingMaterialFragment.java
public class TrainingMaterialFragment extends Fragment {
RecyclerView trainingRecycler;
public TrainingMaterialFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
RecyclerView trainingRecycler = (RecyclerView)inflater.inflate(
R.layout.fragment_training_material, container, false);
int userNo = 1;
String[] nameArray = new String[0];
int[] idArray= new int[0];
try {
SQLiteOpenHelper myFitnessAppDatabaseHelper = new MyFitnessAppDatabaseHelper(inflater.getContext());
View view = inflater.inflate(R.layout.fragment_training, container, false);
SQLiteDatabase db = myFitnessAppDatabaseHelper.getReadableDatabase();
Cursor cursor = db.query("TRAINING_DIARY",
new String[]{"TRAINING_NAME", "DATE",
"DISTANCE","_id"},
"USER = ?",
new String[]{Integer.toString(userNo)},
null, null, null);
int count = cursor.getCount();
nameArray = new String[count];
idArray=new int[count];
if (cursor.moveToFirst()) {
String nameText = cursor.getString(0);
TextView name = (TextView) view.findViewById(R.id.training_name);
name.setText(nameText);
nameArray[0] = nameText;
idArray[0]=cursor.getInt(3);
int i = 1;
while(i < count) {
cursor.moveToNext();
nameText = cursor.getString(0);
nameArray[i] = nameText;
idArray[i]=cursor.getInt(3);
i++;
}
}
cursor.close();
db.close();
} catch (SQLiteException e) {
Toast toast = Toast.makeText(inflater.getContext(), "Baza danych jest niedostępna", Toast.LENGTH_SHORT);
toast.show();
}
TrainingAdapter adapter =
new TrainingAdapter(nameArray);
trainingRecycler.setAdapter(adapter);
LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
trainingRecycler.setLayoutManager(layoutManager);
adapter.setListener(new TrainingAdapter.Listener() {
public void onClick(int position) {
Intent intent = new Intent(getActivity(), TrainingDetailActivity.class);
intent.putExtra(TrainingDetailActivity.EXTRA_TRAINING, position);
getActivity().startActivity(intent);
}
});
return trainingRecycler;
}
}
Адаптер
public class TrainingAdapter extends RecyclerView.Adapter<TrainingAdapter.ViewHolder> {
private String[] captions;
private Listener listener;
public TrainingAdapter(String[] captions){
this.captions = captions;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
private CardView cardView;
public ViewHolder(CardView v) {
super(v);
cardView = v;
}
}
@Override
public TrainingAdapter.ViewHolder onCreateViewHolder(
ViewGroup parent, int viewType){
CardView cv = (CardView) LayoutInflater.from(parent.getContext())
.inflate(R.layout.training_card_view, parent, false);
return new ViewHolder(cv);
}
@Override
public void onBindViewHolder(ViewHolder holder, final int position){
CardView cardView = holder.cardView;
TextView textView = (TextView)cardView.findViewById(R.id.info_text);
textView.setText(captions[position]);
cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null) {
listener.onClick(position);
}
}
});
}
@Override
public int getItemCount(){
return captions.length;
}
public static interface Listener {
public void onClick(int position);
}
public void setListener(Listener listener) {
this.listener = listener;
}
}
Да и не работает
вы можете добавить класс и файл адаптера?
Я редактирую пост и добавляю класс и файл адаптера
Поправьте меня, если я ошибаюсь, но вы не помещаете Recycler в LinearLayout. Ваш LinearLayout должен выглядеть так, и тогда вы сможете получить то, что хотите:
<LinearLayout 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:orientation = "vertical"
tools:context = ".TrainingFragment">
<TextView
android:id = "@+id/anything"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:textSize = "40sp"
android:text = "@string/monia"/>
<android.support.v7.widget.RecyclerView
android:id = "@+id/training_recycler"
android:scrollbars = "vertical"
android:layout_width = "match_parent"
android:layout_height = "wrap_content" />
<LinearLayout/>
Linearlayout и RecyclerView есть в двух разных файлах. LinearLayout в fragment_training.xml и RecyclerView в fragment_training_materia.xml. Я попытался поместить оба в один, как вы, и получил ошибку java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to android.support.v7.widget.RecyclerView
точнее ошибка прям в этой строчке RecyclerView trainingRecycler = (RecyclerView)inflater.inflate( R.layout.fragment_training_material, container, false);
Тогда, пожалуйста, опубликуйте свой java файл
Я сделал то же самое в этом проекте. Это ссылка на файл XML https://github.com/ShowYoungg/JournalApp/blob/master/app/src/main/res/layout/activity_main.xml. и ссылку на файл java; https://github.com/ShowYoungg/JournalApp/blob/master/app/src/main/java/com/example/android/journalapp/MainActivity.java. Вы можете загрузить все приложение и запустить его, чтобы увидеть, что я помещаю не только TexView, но и кнопки и другие элементы в RecyclerView.
Попробуйте так.
As you said
LinearLayout in fragment_training.xmlso put recylerview inside linearlayout.
Ваш код fragment_training.xml станет таким, как показано ниже
<LinearLayout 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:orientation = "vertical"
tools:context = ".TrainingFragment">
<TextView
android:id = "@+id/anything"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:textSize = "40sp"
android:text = "@string/monia"/>
<android.support.v7.widget.RecyclerView
android:id = "@+id/training_recycler"
android:scrollbars = "vertical"
android:layout_width = "match_parent"
android:layout_height = "wrap_content" />
<LinearLayout/>
Затем, наконец, изменения в классе Java.
Измените эту строку
RecyclerView trainingRecycler = (RecyclerView)inflater.inflate(
R.layout.fragment_training_material, container, false);
К
View rootview = inflater.inflate(
R.layout.fragment_training, container, false);
.....
.....
return rootview;
Затем вы можете найти recylerview с помощью rootview.
trainingRecycler = rootview.findViewById(R.id.training_recycler);
и убедитесь, что добавлен return rootview.
Ваш метод OnCreateView выглядит следующим образом
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootview = inflater.inflate(
R.layout.fragment_training, container, false);
trainingRecycler = rootview.findViewById(R.id.findViewById);
.....
...
..
return rootview;
Рад помочь :)
Вы пробовали это на реальном устройстве?