Добрый день, столкнулся с проблемой. Тестировал приложение ранее на genymotion (nexus 4 android api 16), samsung gs iv (api 21), samsung gs iii (api 16), nexus 9 (api 23). На каждом устройстве все работает нормально, решил запустить на попавшем в руки самсунге gt-i8262 (api 16), почему то не работает скролл во всех RecyclerView. Разметки разные, в большинстве разметок корневой и единственный элемент это recyclerview, не вижу вообще возможностей проблемы, тем не менее скролл не работает. Никто не сталкивался с такой проблемой?
Для примера привожу код, разметка такая
Фрагмент, в котором используется разметка (выбрал самый не большой, котором есть все, и адаптер, и холдер и управление ресайклером).
public class NewsFragment extends Fragment {
int currentLastArticle = 0;
int count;
ArrayList
View view;
RecyclerView rv;
LinearLayoutManager llm;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
view = inflater.inflate(R.layout.recycler_view, container, false);
rv = (RecyclerView) view.findViewById(R.id.recycler);
llm = new LinearLayoutManager(activity);
rv.setLayoutManager(llm);
rv.addItemDecoration(new Divider(getActivity()));
rv.setOnScrollListener(new EndlessRecyclerScrollListener(llm) {
@Override
public void onLoadMore(int current_page) {
new GetNewsTask().execute(20, currentLastArticle+=20);
}
});
new GetNewsTask().execute(20, currentLastArticle);
return view;
}
class NewsRecyclerAdapter extends RecyclerView.Adapter
LayoutInflater inflater;
public NewsRecyclerAdapter(Context context) {
inflater = ((AppCompatActivity)context).getLayoutInflater();
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new NewsVH(inflater.inflate(R.layout.news_item, parent, false));
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
((NewsVH)holder).set(position);
}
@Override
public int getItemCount() {
return news.size();
}
private class NewsVH extends RecyclerView.ViewHolder{
Text title;
Text time;
ImageView image;
View itemView;
public NewsVH(View itemView) {
super(itemView);
this.itemView = itemView;
itemView.setPadding(
Decorator.getWidthBasedOnIPhone640(8),
Decorator.getHeightBasedOnIPhone960(8),
Decorator.getWidthBasedOnIPhone640(8),
Decorator.getHeightBasedOnIPhone960(8)
);
init(itemView);
}
private void init(View view) {
title = (Text) view.findViewById(R.id.title);
title.setTextSize(TypedValue.COMPLEX_UNIT_PX, Decorator.getHeightBasedOnIPhone960(24));
Decorator.setMargins(title, 0, 8, 0, 0);
time = (Text) view.findViewById(R.id.time);
time.setTextSize(TypedValue.COMPLEX_UNIT_PX, Decorator.getHeightBasedOnIPhone960(20));
time.setTextStyle(font.font133l);
image = (ImageView) view.findViewById(R.id.image);
image.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
Decorator.setSquareSizeAndMargins(image, 176, 0, 0, 8, 8);
}
public void set(final int position) {
Article article = news.get(position);
title.setText(article.title());
time.setText(article.time());
String image = article.files().length == 0 ? "null" : article.files()[0].url480();
ImageLoader.getInstance().displayImage(image, this.image, Decorator.getImageOptions(svg.zelen.drawable()));
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ArticleFragment fragment = new ArticleFragment();
Bundle bundle = new Bundle();
bundle.putParcelable(getString(R.string.article), news.get(position));
fragment.setArguments(bundle);
activity.getSupportFragmentManager()
.beginTransaction()
.addToBackStack(Flags.CATALOG_BACKSTACK)
.replace(R.id.container, fragment, fragment.getClass().getCanonicalName())
.commit();
}
});
}
}
}
class GetNewsTask extends AsyncTask
int lowTreshold;
int highTreshold;
@Override
protected void onPreExecute() {
((ProgressSwitcher)activity).showProgress();
}
@Override
protected JSONArray doInBackground(Integer... params) {
lowTreshold = params[1];
highTreshold = params[0];
String newsString = Web.httpGet(
Web.url.domain +
Web.url.content +
"/" +
highTreshold +
"/" +
lowTreshold
);
JSONArray jNewsArray = new JSONArray();
try {
JSONObject jNews = new JSONObject(newsString);
jNewsArray = jNews.getJSONArray("content");
count = jNews.getInt("count");
} catch (JSONException e) {
e.printStackTrace();
}
return jNewsArray;
}
@Override
protected void onPostExecute(JSONArray jArray) {
((ProgressSwitcher)activity).hideProgress();
int length = jArray.length();
for (int i = 0; i < length; i++) {
try {
news.add(new Article(jArray.getJSONObject(i)));
} catch (JSONException e) {
e.printStackTrace();
}
}
if (rv.getAdapter() == null) {
rv.setAdapter(new NewsRecyclerAdapter(activity));
} else {
rv.getAdapter().notifyDataSetChanged();
}
}
}
}
EDIT:
Вчера ночью порешал проблему. Проблема была в вымученном дизайне и давней попытке решить один баг. У меня есть DrawerLayout, в котором при нажатии на итемы NavigationDrawer открываются фрагменты. В одном из фрагментов я должен был реализовать табы (фрагмент - страинца продукта, в табах комментарии, либо описание продукта), содержимое таба открывалось в отдельном контейнере. Как то раз решая баг я дошел до того, что в DrawerLayout поместил основной контейнер для фрагментов и контейнер для табов в скроллвью, высоту которого (и фрагмента в нем) задавал жестко и динамически (исходя из размеров девайса), чтобы скроллвью не скроллился кроме того единственного случая, когда мы видим содержимое таба. В результате на последнем самсунге я поймал баг той функции, которая считала высоту скроллвью, потому что достаточно было одного лишнего пикселя, чтобы он стал свободно болтаться, и получил у себя в приложении скроллящиеся View (RecyclerView) внутри сввободно плавающего ScrollView, что привело к тому, что экран вообще не реагироввал на мои жесты. В итоге я убрал все касающееся страницы продукта в разметку страницы продукта, и получил свою порцию счастья :) сем спасибо за участие и советы, а мне минус в карму, за то, что попытался вырвать задачу из контекста, который важен для её понимания.
Ответ
Согласно en-SO на некоторых девайсах система несколько изменена и косячит. Решить сие можно грязным хаком - переопределением "неработающего" виджета и изменения некоторых методов. В частности, в вопросе по ссылке в логах была ошибка в методе scrollTo(). Засим посмотрите как по ссылке изменили этого метод, может помочь. Кратко - в методе не вызывают super.onScrollTo()
Комментариев нет:
Отправить комментарий