رفتن به مطلب
انجمن اندروید ایران | آموزش برنامه نویسی اندروید و موبایل
  • android.png.1fab383bc8500cd93127cebc65b1dcab.png

پست های پیشنهاد شده

سلام ، من برای ساخت Endless RecyclerView طبق این اموزش :

https://stackoverflow.com/questions/37004131/implementing-endless-recyclerview

به مشکل برخورم ، مشکلی که دارم اینه که نمیدونم ادپتر رو چطوری باید ست کنم و اطلاعات هر سطر رو بهش بدم و بصورت کلی متوجه نشدم چطور باید از این کد استفاده کنم ممنون میشم راهنمایی کنید .

لینک ارسال
به اشتراک گذاری در سایت های دیگر

ابتدا یک کلاس برای Scroll و تعداد ایتم های قابل مشاهده ایجاد کنید

public abstract class EndlessRecyclerOnScrollListener extends RecyclerView.OnScrollListener {
    public static String TAG = EndlessRecyclerOnScrollListener.class.getSimpleName();

    private int previousTotal = 0; // The total number of items in the dataset after the last load
    private boolean loading = true; // True if we are still waiting for the last set of data to load.
    private int visibleThreshold = 5; // The minimum amount of items to have below your current scroll position before loading more.
    int firstVisibleItem, visibleItemCount, totalItemCount;

    private int current_page = 1;

    private LinearLayoutManager mLinearLayoutManager;

    public EndlessRecyclerOnScrollListener(LinearLayoutManager linearLayoutManager) {
        this.mLinearLayoutManager = linearLayoutManager;
    }

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);

        visibleItemCount = recyclerView.getChildCount();
        totalItemCount = mLinearLayoutManager.getItemCount();
        firstVisibleItem = mLinearLayoutManager.findFirstVisibleItemPosition();

        if (loading) {
            if (totalItemCount > previousTotal) {
                loading = false;
                previousTotal = totalItemCount;
            }
        }
        if (!loading && (totalItemCount - visibleItemCount)
                <= (firstVisibleItem + visibleThreshold)) {
            // End has been reached

            // Do something
            current_page++;

            onLoadMore(current_page);

            loading = true;
        }
    }

    public abstract void onLoadMore(int current_page);
}

و همچنین در اکتیویتی خود کلاس فوق را فراخوانی نمایید

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

public class SampleActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sample);

        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.list);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(linearLayoutManager);
        recyclerView.setOnScrollListener(new EndlessRecyclerOnScrollListener(linearLayoutManager) {
            @Override
            public void onLoadMore(int current_page) {
                // do something...
            }
        });
    }
}

 

لینک ارسال
به اشتراک گذاری در سایت های دیگر

ممنون از پاسختون , بنده منظورم این هست ایتم های هر سطر رو کجا باید مقدار دهی کنم ؟؟ نوشتن ادپنر به صورت عادی رو بلدم ولی این کد رو متوجه نشدم 

لینک ارسال
به اشتراک گذاری در سایت های دیگر

این روش را تا انتها انجام دهید

Colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#3F51B5</color>
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
<color name="colorBlack">#000000</color>
<color name="colorWhite">#ffffff</color>
</resources>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<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"
    tools:context="com.inducesmile.androidrecyclerviewinfinitescroll.MainActivity">
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="vertical" />
</RelativeLayout>

item_list.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/card_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="16dp"
    card_view:cardCornerRadius="4dp"
    card_view:cardUseCompatPadding="true"
    card_view:cardPreventCornerOverlap="true"
    card_view:cardElevation="4dp">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
       <ImageView
           android:id="@+id/icon_image"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:src="@drawable/sideicon"
           android:layout_alignParentLeft="true"
           android:layout_marginLeft="8dp"
           android:layout_marginTop="18dp"
           android:adjustViewBounds="true"
           android:contentDescription="@string/app_name"/>
        <TextView
            android:id="@+id/title_header"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/icon_image"
            android:layout_alignBaseline="@+id/icon_image"
            android:padding="18dp"
            android:text="@string/app_name"/>
    </RelativeLayout>
</android.support.v7.widget.CardView>

progress_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ProgressBar
        android:id="@+id/progressBar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:indeterminate="true"
        style="@android:style/Widget.Holo.ProgressBar"
        android:layout_gravity="center_horizontal"/>
</LinearLayout>

RecyclerViewAdapter.java

import android.content.Context;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.List;
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewHolders> {
    private List<String> itemList;
    protected Context context;
    private int visibleThreshold = 5;
    private int lastVisibleItem, totalItemCount;
    private boolean loading;
    private OnLoadMoreListener onLoadMoreListener;
    public RecyclerViewAdapter(Context context, List<String> itemList, RecyclerView recyclerView) {
        this.itemList = itemList;
        this.context = context;
        if(recyclerView.getLayoutManager() instanceof LinearLayoutManager){
            final LinearLayoutManager linearLayoutManager = (LinearLayoutManager)recyclerView.getLayoutManager();
            recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
                @Override
                public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                    super.onScrolled(recyclerView, dx, dy);
                    totalItemCount = linearLayoutManager.getItemCount();
                    lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();
                    if(!loading && totalItemCount <= (lastVisibleItem + visibleThreshold)){
                        if(onLoadMoreListener != null){
                            onLoadMoreListener.onLoadMore();
                        }
                        loading = true;
                    }
                }
            });
        }
    }
    @Override
    public int getItemViewType(int position) {
        return itemList.get(position) != null ? 1 : 0;
    }
    @Override
    public RecyclerViewHolders onCreateViewHolder(ViewGroup parent, int viewType) {
        RecyclerViewHolders viewHolder = null;
        if(viewType == 1){
            View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list, parent, false);
            viewHolder = new RecyclerViewHolders(layoutView);
        }else{
            View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list, parent, false);
            viewHolder = new ProgressViewHolder(layoutView);
        }
        return viewHolder;
    }
    @Override
    public void onBindViewHolder(RecyclerViewHolders holder, int position) {
        if(holder instanceof RecyclerViewHolders){
            ((RecyclerViewHolders)holder).textTitle.setText(itemList.get(position));
        }else{
            ((ProgressViewHolder)holder).progressBar.setIndeterminate(true);
        }
    }
    public void setLoad(){
        loading = false;
    }
    @Override
    public int getItemCount() {
        return this.itemList.size();
    }
    public void setOnLoadMoreListener(OnLoadMoreListener onLoadMoreListener){
        this.onLoadMoreListener = onLoadMoreListener;
    }
    public interface OnLoadMoreListener {
        void onLoadMore();
    }
    public void setLoaded() {
        loading = false;
    }
}

RecyclerViewHolders.java

import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
public class RecyclerViewHolders extends RecyclerView.ViewHolder implements View.OnClickListener{
    public ImageView displayedImage;
    public TextView textTitle;
    public RecyclerViewHolders(View itemView) {
        super(itemView);
        itemView.setOnClickListener(this);
        textTitle = (TextView)itemView.findViewById(R.id.title_header);
    }
    @Override
    public void onClick(View view) {
    }
}

ProgressViewHolder.java

import android.view.View;
import android.widget.ProgressBar;
public class ProgressViewHolder extends RecyclerViewHolders{
    public ProgressBar progressBar;
    public ProgressViewHolder(View itemView) {
        super(itemView);
        progressBar = (ProgressBar)itemView.findViewById(R.id.progressBar);
    }
}

MainActivity

import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by F.Sarseify on 1/14/2017.
 */
public class MainActivity extends AppCompatActivity {
    private static final String TAG = MainActivity.class.getSimpleName();
    private RecyclerView recyclerView;
    private RecyclerViewAdapter recyclerViewAdapter;
    private LinearLayoutManager linearLayoutManager;
    private  List<String> adapterData;
    private Handler handler;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        handler = new Handler();
        linearLayoutManager = new LinearLayoutManager(MainActivity.this);
        // return the data object
        adapterData = getFirstData();
        recyclerView = (RecyclerView)findViewById(R.id.recycler_view);
        recyclerView.setLayoutManager(linearLayoutManager);
        recyclerViewAdapter = new RecyclerViewAdapter(MainActivity.this, adapterData, recyclerView);
        recyclerView.setAdapter(recyclerViewAdapter);
        recyclerViewAdapter.setOnLoadMoreListener(new RecyclerViewAdapter.OnLoadMoreListener() {
            @Override
            public void onLoadMore() {
                adapterData.add(null);
                recyclerViewAdapter.notifyItemInserted(adapterData.size() - 1);
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        adapterData.remove(adapterData.size() - 1);
                        recyclerViewAdapter.notifyItemRemoved(adapterData.size());
                        for (int i = 0; i < 15; i++) {
                            adapterData.add("Item" + (adapterData.size() + 1));
                            recyclerViewAdapter.notifyItemInserted(adapterData.size());
                        }
                        recyclerViewAdapter.setLoaded();
                    }
                }, 2000);
                System.out.println("load");
            }
        });
    }
    private List<String> getFirstData(){
        List<String> listObject = new ArrayList<String>();
        listObject.add("P30droid.com");
        listObject.add("P30droid.com");
        listObject.add("P30droid.com");
        listObject.add("P30droid.com");
        listObject.add("P30droid.com");
        listObject.add("P30droid.com");
        listObject.add("P30droid.com");
        listObject.add("P30droid.com");
        listObject.add("P30droid.com");
        listObject.add("P30droid.com");
        return listObject;
    }
}

 

 

 recyclerviewinfinitescroll.jpg.467e0fc4cf89e68a63c18850a774523f.jpg

 

 

لینک ارسال
به اشتراک گذاری در سایت های دیگر

به گفتگو بپیوندید

هم اکنون می توانید مطلب خود را ارسال نمایید و بعداً ثبت نام کنید. اگر حساب کاربری دارید، برای ارسال با حساب کاربری خود اکنون وارد شوید .

مهمان
ارسال پاسخ به این موضوع...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از 75 اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به صورت لینک

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.

  • مطالب مشابه

    • توسط scientific
      سلام ، 
      من وقتی در MainActivity یه آبجکت از کلاس مدلم می سازم و داده هام رو به پارامترهای constructor اش می فرستم تا در کلاس مدل ذخیره بشه ،
      و هم زمان اون اطلاعات رو داخل یک لیست از کلاس مدل هم ذخیره می کنم، برنامه م به محض اجرا بسته میشه
      مگر این که کد مربوط به این کار رو کامنت کنم:
      courseModelList.add(new CourseModel(image,s)); یا این که باید کد مربوط به "ست شدن آداپتر به ریسایکلرویو" رو کامنت کنم تا برنامه اجرا بشه:
      recyclerView_course_main.setAdapter(adapterRecyclerView); --------------------------------------------------------------------------------------------------------------------------
      هرکار می کنم ریسایکلرویو رو توی برنامه م نمیتونم نشون بدم
      بریک پوینت هم گذاشتم و لاگ کت رو چک کردم ولی بازم نتونستم ایرادش رو برطرف کنم

      عکسهایی از کد ها و اجرای خط به خط رو میزارم اگه راهنمایی کنید ممنون میشم:
      1-  کلاس MainActivity  متد مربوط به پر کردن لیست آرایه و ست کردن آداپتر:
      private void setupRecyclerView() { courseModelList.add(new CourseModel(image,s)); courseModelList.add(new CourseModel(image,s)); recyclerView_course_main = findViewById(R.id.recyclerView_coursemain); adapterRecyclerView = new AdapterRecyclerView(courseModelList); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); recyclerView_course_main.setLayoutManager(linearLayoutManager); recyclerView_course_main.setAdapter(adapterRecyclerView); } 2- کلاس آداپتر:
      3- کلاس مدل:
      public class CourseModel { private int cuorse_education_icon; private String course_education_title; public CourseModel(int cuorse_education_icon, String course_education_title) { this.cuorse_education_icon = cuorse_education_icon; this.course_education_title = course_education_title; } public int getCuorse_education_icon() { return cuorse_education_icon; } public String getCourse_education_title() { return course_education_title; } 4- کلاس ViewHolder
      import android.view.View; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import com.donyaeayandeh.itroducingdonyaeayandehinstitute.R; import de.hdodenhof.circleimageview.CircleImageView; public class CourseEducationViewHolder extends RecyclerView.ViewHolder { public CircleImageView course_education_image; public TextView course_education_txt; public CourseEducationViewHolder(@NonNull View itemView) { super(itemView); course_education_image = itemView.findViewById(R.id.course_education_icon); course_education_txt= itemView.findViewById(R.id.course_education_txt); } }  

    • توسط sobhan
      سلام
      من واسه فیلتربندی کتاب هام و دسته بندی کتاب هام از 2تا ریسایکلرویوو استفاده کردم یعنی یکی برای دسته ها و یکی هم برای خود کتاب ها
      و واسه اینکه روی هرکدوم از دسته بندی ها که کلیک شد کتاب های اون دسته رو نشون بده از Broadcast استفاده کردم یعنی مقدار رو از آداپتر دسته بندی ها میگیرم و میارم توی آداپتر کتاب ها
      و بعد از اینکه یه دسته رو انتخاب کرد اون ایتم هایی رو که جزو اون دسته هستند visible و بقیه gone شند
      حالا مشکل من اینجاست که وقتی توی یک دسته بندی هستم و چندتا کتاب رو اضافه میکنم، وقتی میرم توی یه دسته بندی دیگه و دوباره برمیگردم توی دسته بندی قبلی، تعدادش رو صفر نشون میده ☹️
      البته وقتی میزنم مشاهده سبدخرید (یعنی مرحله بعد)، همه چیز درسته یعنی کتاب ها و تعدادشون درست نشون میده
      این رو هم اضافه کنم که دیتاهارو از وبسرویس میگیرم و میریزم توی دیتابیس اپ و بعد از دیتابیس توی ریسایکلرویوو نمایشش میدم
      واسه هرکدوم از کتاب هایی که تعدادشون رو هم زیاد و کم میکنم توی دیتابیسم ذخیره میشه
      میشه راهش رو بهم بگین☹️
    • توسط MaHdI-09
      سلام.من یک ریسایکلرویو دارم که میخوام وقتی دیتا توش اضافه کردم.بره به آخرین position  ریسایکلرویو.

      لطفا درصورت پاسخ بفرمایید در کدام کلاس باید کد ها رو بنویسم.

      با سپاس فراوان
    • توسط Omid Zakeri
      بعضی از دوستان برای انجام onLongClick و onClick در recyclerView دچار مشکل میشن.قصد من در این آموزش انجام این اعمال در recyclerView  هستش.
      برای این کار ابتدا باید یک کلاس جداگانه بنویسیم به صورت زیر:
      public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener { private OnItemClickListener mListener; private OnItemLongClickListener mLongListener; public interface OnItemClickListener { public void onItemClick(View view, int position); } public interface OnItemLongClickListener { public void onItemClick(View view, int position); } GestureDetector mGestureDetector; public RecyclerItemClickListener(Context context, OnItemClickListener listener) { mListener = listener; mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { @Override public boolean onSingleTapUp(MotionEvent e) { return true; } }); } public RecyclerItemClickListener(Context context, OnItemLongClickListener listener) { mLongListener = listener; mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { @Override public boolean onSingleTapUp(MotionEvent e) { return true; } }); } @Override public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) { View childView = view.findChildViewUnder(e.getX(), e.getY()); if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) { mListener.onItemClick(childView, view.getChildAdapterPosition(childView)); } return false; } @Override public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) { } @Override public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { } }  
       
      بعد از اضافه کردن کلاس بالا حالا باید ازش استفاده کنیم به صورت زیر :
       
      متد onLongClick:
      recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getApplicationContext(), attachFileRecyclerView, new RecyclerTouchListener.ClickListener() { @Override public void onClick(View view, int position) { } @Override public void onLongClick(View view, final int position) { . . . } }));  
       
      متد onClick:
      recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(getApplicationContext(), new RecyclerItemClickListener.OnItemClickListener() { @Override public void onItemClick(View view, int position) { . . . } }));  
    • توسط Omid Zakeri
      RecyclerViewFastScroller یک ویجت است که می توان از آن برای پیمایش سریع استفاده کرد.

       
      RecyclerViewFastScroller-master.zip
  • فایل

×
×
  • اضافه کردن...