آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
مشکل عدم دسترسی خریداران پیشین به برخی آموزش ها برطرف شد
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

کیا با recyclerView کار کردن؟

حمید زمانی  9 سال پیش  9 سال پیش
+1 0

کیا با recyclerView کار کردن؟
به یه مشکل عجیب برخوردم توش نمی دونم چیجوری توضیح بدم ، اگه کسی کار کرده بگه

0 0
اوووووف هیشکی کار نمیکنه؟ (9 سال پیش)
0 0
مشکلتون چیه؟ (9 سال پیش)
+1 0
ای بابا...کلافه شدیم بخدا با این اسپم کیلر لعنتی (9 سال پیش)
0 0
مشکلم اینه که وقتی لیست رو ساختم و دارم تست میکنم ، در حالی که اسکرول می کنم میبینم یه آیتم جلو چشام مقدارش عوض میشه ، با اسکرول مقدار یه آیتم دیگرو به خودش میگیره (9 سال پیش)
 برای این سوال 4 پاسخ وجود دارد.
پاسخ به سوال 
حمید زمانی  9 سال پیش
0 0

 Adapter :
public class AdapterList extends RecyclerView.Adapter<AdapterList.ViewHolder> {
Item[] itemsStatic;

public AdapterList(ArrayList<Item> it) {
itemsStatic = new Item[it.size()];
for(int i=0; i<it.size(); i++){
itemsStatic[i] = it.get(i);
}
}

//a Reference to Views
public static class ViewHolder extends RecyclerView.ViewHolder{
public static TextView txtItem;
public static ImageView imgItem;
public static LinearLayout lnlItem;
public ViewHolder(View v){
super(v);
txtItem = (TextView) v.findViewById(R.id.txt_item);
imgItem = (ImageView) v.findViewById(R.id.img_item);
lnlItem = (LinearLayout) v.findViewById(R.id.lnl_item);
}
}

//Create new views
@Override
public AdapterList.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_item,viewGroup,false);
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}

//Replace Content Of a View
@Override
public void onBindViewHolder(AdapterList.ViewHolder viewHolder, final int i) {
viewHolder.txtItem.setText(itemsStatic[i].title);
viewHolder.imgItem.setImageResource(G.c.getResources().getIdentifier(itemsStatic[i].image,"drawable",G.c.getPackageName()));
}

@Override
public int getItemCount() {
return itemsStatic.length;
}
}

Activity :

RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
RecyclerView.Adapter adapter = new AdapterList(G.items);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(adapter);

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=".MainActivity"
android:background="#e0e0e0">

<include
android:id="@+id/tool_bar"
layout="@layout/tool_bar"
android:layout_height="wrap_content"
android:layout_width="match_parent" />

<android.support.v7.widget.RecyclerView
android:layout_below="@+id/tool_bar"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scrollbars="vertical"
android:id="@+id/recycler_view" />

<ImageButton
android:id="@+id/fab_image_button"
android:layout_width="@dimen/fab_button_diameter"
android:layout_height="@dimen/fab_button_diameter"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentBottom="true"
android:layout_marginBottom="@dimen/fab_button_margin_bottom"
android:layout_marginLeft="@dimen/fab_button_margin_right"
android:background="@drawable/fab_shape"
android:src="@drawable/fab_ic_add"
android:tint="@android:color/white"/>
</RelativeLayout>

build.gradle :
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.android.support:appcompat-v7:21.0.3'
compile 'com.android.support:recyclerview-v7:21.0.3'
compile 'com.android.support:cardview-v7:21.0.3'
}
+1 0
تنها موردی که به چشمم خورد اون static هایی هست که موقع تعریف View ها نوشتی؛ دلیلی نمی بینم که static باشن (البته شاید شما دلیلی دارید براشون). بقیه موارد به نظر درسته. (9 سال پیش)
0 0
نه والا خواستم تست کنم ببینم با استاتیک درست میشه یا نه (9 سال پیش)
+3 0
مشکل شما از استاتیک هاست، هیچ کدوم از ویو هاتون و حتی itemStatic رو نباید به صورت استاتیک استفاده کنید. و در onBindViewHolder چک کنید اگر مقادیر لیستتون خالی بود تکست ویو و یا ایمیج ویو رو خالی نشون بدید. دیگه مشکلی نباید داشته باشه. (9 سال پیش)
0 0
اول داینامیک گذاشتم ولی مشکل حل نشد (9 سال پیش)
پاسخ به سوال 
حمید زمانی  9 سال پیش
0 0

 public class AdapterList extends RecyclerView.Adapter<AdapterList.ViewHolder> {
ArrayList<Note> items;

public AdapterList(ArrayList<Note> items) {
this.items = items;
}

//a Reference to Views
public static class ViewHolder extends RecyclerView.ViewHolder{
public static TextView txtTitle;
public static TextView txtText;
public ViewHolder(View v){
super(v);
txtTitle = (TextView) v.findViewById(R.id.txt_title);
txtText = (TextView) v.findViewById(R.id.txt_text);
}
}

//Create new views
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.layout,viewGroup,false);
return new ViewHolder(view);
}

//Replace Content Of a View
@Override
public void onBindViewHolder(AdapterList.ViewHolder viewHolder, final int i) {
Note n = items.get(i);
if(n.title == null){
viewHolder.txtTitle.setText("");
}else{
viewHolder.txtTitle.setText(n.title);
}

if(n.text == null){
viewHolder.txtText.setText("");
}else{
viewHolder.txtText.setText(n.text);
}
}

@Override
public int getItemCount() {
return items.size();
}
}

اینم با آرایه ی داینامیک ولی همون مشکل هنوز پا برجاست.

پاسخ به سوال 
احسان منصوری  9 سال پیش
+4 0

ببینید، من از این کد استفاده میکنم. مشکلی هم ندارم.

کد اداپتر:

 public class AdapterRecyclerView extends RecyclerView.Adapter<AdapterRecyclerView.viewHolder>{
    Context context;
    private LayoutInflater inflater;
    public AdapterRecyclerView(Context context, List<Information> data){
        inflater=LayoutInflater.from(context);
        G.recyclerList= (java.util.ArrayList<Information>) data;
    }

    @Override
    public viewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
       View view = inflater.inflate(R.layout.adapter_recycler, parent, false);
        viewHolder holder = new viewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(viewHolder holder, final int position) {

        final LocationManager manager = (LocationManager) G.context.getSystemService(Context.LOCATION_SERVICE);

        Information current = G.recyclerList.get(position);
        holder.title.setText(current.p_uname);
        holder.desc.setText(current.p_desc);
        String url = current.p_logo;
        Log.e("LOG", "URL_IMAGE_UNIVERSAL: " + url);
        
        holder.btnProfile.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        });

        holder.btnRouting.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               
            }
        });
    }


    @Override
    public int getItemCount() {
        return G.recyclerList.size();
    }

    class viewHolder extends RecyclerView.ViewHolder{
        TextView title;
        TextView desc;
        FrameLayout btnProfile;
        FrameLayout btnRouting;
        ImageView image;



        public viewHolder(View itemView) {
                super(itemView);
                title = (TextView) itemView.findViewById(R.id.txtTitle);
                desc = (TextView) itemView.findViewById(R.id.txtDesc);
                btnProfile = (FrameLayout) itemView.findViewById(R.id.btnProfile);
                btnRouting = (FrameLayout) itemView.findViewById(R.id.btnRouting);
                image = (ImageView) itemView.findViewById(R.id.imageView);


        }
    }
}

اینم کدی هست که اطلاعات رو از سرور میگیرم و با اداپتر RecyclerView ست میکنم:

توی onCreate:

  recyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
        LinearLayoutManager layoutManager = new LinearLayoutManager(G.context);
        recyclerView.setLayoutManager(layoutManager);

اینم AsyncTask برای دریافت اطلاعات از سرور:

   public class asyncRecyclerview extends AsyncTask<Void, Void, List<Information>> {

        protected void onPreExecute() {
            super.onPreExecute();
            dialog3 = ProgressDialog.show(G.currentActivity, "", "در حال بارگزاری...", true);
        }

        @Override
        protected List<Information> doInBackground(Void... params) {


            //Read URL For Receive Json Code
            String result = Webservice.readUrl(url);
            Log.i("LOG", "URLRESULT: "+ result);
            if (result != null) {
                try {
                    G.recyclerList.clear();
                    JSONArray jsonurl = new JSONArray(result);
                    for (int i = 0; i < jsonurl.length(); i++) {
                        JSONObject object = jsonurl.getJSONObject(i);
                        Information url = new Information();
                        String img_url = object.getString("p_logo");
                        url.p_logo = (G.ip + "images/" + img_url);
                        url.p_uname = object.getString("p_uname");
                        url.p_desc = object.getString("p_desc");
                        url.p_uid = object.getInt("p_uid");

                        G.recyclerList.add(url);
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
            return G.recyclerList;
        }

        @Override
        protected void onPostExecute(List<Information> result) {
            super.onPostExecute(result);
            //tarif va meghdar dehie RecyclerView

            adapter = new AdapterRecyclerView(G.context, result);
            recyclerView.setAdapter(adapter);
            recyclerView.setLayoutManager(new LinearLayoutManager(G.context));
            recyclerView.setLayoutManager(new LinearLayoutManager(G.currentActivity, LinearLayoutManager.HORIZONTAL, false));
            //end
            dialog3.dismiss();
        }

    }

و در آخر هم Async رو داخل onCreate اجرا میکنید

  new asyncRecyclerview().execute();

اینی که نوشتم به نظرم راحتترین روش پیاده سازی RecyclerView بود. 

0 0
والا جواب بده نیست ، همون مشکل رو دارم. (9 سال پیش)
پاسخ به سوال 
حمید زمانی  9 سال پیش
+2 0

مشکل پیدا شد :

همونطوری که آقای Hajhosseini فرموده بودند هیچکدام از ویو ها نباید استاتیک باشه و با تغییر کلاس ViewHolder به کد زیر مشکل حل شد ، از همه دوستان تشکر میکنم ، مخصوصا حسین احمدی (CodeMaster) که تلفنی راهنماییم کرد.

    public class ViewHolder extends RecyclerView.ViewHolder{
TextView txtItem;
ImageView imgItem;
LinearLayout lnlItem;

public ViewHolder(View v){
super(v);
txtItem = (TextView) v.findViewById(R.id.txt_item);
imgItem = (ImageView) v.findViewById(R.id.img_item);
lnlItem = (LinearLayout) v.findViewById(R.id.lnl_item);
}
}

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .