3

Я пытаюсь сделать RecyclerView в своем приложении, но я не могу сделать его прокручиваемым. Здесь очень много проблем, но никакое решение не помогает мне. Я прочитал инструкцию: http://developer.android.com/training/material/lists-cards.html#RVExamples Я пытаюсь сделать это в Фрагменте. Проблема в том, что когда я пытаюсь прокрутить RecView, LayoutManager вызывает методыBindViewHolder() и getItemCount() в моем адаптере, но визуально ничего не происходит. Только на устройствах Lollipop. На 4.X и 6 Android он отлично работает. Может кто-нибудь показать мне, была ли моя ошибка? Большое спасибо!Android. Леденец. RecyclerView не прокручивает

public class SensorAdapter extends RecyclerView.Adapter<SensorAdapter.MyViewHolder>{ 

List<Sensor> data= Collections.emptyList(); 

public SensorAdapter(List<Sensor> data) { 
    L.l("SensorAdapter() Constructor", this); 
    this.data = data; 
} 

@Override 
public SensorAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    L.l("SensorAdapter() onCreateViewHolder", this); 
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.sensor_item, parent, false); 
    MyViewHolder holder = new MyViewHolder(view); 
    return holder; 
} 

@Override 
public void onBindViewHolder(MyViewHolder holder, int position) { 
    L.l("SensorAdapter() onBindViewHolder", this); 
    Sensor curSensor = data.get(position); 
    holder.textView1.setText(curSensor.getCreated()); 
    holder.textView2.setText(curSensor.getValue()); 
    holder.textView3.setText("sensor id: "+curSensor.getSensor_id()); 
} 

@Override 
public int getItemCount() { 
    L.l("SensorAdapter() getItemCount", this); 
    return data.size(); 
} 

public static class MyViewHolder extends RecyclerView.ViewHolder{ 
    TextView textView1; 
    TextView textView2; 
    TextView textView3; 
    public MyViewHolder(View itemView) { 
     super(itemView); 
     L.l("MyViewHolder() constructor", this); 
     textView1 = (TextView) itemView.findViewById(R.id.sensItemTV1); 
     textView2 = (TextView) itemView.findViewById(R.id.sensItemTV2); 
     textView3 = (TextView) itemView.findViewById(R.id.sensItemTV3); 
    } 
} 

Фрагмент:

public class SensorsFragment extends Fragment implements AdapterView.OnItemClickListener { 

private final String types[] = {"SOLAR","HUMIDITY","TEMPERATURE","WINDSPEED","CHARGE","PRESSURE","HUMIDITY_15", "HUMIDITY_65"}; 
private Spinner spinner; 
private RecyclerView recyclerView; 
private Button from, to; 
private List<Sensor> temp; 
private static List<Sensor> sensorList; 
private String result; 
private TypeToken<List<Sensor>> tokenSensor; 
private static Sensor curSensor; 
private static String zone_id; 
private SensorAdapter sensorAdapter; 
private View layout; 

public SensorsFragment() {} 

public static SensorsFragment newInstance(String zoneId){ 
    SensorsFragment.zone_id=zoneId; 
    return new SensorsFragment(); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    L.l("onCreateView()", this); 
    layout = inflater.inflate(R.layout.fragment_sensos, container, false); 
    return layout; 
} 


@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    L.l("onActivityCreated", this); 
    initViews(); 
    showRecyclerViews(getSensorsfromServer()); 
} 

private void initViews(){ 
    L.l("initViews()", this); 
    from = (Button) getActivity().findViewById(R.id.dateFrom); 
    to = (Button) getActivity().findViewById(R.id.dateTo); 
} 

private void prepareSpinner(){ 
    L.l("prepareSpinner()", this); 
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), R.layout.snipper_item, types); 
    adapter.setDropDownViewResource(R.layout.snipper_item); 
    spinner = (Spinner) getActivity().findViewById(R.id.spinner2); 
    spinner.setAdapter(adapter); 
    spinner.setPrompt("Select type os sensors"); 
    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parent, View view, 
            int position, long id) { 
      String filtername = types[position].toLowerCase(); 
      L.l("filtername = "+filtername); 
      temp = new ArrayList<>(); 
      for(Sensor sensor: sensorList){ 
       if(sensor.getType().equals(filtername)){ 
        temp.add(sensor); 
       } 
      } 
      Log.d(LoginActivity.LOG, " temp.size() = " + temp.size()); 
      //showRecyclerViews(temp); 
     } 

     @Override 
     public void onNothingSelected(AdapterView<?> arg0) { 
     } 
    }); 
} 

public List<Sensor> getSensorsfromServer() { 
    L.l("getSensorsfromServer()", this); 
    tokenSensor = new TypeToken<List<Sensor>>() {}; 
    try { 
     result = new MyDownTask("sensors/get",zone_id, getActivity()).execute().get(); 
     sensorList = gson.fromJson(result, tokenSensor.getType()); 
     if(sensorList==null) throw new Exception("sensorList==null"); 
     L.l("sensorList.size() = "+sensorList.size(), this); 
     return sensorList; 

    } catch (Exception e) { 
     e.printStackTrace(); 
     Toast.makeText(getActivity(), "No data... :(", Toast.LENGTH_SHORT).show(); 
     commitFragment(FieldsFragment.newInstance(),getFragmentManager()); 
     return new ArrayList<>(); 
    } 
} 

@Override 
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
     curSensor = sensorList.get(i); 
     Log.d(LoginActivity.LOG, "ActivityListView. onItemClick. curSensor = " + curSensor + " isSensorListVisible = "); 
     Intent intent = new Intent(getActivity(), DetailsActivity.class); 
     startActivity(intent); 
} 

private void showRecyclerViews(List<Sensor> sensors){ 
    recyclerView = (RecyclerView) getActivity().findViewById(R.id.sensorsRecyclerView); 
    recyclerView.setHasFixedSize(true); 
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 
    sensorAdapter = new SensorAdapter(sensors); 
    recyclerView.setAdapter(sensorAdapter); 
} 

} fragment_sensos.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="@drawable/mobile_screen_1" 
tools:context="ua.kiev.netmaster.agro.fragments.SensorsFragment"> 

<LinearLayout 
    android:id="@+id/linearLayout" 
    android:layout_width="match_parent" 
    android:layout_height="50dp" 
    android:layout_alignParentStart="true" 
    android:layout_alignParentTop="true" 
    android:orientation="horizontal" 
    android:visibility="gone"> 

    <Spinner 
     android:id="@+id/spinner2" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_margin="3dp" 
     android:background="@drawable/ripple" 
     android:contextClickable="false" 
     android:textColor="#ffffff" 
     android:visibility="visible" /> 

    <Button 
     android:id="@+id/dateFrom" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_margin="3dp" 
     android:layout_weight="1" 
     android:background="@drawable/ripple" 
     android:text="от" 
     android:textColor="#FFF" 
     android:textSize="10dp" 
     android:visibility="visible" /> 

    <Button 
     android:id="@+id/dateTo" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_margin="3dp" 
     android:layout_weight="1" 
     android:background="@drawable/ripple" 
     android:text="до" 
     android:textColor="#FFF" 
     android:textSize="10dp" 
     android:visibility="visible" /> 
</LinearLayout> 

<FrameLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_below="@+id/linearLayout"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/sensorsRecyclerView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:scrollbars="vertical" /> 
</FrameLayout> 

Интересное наблюдение. Когда я просматриваю свой RecyclerView, на программном уровне его действительно прокрутка! потому что если я нажимаю на элемент - он показывает (в другом фрагменте) элемент, который находится в нижней части списка! И когда я нажимаю «Назад», верните меня в SCROLLED RecyclerView !!! Я думаю, это означает, что проблема находится рядом с Менеджером макета и конкретно в Item Decorator или Item Animator.

Я все еще пытаюсь решить свою проблему и посмотреть исходный код ListView (package android.widget.ListView.java) И я нашел неудачный импорт. Например:

import com.google.android.collect.Lists; 
import android.util.MathUtils; 
import android.view.ViewRootImpl; 

... и многие другие в других * .java-файлах. Может ли это быть связано с потерей функциональности этих компонентов? И как я могу исправить эту проблему? Помоги мне, пожалуйста.

+0

попытаться удалить рамку? – Fabian

ответ

-1

Попробуйте удалить FrameLayout.

+0

все сделано раньше. Я попытался с LinearLayout и без макета (в корне RelativeLayout), но никакого эффекта. –

0

Добавьте этот кусок линии в свой RecyclerView, он, надеюсь, будет работать.

 app:layout_behavior="@string/appbar_scrolling_view_behavior" 
+0

Пробовал. Нет эффекта. Благодарю. –

2

В вашем фрагменте вы реализовать AdapterView.OnItemClick я уже испытал эту проблему с помощью щелчка событие так, как вы используете.

Поскольку вы используете RecyclerView, вам нужно добавить сенсорный прослушиватель в RecyclerView. В противном случае вы можете потерять функцию прокрутки.

This StackOverflow answer - лучшее решение для получения обратной связи с товаром при использовании RecyclerView.

+0

Я пробовал сделать это. Но я не понимаю, что мне делать в методе onInterceptTouchEvent() (или в каком-то другом методе?), Чтобы обеспечить прокрутку. Насколько я понимаю, метод onBindViewHolder() в адаптере должен реализовывать изменение данных в ViewHolders. Теперь, когда я пытаюсь прокручивать в дополнение к вызову getItemCount() и onBindViewHolder(), вызывает вызовы onInterceptTouchEvent(); Но прокрутка еще не работает. –

+0

Извините, что опоздал, но вот мы идем. Чтобы получить прокрутку, вы должны ничего не делать, кроме добавления RecyclerView.См Мои ниже onInterceptTouchEvent() '@Override общественного логический onInterceptTouchEvent (RecyclerView зрения, MotionEvent е) { Посмотреть childView = view.findChildViewUnder (e.getX(), e.getY()); if (childView! = Null && mGestureDetector.onTouchEvent (e)) { // handle click here return true; } return false; } ' Обратите внимание, что я возвращаю false, если этот жест не является кликом. Таким образом, событие не потребляется приёмником прослушивания. –

Смежные вопросы