【问题标题】:Android. Lollipop. RecyclerView doesn't scroll安卓。棒糖。 RecyclerView 不滚动
【发布时间】:2016-01-15 17:30:15
【问题描述】:

我正在尝试在我的应用程序中创建一个 RecyclerView,但我无法使其可滚动。这里讨论了很多相同的问题,但没有解决方案可以帮助我。 我阅读了手册: http://developer.android.com/training/material/lists-cards.html#RVExamples 我尝试在片段中做到这一点。问题是当我尝试滚动 RecView 时,LayoutManager 在我的适配器中调用 onBindViewHolder() 和 getItemCount() 方法,但视觉上没有任何反应。仅在棒棒糖设备上。在 4.X 和 6 Android 上运行良好。 有人可以告诉我是我的错吗? 非常感谢!

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 时,在程序级别它真的滚动!因为如果我点击项目 - 它显示(在其他片段中)项目位于列表的底部!当我按“返回”时,它会返回到 SCROLED RecyclerView !!!我认为这意味着问题出在布局管理器附近,具体在 Item Decorator 或 Item Animator 中。

我仍在尝试解决我的问题,并查看 ListView 的源代码(包 android.widget.ListView.java),我发现导入失败。例如:

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

...以及其他 *.java 文件中的许多其他内容。 它会与这些组件的功能丧失有关吗?我该如何解决这个问题?请帮帮我。

【问题讨论】:

  • 尝试删除框架布局?

标签: android android-fragments android-recyclerview scrollable


【解决方案1】:

在您的片段中,您正在实现AdapterView.OnItemClick 我已经以您使用的方式使用点击事件遇到了这个问题。

当您使用 RecyclerView 时,您需要向 RecyclerView 添加一个触摸侦听器。否则你可能会失去滚动功能

This StackOverflow answer 在使用 RecyclerView 时提供了更好的获取项目反馈的解决方案。

【讨论】:

  • 我试过这样做。但我不明白我应该在 onInterceptTouchEvent() 方法(或其他方法?)中做什么来提供滚动。据我了解,适配器中的 onBindViewHolder() 方法必须实现 ViewHolders 中的数据更改。现在,当我尝试滚动时,除了调用 getItemCount() 和 onBindViewHolder() 应用程序也会调用 onInterceptTouchEvent() 方法;但是滚动还不行。
  • 很抱歉迟到了,我们开始吧。要使滚动正常工作,您只需添加 RecyclerView。请参阅下面的 onInterceptTouchEvent() @Override public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) { View childView = view.findChildViewUnder(e.getX(), e.getY()); if (childView != null &amp;&amp; mGestureDetector.onTouchEvent(e)) { // handle click here return true; } return false; } 请注意,如果手势不是单击,我将返回 false。这样,触摸侦听器就不会消耗该事件。
【解决方案2】:

在你的 RecyclerView 中添加这行代码,希望它会起作用。

     app:layout_behavior="@string/appbar_scrolling_view_behavior"

【讨论】:

  • 试过了。没有效果。谢谢。
【解决方案3】:

尝试删除FrameLayout

【讨论】:

  • 之前已经完成了。我尝试了 LinearLayout 并且没有布局(在根 RelativeLayout 中)但没有效果。
猜你喜欢
  • 2015-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-19
  • 1970-01-01
  • 1970-01-01
  • 2016-05-02
  • 2015-01-25
相关资源
最近更新 更多