Страницы

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

пятница, 27 декабря 2019 г.

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

#android #recyclerview


        
             
                
                    
                        
                            Закрыт. Этот вопрос не по теме. Ответы на него в данный
момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Update the question so it's
on-topic for Stack Overflow на русском.
                        
                        Закрыт 4 года назад.
                                                                                
           
                
        
Добрый день, столкнулся с проблемой. Тестировал приложение ранее на 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, что привело к тому, что экран вообще не реагироввал на мои жесты. В итоге я убрал все касающееся страницы продукта в разметку страницы продукта, и получил свою порцию счастья :) сем спасибо за участие и советы, а мне минус в карму, за то, что попытался вырвать задачу из контекста, который важен для её понимания.


Ответы

Ответ 1



Согласно en-SO на некоторых девайсах система несколько изменена и косячит. Решить сие можно грязным хаком - переопределением "неработающего" виджета и изменения некоторых методов. В частности, в вопросе по ссылке в логах была ошибка в методе scrollTo(). Засим посмотрите как по ссылке изменили этого метод, может помочь. Кратко - в методе не вызывают super.onScrollTo()

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

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