Страницы

Поиск по вопросам

среда, 5 декабря 2018 г.

recycler view не работает скролл [закрыт]

Добрый день, столкнулся с проблемой. Тестировал приложение ранее на 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

news = new 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()

Комментариев нет:

Отправить комментарий